概要
Claude Codeを活用し、AWS CloudFormationテンプレートを用いてインフラ環境の構築を試みました。
CloudFormationとは
🔄 インフラの自動化・効率化
- 手動作業に起因するヒューマンエラーの削減
- 複数のリソースを数分で一括作成・削除
- 繰り返し作業の大幅な時間短縮
📋 コードによるインフラ管理(IaC: Infrastructure as Code)
- インフラ構成をYAML/JSONで可視化・文書化
- Gitでバージョン管理・変更履歴追跡が可能
- コードレビューによる品質向上
🔁 環境の完全な再現性
- 開発・ステージング・本番環境の統一
- 災害復旧時の迅速な環境復元
🔗 リソース間の依存関係自動解決
- VPC → サブネット → EC2の順序を自動判定
- 削除時も依存関係を考慮した逆順実行
- 複雑な構成でも整合性を保証
💰 コスト管理・最適化
- 不要な環境の確実な削除(リソース残りなし)
- テスト環境の夜間自動停止・朝の自動起動
- リソース使用量の透明性向上
🛡️ セキュリティ・ガバナンス向上
- 承認されたテンプレートのみでのデプロイ
- セキュリティ設定の標準化・強制
- 設定ドリフトの検出・修正
ClaudeCodeに指示を出して作成してもらう
# AWSのCloudFormationのyamlファイルを作成してください。
## 構成
・EC2
最低スペックでお願いします。IPは固定化不要です。
railsを起動させたいので、インストールなどお願いします。
・RDS
postgresqlで、最低スペックでお願いします。
EC2と接続できるようにセキュリティグループ回りを設定してください。
rails-postgres-stack_v1.yaml
AWSTemplateFormatVersion: '2010-09-09'
Description: 'Rails application with PostgreSQL RDS - minimum configuration'
Parameters:
KeyName:
Description: 'EC2 Key Pair for SSH access'
Type: 'AWS::EC2::KeyPair::KeyName'
ConstraintDescription: 'Must be the name of an existing EC2 KeyPair'
Resources:
# VPC
VPC:
Type: 'AWS::EC2::VPC'
Properties:
CidrBlock: '10.0.0.0/16'
EnableDnsHostnames: true
EnableDnsSupport: true
Tags:
- Key: 'Name'
Value: 'Rails-PostgreSQL-VPC'
# Internet Gateway
InternetGateway:
Type: 'AWS::EC2::InternetGateway'
Properties:
Tags:
- Key: 'Name'
Value: 'Rails-PostgreSQL-IGW'
InternetGatewayAttachment:
Type: 'AWS::EC2::VPCGatewayAttachment'
Properties:
InternetGatewayId: !Ref InternetGateway
VpcId: !Ref VPC
# Public Subnet
PublicSubnet:
Type: 'AWS::EC2::Subnet'
Properties:
VpcId: !Ref VPC
AvailabilityZone: !Select [0, !GetAZs '']
CidrBlock: '10.0.1.0/24'
MapPublicIpOnLaunch: true
Tags:
- Key: 'Name'
Value: 'Rails-PostgreSQL-Public-Subnet'
# Private Subnet for RDS
PrivateSubnet1:
Type: 'AWS::EC2::Subnet'
Properties:
VpcId: !Ref VPC
AvailabilityZone: !Select [0, !GetAZs '']
CidrBlock: '10.0.2.0/24'
Tags:
- Key: 'Name'
Value: 'Rails-PostgreSQL-Private-Subnet-1'
PrivateSubnet2:
Type: 'AWS::EC2::Subnet'
Properties:
VpcId: !Ref VPC
AvailabilityZone: !Select [1, !GetAZs '']
CidrBlock: '10.0.3.0/24'
Tags:
- Key: 'Name'
Value: 'Rails-PostgreSQL-Private-Subnet-2'
# Route Table
PublicRouteTable:
Type: 'AWS::EC2::RouteTable'
Properties:
VpcId: !Ref VPC
Tags:
- Key: 'Name'
Value: 'Rails-PostgreSQL-Public-Routes'
DefaultPublicRoute:
Type: 'AWS::EC2::Route'
DependsOn: InternetGatewayAttachment
Properties:
RouteTableId: !Ref PublicRouteTable
DestinationCidrBlock: '0.0.0.0/0'
GatewayId: !Ref InternetGateway
PublicSubnetRouteTableAssociation:
Type: 'AWS::EC2::SubnetRouteTableAssociation'
Properties:
RouteTableId: !Ref PublicRouteTable
SubnetId: !Ref PublicSubnet
# Security Groups
EC2SecurityGroup:
Type: 'AWS::EC2::SecurityGroup'
Properties:
GroupDescription: 'Security group for Rails EC2 instance'
VpcId: !Ref VPC
SecurityGroupIngress:
- IpProtocol: tcp
FromPort: 22
ToPort: 22
CidrIp: '0.0.0.0/0'
- IpProtocol: tcp
FromPort: 3000
ToPort: 3000
CidrIp: '0.0.0.0/0'
- IpProtocol: tcp
FromPort: 80
ToPort: 80
CidrIp: '0.0.0.0/0'
SecurityGroupEgress:
- IpProtocol: -1
CidrIp: '0.0.0.0/0'
Tags:
- Key: 'Name'
Value: 'Rails-EC2-SecurityGroup'
RDSSecurityGroup:
Type: 'AWS::EC2::SecurityGroup'
Properties:
GroupDescription: 'Security group for PostgreSQL RDS'
VpcId: !Ref VPC
SecurityGroupIngress:
- IpProtocol: tcp
FromPort: 5432
ToPort: 5432
SourceSecurityGroupId: !Ref EC2SecurityGroup
Tags:
- Key: 'Name'
Value: 'PostgreSQL-RDS-SecurityGroup'
# DB Subnet Group
DBSubnetGroup:
Type: 'AWS::RDS::DBSubnetGroup'
Properties:
DBSubnetGroupDescription: 'Subnet group for PostgreSQL RDS'
SubnetIds:
- !Ref PrivateSubnet1
- !Ref PrivateSubnet2
Tags:
- Key: 'Name'
Value: 'PostgreSQL-DB-SubnetGroup'
# RDS Instance
PostgreSQLDatabase:
Type: 'AWS::RDS::DBInstance'
Properties:
DBInstanceIdentifier: 'rails-postgresql-db'
DBInstanceClass: 'db.t3.micro'
Engine: 'postgres'
EngineVersion: '15.4'
AllocatedStorage: 20
StorageType: 'gp2'
DBName: 'railsapp'
MasterUsername: 'railsuser'
MasterUserPassword: 'RailsPassword123!'
VPCSecurityGroups:
- !Ref RDSSecurityGroup
DBSubnetGroupName: !Ref DBSubnetGroup
BackupRetentionPeriod: 0
MultiAZ: false
PubliclyAccessible: false
StorageEncrypted: false
DeletionProtection: false
Tags:
- Key: 'Name'
Value: 'Rails-PostgreSQL-Database'
# EC2 Instance
RailsEC2Instance:
Type: 'AWS::EC2::Instance'
Properties:
ImageId: 'ami-0c02fb55956c7d316' # Amazon Linux 2 AMI (update as needed)
InstanceType: 't2.micro'
KeyName: !Ref KeyName
NetworkInterfaces:
- AssociatePublicIpAddress: true
DeviceIndex: 0
GroupSet:
- !Ref EC2SecurityGroup
SubnetId: !Ref PublicSubnet
UserData:
Fn::Base64: !Sub |
#!/bin/bash
yum update -y
# Install development tools
yum groupinstall -y "Development Tools"
yum install -y git curl wget
# Install Node.js (required for Rails asset pipeline)
curl -fsSL <https://rpm.nodesource.com/setup_18.x> | bash -
yum install -y nodejs
# Install PostgreSQL client
yum install -y postgresql postgresql-devel
# Install rbenv and Ruby
git clone <https://github.com/rbenv/rbenv.git> /home/ec2-user/.rbenv
echo 'export PATH="/home/ec2-user/.rbenv/bin:$PATH"' >> /home/ec2-user/.bashrc
echo 'eval "$(rbenv init -)"' >> /home/ec2-user/.bashrc
git clone <https://github.com/rbenv/ruby-build.git> /home/ec2-user/.rbenv/plugins/ruby-build
chown -R ec2-user:ec2-user /home/ec2-user/.rbenv
# Install Ruby as ec2-user
sudo -u ec2-user bash -c 'source /home/ec2-user/.bashrc && rbenv install 3.2.0 && rbenv global 3.2.0'
# Install Bundler and Rails
sudo -u ec2-user bash -c 'source /home/ec2-user/.bashrc && gem install bundler rails'
# Create database configuration file
mkdir -p /home/ec2-user/rails_app
cat > /home/ec2-user/rails_app/database_config.txt << EOL
Database Host: ${PostgreSQLDatabase.Endpoint.Address}
Database Port: ${PostgreSQLDatabase.Endpoint.Port}
Database Name: railsapp
Username: railsuser
Password: RailsPassword123!
EOL
chown -R ec2-user:ec2-user /home/ec2-user/rails_app
# Create a sample Rails app setup script
cat > /home/ec2-user/setup_rails_app.sh << 'EOL'
#!/bin/bash
cd /home/ec2-user
source ~/.bashrc
# Create new Rails app with PostgreSQL
rails new myapp --database=postgresql
cd myapp
# Configure database connection
DB_HOST=$(cat /home/ec2-user/rails_app/database_config.txt | grep "Database Host:" | cut -d' ' -f3)
cat > config/database.yml << EOF
default: &default
adapter: postgresql
encoding: unicode
pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
host: $DB_HOST
port: 5432
username: railsuser
password: RailsPassword123!
development:
<<: *default
database: railsapp
production:
<<: *default
database: railsapp
EOF
# Install gems
bundle install
# Create and migrate database
bundle exec rails db:create
bundle exec rails db:migrate
# Generate a simple controller for testing
bundle exec rails generate controller Home index
echo "Rails app setup complete!"
echo "To start the server, run: cd myapp && bundle exec rails server -b 0.0.0.0"
EOL
chmod +x /home/ec2-user/setup_rails_app.sh
chown ec2-user:ec2-user /home/ec2-user/setup_rails_app.sh
Tags:
- Key: 'Name'
Value: 'Rails-Application-Server'
Outputs:
EC2InstanceId:
Description: 'EC2 Instance ID'
Value: !Ref RailsEC2Instance
EC2PublicIP:
Description: 'EC2 Instance Public IP'
Value: !GetAtt RailsEC2Instance.PublicIp
EC2PublicDNS:
Description: 'EC2 Instance Public DNS'
Value: !GetAtt RailsEC2Instance.PublicDnsName
DatabaseEndpoint:
Description: 'PostgreSQL Database Endpoint'
Value: !GetAtt PostgreSQLDatabase.Endpoint.Address
DatabasePort:
Description: 'PostgreSQL Database Port'
Value: !GetAtt PostgreSQLDatabase.Endpoint.Port
SSHCommand:
Description: 'SSH Command to connect to EC2'
Value: !Sub 'ssh -i ${KeyName}.pem ec2-user@${RailsEC2Instance.PublicIp}'
RailsSetupInstructions:
Description: 'Instructions to setup Rails application'
Value: 'SSH into the instance and run: ./setup_rails_app.sh'
命名規則を指定していなかったので、追加で依頼。
各種AWSの命名に関して、「study_test_name_」をつけてください
rails-postgres-stack_v2.yaml
実行結果1: エラー

