cloudformationupdateでec2UserDataスクリプトを実行する方法

Oct 01 2020

docker-composepullとupを実行するec2userDataスクリプトがあります。

「awscloudformationupdate-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-composedown」を追加し、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で値を変更した場合にのみ実行されます。

「awscloudformationupdate-stack」を実行するたびに(imageTagが変更されるたびに)UserDataスクリプトを実行するにはどうすればよいですか?

一部のUserDataコマンドを最初の起動時にのみ実行し、他のコマンドを再起動するたびに実行し、他のコマンドをインスタンスの停止時に実行するにはどうすればよいですか?

例:インスタンスの停止時にのみ「docker-composedown」を実行したいが、他のコマンドコマンド:インスタンスの再起動ごとに「docker-composepull / up」、または「awscloudformationupdate-stack」といくつかの初期コマンドを最初のセットアップでのみ実行する。

回答

1 Marcin Oct 01 2020 at 07:14

一部のUserDataコマンドを最初の起動時にのみ実行し、他のコマンドを再起動するたびに実行し、他のコマンドをインスタンスの停止時に実行するにはどうすればよいですか?

できません。UserData再起動、開始、停止ではなく、インスタンスの起動時にのみ実行することを目的としています(以下に説明する1つの例外)。そのためには、このすべての機能を自分で実装する必要があります。

これは通常、カスタムsystemdユニットファイルの定義を通じて行われます。したがって、docker-compose用にそのようなユニットファイルを作成する必要があります。

唯一の例外は、最近のAWSブログ投稿で説明されているインスタンス開始時にユーザーデータを実行するという、かなりハックな方法です。

  • Amazon EC2インスタンスを再起動するたびに、ユーザーデータを利用してスクリプトを自動的に実行するにはどうすればよいですか?