AWSUtility::CloudFormation::CommandRunner を使用して、CloudFormation スタックのリソースの前後にコマンドを実行するにはどうすればよいですか?

所要時間2分
0

AWSUtility::CloudFormation::CommandRunner を使用して、AWS CloudFormation スタックのリソースの前後にコマンドを実行したいと考えています。

解決方法

注: AWS コマンドラインインターフェイス (AWS CLI) コマンドの実行中にエラーが発生した場合は、AWS CLI の最新バージョンを使用していることを確認してください

CloudFormation スタックのリソースの前後にコマンドを実行するには、CloudFormation テンプレートで AWSUtility::CloudFormation::CommandRunner リソースを定義します。

例:

Resources:
    CommandRunner:
        Type: AWSUtility::CloudFormation::CommandRunner
        Properties: 
            Command: 'aws ssm get-parameter --name BucketName --region us-east-1 --query Parameter.Value --output text > /command-output.txt'
            Role: EC2-Role
            LogGroup: my-cloudwatch-log-group

重要: AWSUtility::CloudFormation::CommandRunner リソースをまだ登録していない場合は、次のコマンドを実行します。register.sh スクリプトは、awsutility-cloudformation-commandrunner.zip を使用して AWS リージョンにリソースタイプを登録します。スクリプトは register-type AWS CLI コマンドを使用して、AWS CLI で設定されたデフォルトのリージョンにリソースタイプを登録します。aws configure get region を実行して、設定されたデフォルトのリージョンを確認できます。register.sh スクリプトが実行するアクションの詳細については、AWS GitHub リポジトリの「ユーザーインストール手順」を参照してください。

git clone https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-awsutilities-commandrunner.git

cd aws-cloudformation-resource-providers-awsutilities-commandrunner

curl -LO https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-awsutilities-commandrunner/releases/latest/download/awsutility-cloudformation-commandrunner.zip

./scripts/register.sh --set-default

重要: プロパティ Role は、関連付けられた IAM ロールを持つ AWS Identity and Access Management (IAM) インスタンスプロファイルの名前である必要があります。IAM ロールには 、Amazon Elastic Compute Cloud (Amazon EC2) サービス (ec2.amazonaws.com) との信頼関係が必要です。プロパティ Role は、コマンドを実行するために AWSUtility::CloudFormation::CommandRunner リソースが継承します。オプションのプロパティ LogGroup (指定されている場合) は、コマンドを実行して取得したログを Amazon CloudWatch ロググループに書き込みます。テンプレートで AWSUtility::CloudFormation::CommandRunner リソースを使用する方法の詳細については、AWS GitHub の aws-cloudformation-resource-providers-awsutilities-commandrunner リポジトリREADME.md および docs/README.md を参照してください。

AWS CLI コマンドには --region オプションを含める必要があります。次に、前述のコード例のように、コマンドの出力を /command-output.txt という予約済みファイルに書き込む必要があります。

Fn::GetAtt を使用して、コマンドの出力を確認できます。例:

S3Bucket: 
    Type: AWS::S3::Bucket
    Properties: 
        BucketName: !GetAtt CommandRunner.Output

論理名 Instance のリソースの後にコマンドを実行するには、AWSUtility::CloudFormation::CommandRunner リソースの定義で DependsOn: Instance を指定します。例:

Resources:
   CommandRunner:
      DependsOn: Instance
      Type: AWSUtility::CloudFormation::CommandRunner
      Properties:
         Command: aws s3 ls | sed -n 1p | cut -d " " -f3 > /command-output.txt
         LogGroup: my-cloudwatch-log-group
         Role: EC2-Role
   Instance:
      Type: AWS::EC2::Instance
      Properties:
         Image: ami-abcd1234

リソースの前にコマンドを実行するには、DependsOn を、そのリソースの定義で AWSUtility::CloudFormation::CommandRunner リソースの論理名に設定します。例:

Resources:
   CommandRunner:
      Type: AWSUtility::CloudFormation::CommandRunner
      Properties:
         Command: aws s3 ls | sed -n 1p | cut -d " " -f3 > /command-output.txt
         LogGroup: my-cloudwatch-log-group
         Role: EC2-Role
   Instance:
      DependsOn: CommandRunner
      Type: AWS::EC2::Instance
      Properties:
         Image: ami-abcd1234

注: 上記の例では、sed -n 1paws s3 ls によって返された応答の最初の行のみを出力します。バケット名を取得するには、パイプを使って sed -n 1p の応答を cut -d " " -f3 に渡します。次に、cut -d " " -f3 は、スペースで区切られた行を分割した後に作成された配列の 3 番目の要素を選択します。


関連情報

AWS CloudFormation テンプレートで bash コマンドを実行する

AWS公式
AWS公式更新しました 3年前
コメントはありません

関連するコンテンツ