AWSUtility::CloudFormation::CommandRunner 使用して、AWS CloudFormation スタックのリソースの前後にコマンドを実行するにはどうしたらよいですか?
最終更新日: 2020 年 12 月 17 日
AWSUtility::CloudFormation::CommandRunner 使用して、AWS CloudFormation スタックのリソースの前後にコマンドを実行したいと考えています。
解決方法
注: AWS コマンドラインインターフェイス (AWS CLI) コマンドの実行中にエラーが発生した場合は、AWS CLI の最新バージョンを使用していることを確認してください。
AWS CloudFormation スタックのリソースの前後にコマンドを実行するには、AWS 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 リソースをまだ登録していない場合は、次のコマンドを実行します。
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
重要: プロパティロールには 、Amazon Elastic Compute Cloud (Amazon EC2) サービス (ec2.amazonaws.com) との信頼関係が必要です 。プロパティロールは、コマンドを実行するために AWSUtility::CloudFormation::CommandRunner リソースが引き受けます。オプションのプロパティ LogGroup (指定されている場合) は、コマンドを実行して取得したログを Amazon CloudWatch ロググループに書き込みます。
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 1p は、aws s3 ls によって返された応答の最初の行のみを出力します。バケット名を取得するには、sed -n 1p は応答を cut -d " " -f3 に渡します。これは、スペースで区切られた行を分割した後に作成された配列の 3 番目の要素を選択します。