如何在CloudFormation更新上运行EC2 UserData脚本

问题描述

我有执行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博客文章中描述的在实例开始时运行用户数据的方式:

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...