【メモ】CloudFormation実行関連


## CloudFormation実行

※各環境の実行したい処理単位のフォルダに入る
```ruby:title: CloudFormation実行
$ cd <実行したい処理単位のフォルダ> 
$ pull
$ ../../build
※build.sh実行
```

## CloudFormation手動実行
### 手動実行（WAFの例）

```ruby:title: 手動実行（WAFの例）
StackID=141-WAF
aws cloudformation deploy --template-file ./cfn/${StackID}.yml --stack-name DEV-${StackID} --parameter-overrides $(grep -Evh ^# ./cfn/common_param.ini ./cfn/${StackID}.ini | tr '\n' ' ') StackName=DEV-${StackID} MaintenanceMode=true TestMode=false
```


## CloudFormationテンプレート検証

```ruby:title: CloudFormationテンプレート検証
find . -name '*.yml' -exec aws cloudformation validate-template --template-body file://{} --query 'Description' --no-cli-pager \;                                                                                                                                                                
null
null
null
　snip.
An error occurred (ValidationError) when calling the ValidateTemplate operation: Unresolved resource dependencies [NGW02] in the Outputs block of the template
null
"Lambda-ExportLog"
"Lambda-xxx"
"Lambda-yyy"
null
```


※　「An error occurred (ValidationError) when calling the ValidateTemplate operation: ～」が出力されたら、テンプレートの書式エラー


## CloudFormationスタック実行結果参照
### マネコンチックにスタックの実行結果を参照
```ruby:title: マネコンチックにスタックの実行結果を参照する
$ aws cloudformation describe-stack-events --stack-name $STACK_NAME --output table --query 'reverse(sort_by(StackEvents[*].{Timestamp:Timestamp, LogicalID:LogicalResourceId, Status:ResourceStatus, Reason:ResourceStatusReason}, &Timestamp))'
```

## CloudFormationスタック　ステータスクリア
### スタックステータスがROLLBACK_XXXXになった時のクリア方法

```ruby:title: スタックステータスがROLLBACK_XXXXになった時のクリア方法
$ STACK_NAME=＜CloudFormationスタック名＞
$ DATADOG_TAG=$(aws cloudformation describe-stacks --stack-name $STACK_NAME --output text --query '(Stacks[0].Parameters[?contains(ParameterValue, `datadog`)].ParameterKey)[0]')
$ aws cloudformation update-stack --stack-name $STACK_NAME --use-previous-template --parameters $(aws cloudformation describe-stacks --stack-name $STACK_NAME --output text --query "Stacks[0].Parameters[?ParameterKey!=\`${DATADOG_TAG}\`].ParameterKey" | tr '\t' '\n' | sed -E 's/(^.*$)/ParameterKey=\1,UsePreviousValue=true/' | tr '\n' ' ') ParameterKey=${DATADOG_TAG},ParameterValue=$(date +datadog%s)
$ aws cloudformation wait stack-update-complete --stack-name $STACK_NAME
$ aws cloudformation describe-stacks --stack-name $STACK_NAME --query 'Stacks[*].StackStatus'
```

## CloudFormationスタック　削除系
### スタックプレフィックス指定で一括削除
```ruby:title: スタックプレフィックス指定で一括削除
while read s ; do echo "### $s ###" ; aws cloudformation delete-stack --stack-name "$s" ; done < <(aws cloudformation list-stacks --query 'StackSummaries[?contains(StackName,`STG-`)].StackName' --output text | tr "\t" "\n")
```

### CloudFormationのエラーになったスタックを一括で削除

```ruby:title: CloudFormationエラースタック一括削除
while read s ; do echo "### Stack:${s} ###" ; aws cloudformation delete-stack --stack-name "$s" ; done < <(aws cloudformation list-stacks --stack-status-filter ROLLBACK_COMPLETE --query 'StackSummaries[*].StackName' --output text | tr "\t" "\n")
```

## まとめ
本稿が、CloudFormation実行を行いたい方の参考になれば嬉しいです。

ITエンジニア向け、AWS資格取得を目指す方向けに個人ブログで記事も投稿していますので、
合わせて読んでもらえると嬉しいです。
[ことなの学校(個人ブログ)](https://kotona-school.com)

更によりレベル感の高そうなAWS関連の発信はZennの方で行います。
こちらももしよければフォロー、ご確認いただけると嬉しいです。
[Zenn個人アカウント](https://zenn.dev/tomo_itbizblog)

Twitterでも役立つ情報を発信しますのでフォローしてもらえると嬉しいです 
→ [@tomo_ITBizBlog](https://twitter.com/tomo_ITBizBlog)