如何 运行 ec2 UserData 脚本更新 cloudformation

How to run ec2 UserData script on cloudformation update

我有执行 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 发生了变化,脚本并没有再次 运行。它 运行 仅当我在 运行cmd.

下更改某些值时

如何在每次“aws cloudformation update-stack”运行ning(每次 imageTag 更改)时 运行 UserData 脚本?

我如何才能 运行 某些 UserData 命令仅在首次启动时执行,其他命令在每次重新启动时执行,而其他命令在停止实例时执行?

例如:我想 运行 "docker-compose down" 仅在实例停止时 但其他命令命令:'docker-compose pull/up' 在每个实例重新启动或“aws cloudformation update-stack”时和一些初始命令仅在首次设置时

How can I run some UserData commands only on first startup, other commands on each reboot and other commands on stop instance?

你不能。 UserData 意味着 运行 仅在实例启动时,而不是重新启动、启动或停止(下面提到的一个例外)。为此,您必须自己实现所有这些功能。

这通常通过 custom systemd unit 文件的定义来完成。因此,您必须为 docker-compose.

创建这样的单元文件

唯一的例外 是 运行在最近的 AWS 博客 post: