У меня есть шаблон 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
, чтобы он возвращал сигналы, когда обновление происходило без запуска нового экземпляра.