AWSUtility::CloudFormation::CommandRunner を使用して CloudFormation スタック内のリソースの前後にコマンドを実行する方法を教えてください。

所要時間2分
0

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

解決策

注: AWS コマンドラインインターフェイス (AWS CLI) コマンドの実行中にエラーが発生した場合は、「AWS CLI で発生したエラーのトラブルシューティング」を参照してください。また、AWS CLI の最新バージョンを使用していることを確認してください。

AWSUtility::CloudFormation::CommandRunner を登録する

AWSUtility::CloudFormation::CommandRunner リソースが登録済みではない場合は、次のコマンドを実行して登録します。

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

register.sh スクリプトは、AWS CLI コマンド register-type を実行し、awsutility-cloudformation-commandrunner.zip を使用してデフォルトの AWS リージョンにリソースタイプを登録します。デフォルトのリージョンを確認するには、aws configure get region コマンドを実行します。register.sh スクリプトが実行するアクションの詳細については、AWS GitHub のウェブサイトで「ユーザーのインストール手順」を参照してください。

CloudFormation テンプレートでリソースを定義する

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

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

Role プロパティは、IAM ロールが関連付けられている AWS Identity and Access Management (IAM) インスタンスプロファイルの名前である必要があります。IAM ロールには、Amazon Elastic Compute Cloud (Amazon EC2) サービスである ec2.amazonaws.com との信頼関係が必要です。コマンドを実行するために、AWSUtility::CloudFormation::CommandRunnerRole プロパティを引き受けますLogGroup プロパティを指定した場合は、LogGroup はコマンドの実行によるログを Amazon CloudWatch ロググループに書き込みます。

テンプレートで AWSUtility::CloudFormation::CommandRunner リソースを使用する方法の詳細については、GitHubの ウェブサイトで README.mddocs/README.md を参照してください。

Fn::GetAtt を使用してコマンドの出力を参照します。

テンプレートスニペットの例

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

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

テンプレートの例

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

リソースの前にコマンドを実行するには、リソース定義内で、DependsOnAWSUtility::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 1pcut -d " " -f3 に応答を送信します。その後、cut -d " " -f3 は行をスペースで区切った後に、配列内の 3 番目の要素を選択します。

関連情報

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

AWS公式
AWS公式更新しました 2ヶ月前
コメントはありません

関連するコンテンツ