【发布时间】:2021-01-16 10:05:25
【问题描述】:
我有执行 docker-compose pull 和 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”仅在实例停止时,但其他命令命令:“docker-compose pull/up”在每次实例重启或“aws”时cloudformation update-stack" 和一些初始命令仅在首次设置时。
【问题讨论】:
-
UserData的格式是什么?你有cloud_final_modules或runcmd的参考吗?
标签: amazon-web-services amazon-ec2 amazon-cloudformation user-data