📝
Lambda から CloudFormation スタックをデプロイしてみた
CloudFormation で Lambda 関数を作成するという記事は多いものの、Lambda から CloudFormation スタックをデプロイする記事が少なかったので試してみました。
前提
- Lambda で使用する IAM ロールを作成済み
- AdministratorAccess を付与
Lambda 関数の作成
- 関数名: 任意
- ランタイム: Python 3.13
- アーキテクチャ: x86_64
- 実行ロール: 作成済みの IAM ロール
Lambda のコードは以下の通りです。
lambda_function.py
import json
import boto3
cf_client = boto3.client('cloudformation')
def lambda_handler(event, context):
json_open = open('vpc.json', 'r')
json_load = json.load(json_open)
json_load['Resources']['VPC']['Properties']['Tags'][0]['Value'] = "updated"
template_body = json.dumps(json_load)
response = cf_client.create_stack(
StackName="test",
TemplateBody=template_body
)
return response
後述の vpc.json を読み込んでタグの値だけ変更し、スタックを作成しています。
以下の vpc.json を lambda_function.py と同じディレクトリに作成します。
vpc.json
{
"AWSTemplateFormatVersion": "2010-09-09",
"Resources": {
"VPC": {
"Type": "AWS::EC2::VPC",
"Properties": {
"CidrBlock": "10.0.0.0/16",
"Tags": [
{
"Key": "Name",
"Value": "test"
}
]
}
}
}
}
関数をデプロイします。
テスト実行して成功すれば CloudFormation スタックがデプロイされ、VPC が作成されます。
スタック更新
任意のパラメータを変更して、create_stack
を update_stack
に変更すれば更新も可能です。
lambda_function.py
import json
import boto3
cf_client = boto3.client('cloudformation')
def lambda_handler(event, context):
json_open = open('vpc.json', 'r')
json_load = json.load(json_open)
# タグの値を hello に変更
json_load['Resources']['VPC']['Properties']['Tags'][0]['Value'] = "hello"
template_body = json.dumps(json_load)
response = cf_client.update_stack(
StackName="test",
TemplateBody=template_body
)
return response
ユースケース
CloudFormation スタックの作成や更新時に動的にパラメータを変更したいケースなどが考えられます。
まとめ
今回は Lambda から CloudFormation スタックをデプロイしてみました。
どなたかの参考になれば幸いです。
Discussion