CloudFormation IaC Generator を触ってみる
所要で触る機会があったのでメモ。
大まかには
- アカウントに存在するリソースをスキャンする - テンプレート(yaml, json)を作成する、の流れをとる
- スキャン結果は30日保管される
- 1日あたりのスキャン数制限は3回、リソース数10000以上だと1回
- 1つのテンプレートでモデル化できるリソースの合計数は500
- 物理IDが残存したりしなかったりする
- 関連リソースを推薦してくれる
- 同じリソースが重複して記載されることがある
CLI
リソースをスキャンするときやテンプレートを作成するときはWebコンソールから操作できるけど、AWS CLIでも操作できる。
スキャン
aws cloudformation start-resource-scan --region us-east-1
スキャンを開始するとARNが払い出される。結果の閲覧やテンプレートの作成時にはこのARNが必要なので、取得しておくと吉。
aws cloudformation list-resource-scans | jq -r ".ResourceScanSummaries[].ResourceScanId"
スキャン終了後に結果を閲覧できる。--resource-identifier
で対象のリソースを検索することができる。test
で検索するとこのような感じ。
identifier だけではなくて、--resource-type-prefix 'AWS::IAM::User'
みたくリソースタイプでフィルタすることもできる。
aws cloudformation list-resource-scan-resources \
--resource-scan-id arn:aws:cloudformation:us-east-1:123456789012:resourceScan/0a699f15-489c-43ca-a3ef-3e6ecfa5da60 \
--resource-identifier test
{
"Resources": [
{
"ResourceType": "AWS::CloudWatch::Alarm",
"ResourceIdentifier": {
"AlarmName": "test-slack-alarm"
},
"ManagedByStack": false
},
{
:
}
]
}
テンプレート(コード)化するにはこの検索した結果をもとにしたリソース情報を引数として使用する。 この結果をそのまま使うことができれば楽なんだけどそれができない。具体的には、
Resources
配列が必要Resources[].ManagedByStack
が不要
となっており、結果を少し加工することが必要。AWSドキュメントだと「手で編集して下さい」みたく書かれているのだけど、jq
でもなんとか出来たのでそうした。
aws cloudformation list-resource-scan-resources \
--resource-scan-id arn:aws:cloudformation:us-east-1:123456789012:resourceScan/0a699f15-489c-43ca-a3ef-3e6ecfa5da60 \
--resource-identifier test | jq -r '.Resources | map(del(.ManagedByStack))' \
> resources.json
例えば S3 だと、S3バケットポリシーなども一緒にコード化したい状況もある。そのようなときには list-resource-scan-related-resources
を使用する。--resources
の引数にはやはりリソース一覧が必要で、ファイルで指定する。
aws cloudformation list-resource-scan-related-resources \
--resource-scan-id arn:aws:cloudformation:us-east-1:123456789012:resourceScan/0a699f15-489c-43ca-a3ef-3e6ecfa5da60 \
--resources file://resources.json
{
"RelatedResources": [
{
"ResourceType": "AWS::S3::Bucket",
"ResourceIdentifier": {
"BucketName": "testbucket"
},
"ManagedByStack": false
},
{
"ResourceType": "AWS::S3::BucketPolicy",
"ResourceIdentifier": {
"Bucket": "testbucket"
},
"ManagedByStack": false
},
{
:
}
]
}
この結果は RelatedResources
の配列に結果が格納されているので、先程と同じように jq
でなんとかすることができる。なお、関連あるリソースをリストアップしていくと同じリソースが列挙されていくことがある。そのへんはシステムで弾いてほしいがまだ難しそうなので、またjq
でなんとかすることができる。jq unique
という方法を初めて知った。
aws cloudformation list-resource-scan-related-resources \
--resource-scan-id arn:aws:cloudformation:us-east-1:123456789012:resourceScan/0a699f15-489c-43ca-a3ef-3e6ecfa5da60 \
--resources file://resources.json | jq -r '.RelatedResources | map(del(.ManagedByStack)) | unique' \
> resources_related.json
テンプレートを作成
テンプレート化したいリソース一覧(resources_related.json
)を作ったので、これをもとにテンプレート化していく。
aws cloudformation create-generated-template --region ap-northeast-1 \
--generated-template-name cli-template \
--resources 'file://resources_related.json'
作成したテンプレートは確認できる。
aws cloudformation list-generated-templates
生成したテンプレートを使用して、CloudFormation Stack を作成することもできるそうだけど、これはまだ試していない。