表示されたエラーをClaude Codeに分析を依頼したところ、キーペアを事前に用意が必要ということが判明しました。
CloudFormationでキーペアを作成するとSystemManagerに保存される特殊仕様になります。
今回はテストなので一旦事前に手動で作成しました。
> rails-postgres-stack.yamlから起動したところ、エラーがでました。解析して修正をお願いします。
> リソース study-test-name-rails-v1 は ROLLBACK_IN_PROGRESS 状態です
> この AWS::CloudFormation::Stack リソースは ROLLBACK_IN_PROGRESS 状態です。
>
> Parameter validation failed: parameter value for parameter name KeyName does not exist. Rollback requested by user.
⏺ エラーの原因はKeyNameパラメータで指定したEC2キーペアが存在しないことです。
⏺ 解決方法
1. 既存のキーペアを確認
aws ec2 describe-key-pairs
2. キーペアが存在しない場合は作成
# キーペア作成
aws ec2 create-key-pair --key-name study-test-key --query 'KeyMaterial' --output text > study-test-key.pem
chmod 400 study-test-key.pem
3. CloudFormationスタックの再実行
# 既存のスタックを削除(ROLLBACKの場合)
aws cloudformation delete-stack --stack-name study-test-name-rails-v1
# 削除完了を待機
aws cloudformation wait stack-delete-complete --stack-name study-test-name-rails-v1
# 正しいキーペア名で再作成
aws cloudformation create-stack \\
--stack-name study-test-name-rails-v1 \\
--template-body file://rails-postgres-stack.yaml \\
--parameters ParameterKey=KeyName,ParameterValue=study-test-key
⏺ 重要: CloudFormationテンプレート自体は問題ありません。単純にキーペアが存在しないことが原因です。上記の手順でキーペアを作成してからス
タックを再実行してください。
手動でキーペアを作成して、CloudFormationを起動するときにセットします。
(先ほどは空欄で実行していました。)

