【问题标题】:How to run ec2 UserData script on cloudformation update如何在 cloudformation 更新上运行 ec2 UserData 脚本
【发布时间】: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_modulesruncmd 的参考吗?

标签: amazon-web-services amazon-ec2 amazon-cloudformation user-data


【解决方案1】:

如何仅在第一次启动时运行一些 UserData 命令,在每次重启时运行其他命令,在停止实例时运行其他命令?

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

这通常通过定义custom systemd unit 文件来完成。因此你必须为你的 docker-compose 创建这样的单元文件。

唯一的例外是在最近的 AWS 博客文章中描述的在实例开始时运行用户数据的一种相当老套的方式:

【讨论】:

    猜你喜欢
    • 2020-04-30
    • 1970-01-01
    • 2020-04-06
    • 2017-04-27
    • 2015-10-15
    • 1970-01-01
    • 2018-04-12
    • 2021-12-26
    • 1970-01-01
    相关资源
    最近更新 更多