Использовать политику создания в CloudFormation для EC2 - PullRequest
1 голос
/ 10 июля 2019

У меня есть шаблон CloudFormation, где я устанавливаю logstash на экземпляр EC2.

По умолчанию сценарии пользовательских данных выполняются один раз при запуске экземпляра. Поэтому я настроил cfn-hup для выполнения определенного configSet, когда файл конфигурации или что-то обновляется в шаблоне CloudFormation. Кажется, все в порядке.

Это важный фрагмент моего шаблона.

  LogstashInstance:
    Type: AWS::EC2::Instance
    Properties:
      ...
      UserData:
        Fn::Base64: !Sub |
          #!/bin/bash
          /opt/aws/bin/cfn-init -v --stack ${AWS::StackId} --resource LogstashInstance --region ${AWS::Region} --configsets default
          /opt/aws/bin/cfn-signal -e $? --stack ${AWS::StackId} --resource LogstashInstance --region ${AWS::Region}
    Metadata:
      AWS::CloudFormation::Init:
        configSets:
          # These scripts will run during the instance launch triggered by the userData
          default:
            - 01_xx
            - 02_xx
            - 03_xx
            - 04_xx
          # These scripts will run during an update of the instance metadata = stack update.
          UpdateEnvironment:
            - 03_xx
            - 04_xx
        01_setup_cfn_hup:
          files:
            '/etc/cfn/cfn-hup.conf':
              content: !Sub |
                [main]
                stack=${AWS::StackId}
                region=${AWS::Region}
                interval=1
              mode: '000400'
              owner: root
              group: root
            '/etc/cfn/hooks.d/logastash-auto-reloader.conf':
              content: !Sub |
                [cfn-auto-reloader-hook]
                triggers=post.update
                path=Resources.LogstashInstance.Metadata.AWS::CloudFormation::Init
                action=/opt/aws/bin/cfn-init -v --stack ${AWS::StackId} --resource LogstashInstance --region ${AWS::Region} --configsets UpdateEnvironment
                runas=root
              mode: '000400'
              owner: root
              group: root
            '/lib/systemd/system/cfn-hup.service':
              content: |
                [Unit]
                Description=cfn-hup daemon
                [Service]
                Type=simple
                ExecStart=/opt/aws/bin/cfn-hup
                Restart=always
                [Install]
                WantedBy=multi-user.target
          commands:
            01_enable_cfn_hup:
              command: systemctl enable cfn-hup.service
            02_start_cfn_hup:
              command: systemctl start cfn-hup.service

Теперь моя проблема в том, что может пройти некоторое время, прежде чем все наборы настроек будут выполнены, но в консоли CloudFormation обновление стека завершается, прежде чем даже узнать, прошло ли обновление хорошо.

Я хочу использовать creationPolicy, поэтому обновление моего стека в облачной информации будет успешным только после того, как все будет завершено (поэтому все команды и обновления файлов инициируются cfn-hup).

Я добавил создание политики:

CreationPolicy:
  ResourceSignal:
    Count: 1
    Timeout: PT15M

Я добавил cfn-signal в свои пользовательские данные:

/opt/aws/bin/cfn-signal -e $? --stack ${AWS::StackId} --resource LogstashInstance --region ${AWS::Region}

Но это будет выполнено только во время запуска экземпляра. Как я могу реализовать cfn-signal в моей конфигурации cfn-hup, чтобы он возвращал сигналы, когда обновление происходило без запуска нового экземпляра.

1 Ответ

0 голосов
/ 11 июля 2019

Я бы предложил поместить ваш экземпляр EC2 в ASG с требуемой емкостью 1 и воспользоваться атрибутом UpdatePolicy. Кроме того, вы получите возможность самовосстановления из коробки. Подробнее о UpdatePolicy

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...