実行結果2: エラー
Postgresで15.4は無効バージョンと表示されました。
確認したところ、確かに選択肢にはないバージョンでした。

> 別のエラーが出ました。どのような内容でしょうか
> この AWS::RDS::DBInstance リソースは CREATE_FAILED 状態です。
>
> Resource handler returned message: "Cannot find version 15.4 for postgres (Service: Rds, Status Code: 400, Request ID:
> 607039ea-7126-4db0-a584-9af41a41313e) (SDK Attempt Count: 1)" (RequestToken: e86862a6-2e8b-0624-255a-5820a120aec4, HandlerErrorCode:
> InvalidRequest)
⏺ PostgreSQLのバージョン 15.4 が無効です。指定されたバージョンが存在しないか、利用できないリージョンにいる可能性があります。
⏺ Update(rails-postgres-stack.yaml)
╭─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ Edit file │
│ ╭─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │
│ │ rails-postgres-stack.yaml │ │
│ │ │ │
│ │ 148 DBInstanceIdentifier: 'study-test-name-rails-postgresql-db' │ │
│ │ 149 DBInstanceClass: 'db.t3.micro' │ │
│ │ 150 Engine: 'postgres' │ │
│ │ 151 - EngineVersion: '15.4' │ │
│ │ 151 + EngineVersion: '15.7' │ │
│ │ 152 AllocatedStorage: 20 │ │
│ │ 153 StorageType: 'gp2' │ │
│ │ 154 DBName: 'railsapp'
エラーになるとロールバックが作動するため、作成されたリソースはすべて削除されてしまいます。
(作成途中で見るとリソースが存在していますが、ロールバック完了後にはなくなっています。)

