问题描述
我有执行docker-compose pull and up的ec2 userData脚本。
我想运行“ aws cloudformation update-stack”并加载新的docker映像。 每次$ {imageTag}属性发生更改。
这是我的cloudformation实例yml:
myInstance:
Type: 'AWS::EC2::Instance'
Metadata:
'AWS::CloudFormation::Init':
configSets:
configs:
- "configDockers"
- "configOther"
configDocker:
commands:
a:
command: 'echo -e IMAGE_TAG=${imageTag} >> .env'
b:
command: 'docker-compose pull'
c:
command: 'docker-compose up'
Properties:
UserData:
Fn::Base64:
!Sub |
runcmd:
- /opt/aws/bin/cfn-init -v --stack ${AWS::StackName} --resource myInstance --region ${AWS::Region} -c configs
- /opt/aws/bin/cfn-signal -e $? --stack ${AWS::StackName} --resource myInstance --region ${AWS::Region}
我尝试添加“ docker-compose down”,删除UserData脚本中的旧图像,并添加cloud_final_modules以在每次启动时运行UserData:
myInstance:
Type: 'AWS::EC2::Instance'
Metadata:
'AWS::CloudFormation::Init':
configSets:
configs:
- "configDockers"
- "configOther"
configDocker:
commands:
a:
command: 'echo -e IMAGE_TAG=${imageTag} >> .env'
b:
command: 'docker-compose down'
c:
command: 'docker images -q | xargs -r sudo docker rmi'
d:
command: 'docker-compose pull'
e:
command: 'docker-compose up'
Properties:
UserData:
Fn::Base64:
!Sub |
#cloud-config
cloud_final_modules:
- [scripts-user,always]
runcmd:
- /opt/aws/bin/cfn-init -v --stack ${AWS::StackName} --resource myInstance --region ${AWS::Region} -c configs
- /opt/aws/bin/cfn-signal -e $? --stack ${AWS::StackName} --resource myInstance --region ${AWS::Region}
但是在“ aws cloudformation update-stack”之后,尽管imageTag更改了,但脚本没有再次运行。仅当我在runcmd下更改一些值时,它才会运行。
每次“ aws cloudformation update-stack”运行(每次imageTag更改)时,如何运行UserData脚本?
如何仅在首次启动时运行某些UserData命令,每次重新启动时运行其他命令,在停止实例上运行其他命令?
例如:我只想在实例停止时运行“ docker-compose down” ,但其他命令命令:在每次重启或“ aws”实例上运行“ docker-compose pull / up” cloudformation update-stack” 和一些初始命令仅在首次设置时。
解决方法
如何仅在首次启动时运行某些UserData命令,每次重新启动时运行其他命令,在停止实例上运行其他命令?
不能。 reduce
仅在实例启动时运行,而不在重新启动,启动或停止时运行(以下提到的一个例外)。为此,您必须自己实现所有这些功能。
通常通过定义custom systemd unit文件来完成。因此,您将不得不为docker-compose创建此类单位文件。
唯一的例外是一种颇为骇人听闻的方式,它是在最近的AWS博客文章中描述的在实例开始时运行用户数据的方式: