はじめに
こんにちは、AWS Community Hero の 織⽥繁 (@OutputSeq) です。
AWS ユーザーコミュニティである JAWS-UG で AWS 初学者向けの JAWS-UG 初⼼者⽀部、AWS アップデートをキャッチアップしたい⽅向けの JAWS-UG 主催 週刊 AWS キャッチアップ を勉強会イベントとして開催しています。
普段の業務では複数のプロジェクトでの AWS インフラストラクチャの作成及び管理を⾏っています。インフラストラクチャの作成には AWS CloudFormation または AWS Cloud Development Kit (CDK) などの IaC ツールを使っています。
職場では IaC ツールが不慣れな⽅もプロジェクトにはいらっしゃいますので、開発環境では調査のために AWS マネジメントコンソールで⼀時的な AWS リソース作成が⾏われることもあります。しかし、作成後に削除をし忘れてしまいコスト増加に繋がる AWS アカウントが発生するリスクが出てきます。
このような課題を解決するために、今回は AWS CloudFormation IaC ジェネレーター を AWS リソースの棚卸ツールとして試した話をします。
builders.flash メールメンバー登録
アーキテクチャ図
IaC ジェネレーターでリソースをスキャンする
IaCジェネレーターを開く

スキャン
「 スキャン」パネルで、「 新しいスキャンを開始」をクリックします。

スキャン時間とクォータ
スキャン時間はリソース量によりますが、1,000 個のリソースで最⼤で 10 分かかることがあります。2024 年 3 月時点での IaC ジェネレーターに関するクォータの⼀覧は以下です。
その他、IaC ジェネレーターに関するクォータの⼀覧は ユーザーガイド をご確認ください。
名前 |
Value |
1 回のアカウントスキャンで処理できるリソースの最⼤数 |
100000 |
1 ⽇あたりのスキャン数 (リソースが 10,000 未満のアカウントの場合) |
3 |
1 ⽇あたりのスキャン数 (リソースが 10,000 以上のアカウントの場合) |
1 |
アカウントあたりの同時に⽣成されるテンプレートの数 |
5 |
1 回のテンプレート⽣成で同時にモデル化されるリソースの数 |
5 |
1 つのテンプレートでモデル化できるリソースの合計数 |
500 |
スキャンしたリソースを出力する
AWS CloudShell を開く
スキャン結果をテキストとして使うために、AWS CloudShell を利⽤します。
マネジメントコンソールから、「CloudShell」を開きます。