実行結果3: エラー
AMIが使用できないIDでした。
何度かやり取りしたもののうまくいかなかったので、自分でAWSコンソールから確認してAMI IDを修正しています。
> 新しいエラーがでました。こちらの内容の解析をお願いします。
> Resource handler returned message: "The image id '[ami-0c02fb55956c7d316]' does not exist (Service: Ec2, Status Code: 400, Request ID:
> 36c64af1-02fb-4e4b-ad91-22bb03064278) (SDK Attempt Count: 1)" (RequestToken: c77529a9-89b1-8dd8-da0a-a8fa4b2105af, HandlerErrorCode:
> InvalidRequest)
⏺ AMI ID ami-0c02fb55956c7d316 が存在しないか、現在のリージョンで利用できません。AMIはリージョン固有のリソースです。
AMIを常に最新化しておきたい場合はSSMから取得するのがよいとのことです。
この方法なら常に最新のAmazon Linux 2 AMIが自動選択され、リージョンに関係なく動作します。
ImageId: '{{resolve:ssm:/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2}}'
実行結果4~5: エラー
何度かClaudeとやり取りを進めました。
実行結果6: 成功!
rails-postgres-stack_v6_amazon_linux2.yaml

EC2のログインも成功しました!
psqlのクライアントツールもインストール済みで、RDSへの接続も問題ありませんでしたが、rubyが入れられていませんでした。
$ssh -i study_test_name.pem ec2-user@**.***.**.***
Last login: Fri Sep 19 04:52:40 2025 from ***-***-***-***.xx.xx-xxx.ne.jp
, #_
~\\_ ####_ Amazon Linux 2
~~ \\_#####\\
~~ \\###| AL2 End of Life is 2026-06-30.
~~ \\#/ ___
~~ V~' '->
~~~ / A newer version of Amazon Linux is available!
~~._. _/
_/ _/ Amazon Linux 2023, GA and supported until 2028-03-15.
_/m/' <https://aws.amazon.com/linux/amazon-linux-2023/>
[ec2-user@ip-10-0-1-113 ~]$ psql --version
psql (PostgreSQL) 9.2.24
# RDSへの接続OK
[ec2-user@ip-10-0-1-113 ~]$ psql -h study-test-name-rails-postgresql-db.**********.ap-northeast-1.rds.amazonaws.com -U railsuser -d railsapp
ユーザー railsuser のパスワード:
railsapp=>
######
[ec2-user@ip-10-0-1-113 ~]$ ruby -v
-bash: ruby: コマンドが見つかりません
[ec2-user@ip-10-0-1-113 ~]$ rbenv --version
rbenv 1.3.2-10-gd1a19a3
# セットアップシェル
[ec2-user@ip-10-0-1-113 ~]$ ./setup_rails_app.sh
./setup_rails_app.sh: 行 6: rails: コマンドが見つかりません
./setup_rails_app.sh: 7 行: cd: myapp: No such file or directory
./setup_rails_app.sh: 行 12: config/database.yml: No such file or directory
./setup_rails_app.sh: 行 32: bundle: コマンドが見つかりません
./setup_rails_app.sh: 行 35: bundle: コマンドが見つかりません
./setup_rails_app.sh: 行 36: bundle: コマンドが見つかりません
./setup_rails_app.sh: 行 39: bundle: コマンドが見つかりません
Rails app setup complete!
To start the server, run: cd myapp && bundle exec rails server -b 0.0.0.0
時間が足りずここまでしかできなかったので、Ruby・Railsのインストールは次の課題とします。
EC2, RDSの構築としては問題がなさそうなので、CloudFormationの可能性を感じた検証結果となりました。
●EC2

