CloudFormation IaC Generator を触ってみる

所要で触る機会があったのでメモ。

大まかには

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
        },
        {
          :
        }
    ]
}

テンプレート(コード)化するにはこの検索した結果をもとにしたリソース情報を引数として使用する。 この結果をそのまま使うことができれば楽なんだけどそれができない。具体的には、

となっており、結果を少し加工することが必要。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 を作成することもできるそうだけど、これはまだ試していない。

© まっくらのーと/mkr-note 2025