スキャン結果の取得
AWS CLI でマネージメントコンソールで実⾏したスキャン結果の ID (ResourceScanId) を取得します。
スキャン結果が複数である場合には⼀番上のスキャン ID (ResourceScanId) が最新となりますので、そちらをメモしておいてください。
コマンド
スキャン結果のリストを取得します。
aws cloudformation list-resource-scans | \
jq '.ResourceScanSummaries | sort_by(.EndTime) | reverse'
結果サンプル
スキャン結果のリストです。
[
{
"ResourceScanId": "arn:aws:cloudformation:ap-northeast-
1:123456789012:resourceScan/672e5920-5a46-4c22-aaf7-0f8a53fe8d93",
"Status": "COMPLETE",
"StartTime": "2024-02-26T01:18:04.222000+00:00",
"EndTime": "2024-02-26T01:21:56.859000+00:00",
"PercentageCompleted": 100.0
},
{
"ResourceScanId": "arn:aws:cloudformation:ap-northeast-
1:123456789012:resourceScan/d904d627-8f68-4760-8f31-5c00587a1f3a",
"Status": "COMPLETE",
"StartTime": "2024-02-25T00:10:34.553000+00:00",
"EndTime": "2024-02-25T00:14:49.331000+00:00",
"PercentageCompleted": 100.0
},
… 略 …
]
ResourceScanId を変数に格納
ResourceScanId を変数に格納します。
ResourceScanId="arn:aws:cloudformation:ap-northeast-
1:123456789012:resourceScan/672e5920-5a46-4c22-aaf7-0f8a53fe8d93"
echo $ResourceScanId
結果サンプル
ResourceScanId が表示されます。
arn:aws:cloudformation:ap-northeast-1:123456789012:resourceScan/672e5920-5a46-4c22-
aaf7-0f8a53fe8d93
件数を確認
スキャンされた件数を確認します。
aws cloudformation describe-resource-scan \
--resource-scan-id $ResourceScanId \
| jq '{ResourcesRead}'
結果サンプル
スキャンされた件数が表示されます。
{
"ResourcesRead": 1470
}
ファイル出⼒
スキャンされた内容をファイル出⼒します。
aws cloudformation list-resource-scan-resources \
--resource-scan-id $ResourceScanId \
| jq -r '.Resources[] | "\(.ManagedByStack)|\(.ResourceType)|\
(.ResourceIdentifier)"' > list-resource-scan-resources.txt
wc -l list-resource-scan-resources.txt
結果サンプル
ファイル出⼒された結果が、スキャンされた結果と同じであることを確認します。
1470 list-resource-scan-resources.txt
サンプル確認
ファイルのサンプル確認をしてみましょう。10 件サンプルでデータを確認します。
head -10 list-resource-scan-resources.txt
結果サンプル
ファイルのサンプルデータです。
false|AWS::AccessAnalyzer::Analyzer|{"Arn":"arn:aws:access-analyzer:ap-northeast-
1:123456789012:analyzer/ConsoleAnalyzer"}
false|AWS::ApiGateway::Deployment|{"DeploymentId":"hsijel","RestApiId":"kpp0xbs554"}
false|AWS::ApiGateway::Deployment|{"DeploymentId":"pxdq2l","RestApiId":"oauq0h8aoa"}
false|AWS::ApiGateway::Deployment|{"DeploymentId":"ob4gej","RestApiId":"oauq0h8aoa"}
false|AWS::ApiGateway::Deployment|{"DeploymentId":"es85me","RestApiId":"q6y4p727ie"}
true|AWS::ApiGateway::Deployment|{"DeploymentId":"voso3d","RestApiId":"oauq0h8aoa"}
false|AWS::ApiGateway::Deployment|{"DeploymentId":"didtcn","RestApiId":"kpp0xbs554"}
false|AWS::ApiGateway::RestApi|{"RestApiId":"q6y4p727ie"}
true|AWS::ApiGateway::RestApi|{"RestApiId":"oauq0h8aoa"}
false|AWS::ApiGateway::RestApi|{"RestApiId":"kpp0xbs554"}
サンプルの見方
データは | でカラムを区切っており、それぞれのカラムの意味は以下となります。
カラム位置 |
カラム名 |
意味 |
1 カラム⽬ |
ManagedByStack |
true の場合は CloudFormation Stack による管理であることを⽰します。 |
2 カラム⽬ |
ResourceType |
リソースタイプを⽰します。 |
3 カラム⽬ |
ResourceIdentifier |
リソース識別⼦を⽰します。リソースタイプ毎に表⽰する個数は異なります |
ファイルを確認する
ファイルの確認を Excel で⾏うためにダウンロードを⾏います。
Cloudshell のコンソールで、「アクション」、「ファイルのダウンロード」の順に開きます。

ファイルをダウンロード
/home/cloudshell-user/list-resource-scan-resources.txt を「個別のファイルパス」に⼊⼒して、「ダウンロード」をクリックします。

Excel で確認
条件書式を設定した Excel を準備していますので、こちらの Excel ファイルをダウンロードします。
Excel の A2 セルに list-resource-scan-resources.txt を貼り付けます。すると、⾃動的に区切り位置、条件付き書式が働き、画像のように表⽰され、スキャン結果を一覧で確認することができるようになりました。
この結果を元に、リソースの棚卸をすることができます。

リソース棚卸後のリソース削除時の注意点
リソースの棚卸が終わったので、次に削除対象のピックアップとなります。 リソースの利⽤状況により削除すべき対象は変わるため、削除する対象をここで記載することはできませんが、筆者の環境では以下を削除対象から除外しましたので、ご参考にしてください。
さいごに
今回は、IaC ジェネレーター を AWS リソースの棚卸のツールとして試してみた経験を紹介させていただきました。
実際に私のプロジェクトでは棚卸を実施し、AWSリソースの⼀覧化を通じて、プロジェクト内で完全に把握されていなかったリソースの存在を明らかにすることが出来ました。また、⼀覧をベースにプロジェクト内のコミュニケーションを⾏うことで、チームメンバー間の認識の齟齬を解消することに繋がりましたし、AWS リソースを整理することで "コスト削減" や、"セキュリティ強化"、"運⽤効率の向上" にも繋げることが出来たと考えています。
この記事にご興味を持たれた⽅は、AWS リソースの整理を通じて、プロジェクトチームの連携強化・プロジェクトの効率改善にご活用いただけますと幸いです。
筆者プロフィール
織田 繁 (AWS samurai / AWS Community Hero)
普段は AWS インフラ構築・運用保守・教育を実施しています。育児休暇中で子供を寝かし付けた後にこの記事を書いています。コミュニティ活動としては JAWS-UG 初心者支部 運営メンバーとして楽しんでいます。
Twitter: @OutputSeq / GitHub: @shigeru-oda / zenn.dev: @shigeru_oda

Did you find what you were looking for today?
Let us know so we can improve the quality of the content on our pages