●RDS

スタックの削除
CloudFormationからスタックの削除をおこなうと、作成されたリソースがすべて削除されます。
依存関係も加味して逆順で削除していってくれるので便利です。
削除された履歴も確認ができるので、1つずつ確認していけば削除されていることが分かります。

注意として、かならずスタックから削除しないととんでもないことが起こります。
CloudFormationから削除
→依存関係で削除失敗
→EC2だけ手動で削除
→オートスケールでEC2が復活
→過剰請求
となってしまった事案がありました。
参考:Zenn – えいとびーと – 「クラウドでIDEを動かしたかっただけなのに」AWSで22万円のクラウド破産した話
https://zenn.dev/eightbeat/articles/ca6ce3d06c0265
今回確認したところ、RDS削除時にスナップショットを残してくれていました。
スナップショットなのでそこまで利用料金は発生しませんでしたが、このような削除漏れが大きな金額になってくるので、注意する必要がありそうです。
(今回は手動で削除しました。)

ClaudeCodeにAWS構成図を見せて作ってもらう
添付の画像を確認して、AWSのCloudFormationのyamlファイルを作成してください。
各種AWSの命名に関して、「study_test_name_」をつけてください

api-gateway-lambda-study.yaml
当初は「LambdaにHello Worldを返す処理を組み込んでほしい」と追加で依頼する予定でしたが、最初の依頼だけでその部分まで対応してくれました。
ただし、Lambda実行環境のPythonランタイムが3.9であったため、最新バージョンに更新するよう追加で依頼しました。
>lambdaのpythonが最新バージョンとなるように修正してください。
>API Gatewayの方にもバージョン概念があれば最新化をお願いします
⏺ Lambda PythonとAPI Gatewayを最新バージョンに更新します。
⏺ Read(api-gateway-lambda-study.yaml)
⎿ Read 275 lines (ctrl+o to expand)
⏺ Update(api-gateway-lambda-study.yaml)
⎿ Updated api-gateway-lambda-study.yaml with 1 addition and 1 removal
25 Type: 'AWS::Lambda::Function'
26 Properties:
27 FunctionName: 'study_test_name_HelloWorldFunction'
28 - Runtime: 'python3.9'
28 + Runtime: 'python3.12'
29 Handler: 'index.lambda_handler'
30 Role: !GetAtt LambdaExecutionRole.Arn
31 Code:
⏺ Lambda Pythonを最新版(3.12)に更新しました。
更新内容:
- Lambda Runtime: python3.9 → python3.12
API Gatewayについて:
現在のテンプレートは既にREST APIの最新の設定を使用しています。API Gateway V2(HTTP API)という選択肢もありますが、REST
APIの方が機能が豊富で、現在の構成には適しています。
- REST API: より多くの機能(認証、バリデーション、SDKなど)
- HTTP API (V2): より軽量で高速、コストも安い
現在の用途では REST API が適切です。必要に応じてHTTP API版のテンプレートも作成できます。
APIGatewayは少し意地悪して聞いてみましたが、きちんと回答してくれました。
API Gatewayについては回答できるかどうかを検証する意図で質問しましたが、適切に回答が得られました。
Pythonは3.12にアップデートされましたが、2025年9月18日時点では3.13が利用可能であるため、期待した結果としてはあと一歩というところです。
>pythonは現在3.13が最新で提供されているようです。調べてみて問題がなければ修正してください。
⏺ AWS Lambdaで現在サポートされているPythonバージョンを確認します。
⏺ Web Search("AWS Lambda Python runtime versions 2025 latest supported")
⎿ Did 1 search in 18s
⏺ 確認しました。AWS LambdaでPython 3.13が2024年11月にサポート開始され、現在最新版として利用可能です。
⏺ Update(api-gateway-lambda-study.yaml)
⎿ Updated api-gateway-lambda-study.yaml with 1 addition and 1 removal
25 Type: 'AWS::Lambda::Function'
26 Properties:
27 FunctionName: 'study_test_name_HelloWorldFunction'
28 - Runtime: 'python3.12'
28 + Runtime: 'python3.13'
29 Handler: 'index.lambda_handler'
30 Role: !GetAtt LambdaExecutionRole.Arn
31 Code:
⏺ Lambda Pythonランタイムをpython3.13(最新版)に更新しました。
更新内容:
- Lambda Runtime: python3.12 → python3.13
Python 3.13は2024年11月にAWS Lambdaでサポート開始された最新バージョンで、Amazon Linux 2023ベースの provided.al2023
ランタイム上で動作し、最新の言語機能とパフォーマンス向上が利用できます。
無事にPython 3.13まで更新してくれました。
実行結果1: エラー
繰り返しのため省略。
実行結果2: 成功!
●lambda

