📝

Lambda から CloudFormation スタックをデプロイしてみた

2025/01/11に公開

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_stackupdate_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