●API Gateway

実際にAPIを起動したところ、期待通りにレスポンスが得られました。
$curl <https://xxxxxxx.execute-api.ap-northeast-1.amazonaws.com/prod>
{
"message": "Welcome to study_test_name API!",
"availableEndpoints": [
{
"method": "GET",
"path": "/"
},
{
"method": "GET",
"path": "/hello"
},
{
"method": "POST",
"path": "/hello"
}
],
"timestamp": "2025-09-19T06:50:13.749840"
}
$curl <https://xxxxxxx.execute-api.ap-northeast-1.amazonaws.com/prod/hello>
{
"message": "Hello from Lambda!",
"path": "/hello",
"method": "GET",
"timestamp": "2025-09-19T06:50:48.639152",
"requestId": "86716afb-19bd-4c00-8ba8-9d59092b787f",
"queryParams": {},
"requestBody": null
}
$curl <https://xxxxxxx.execute-api.ap-northeast-1.amazonaws.com/prod/hell>
{"message":"Missing Authentication Token"}
まとめ
Claude Codeを活用してAWS CloudFormationテンプレートの作成を検証した結果、期待通りに動作することを確認できました。
今回は単純な構成でしたが、複雑になればなるほどCloudFormationが使えるとインフラ構築の効率が大幅に向上し、品質も高く保つことができそうです。
Claude Codeの活用により導入ハードルが下がったように感じているので、今後のインフラ開発をより効率的に進められる可能性を実感できました。
参考
DevelopersIO(Koty Mousa 著):「AWS CloudFormation テンプレートを作ってもらおう!」 https://dev.classmethod.jp/articles/koty-mousa-ai-starter-claude-aws-cloudformation
Qiita(Nightley_dev 著):「CloudFormation使ってみた」
https://qiita.com/Nightley_dev/items/9ba1cf1744d8ae9fe021
DevelopersIO(Koty Mousa 著):「S3にアップロードしたAWS構成図をCloudFormationに変換するシステムを作ってみた」
https://dev.classmethod.jp/articles/bedrock-claude-convert-diagram-to-cfn