CloudFormationでLambdaのコード込みでデプロイしてみた

CloudFormationでLambdaのコード込みでデプロイしてみた

CloudFormation で Lambda 関数をデプロイする際、コードをテンプレートに直接書く方法と S3 の zip ファイルを参照する方法の 2 つを実際に試してみました。
2026.05.29

はじめに

こんにちは、山本 翔大です。
CloudFormation で Lambda 関数を作成する際、関数の設定だけでなくコードもテンプレート側で指定できます。
代表的なものとして、テンプレートにコードを直接書く方法と、S3 にアップロードした zip ファイルを参照する方法があります。
今回はこの 2 つの方法を、実際に試してみました。

Code.ZipFile

まずは Code.ZipFile を使って、CloudFormation テンプレートに Lambda のコードを直接書く方法を試します。
小さな検証用 Lambda 関数や、CloudFormation のカスタムリソース用 Lambda 関数に向いている方法です。

テンプレートの作成

まずローカルに inline-lambda.yaml を作成し、以下の内容を記述します。

AWSTemplateFormatVersion: '2010-09-09'
Description: Deploy Lambda with inline code using Code.ZipFile

Resources:
  InlineLambdaExecutionRole:
    Type: AWS::IAM::Role
    Properties:
      RoleName: cfn-inline-lambda-role
      AssumeRolePolicyDocument:
        Version: '2012-10-17'
        Statement:
          - Effect: Allow
            Principal:
              Service: lambda.amazonaws.com
            Action: sts:AssumeRole
      ManagedPolicyArns:
        - arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole

  InlineLambdaFunction:
    Type: AWS::Lambda::Function
    Properties:
      FunctionName: cfn-inline-lambda-demo
      Runtime: python3.12
      Handler: index.handler
      Role: !GetAtt InlineLambdaExecutionRole.Arn
      Timeout: 10
      Code:
        ZipFile: |
          def handler(event, context):
              name = event.get("name", "World")

              return {
                  "statusCode": 200,
                  "message": f"Hello, {name}! This Lambda was deployed with Code.ZipFile."
              }

Outputs:
  FunctionName:
    Description: Lambda function name
    Value: !Ref InlineLambdaFunction

Lambda のコードを書いているのは以下の部分です。

Code:
  ZipFile: |
    def handler(event, context):
        ...

ZipFile に Lambda のコードを直接書いています。
CloudFormation はインラインコードを index というファイル名で扱うため、ハンドラーは index.handler で指定しています。

スタックの作成

作成したテンプレートを使って、CloudFormation コンソールからスタックを作成します。
CloudFormation から「スタックの作成」をクリックし、「新しいリソースを使用」を選択します。
テンプレートの指定では「テンプレートファイルのアップロード」を選び、先ほど作成した inline-lambda.yaml をアップロードして次へ進みます。

stack-create-inline

スタックの詳細を指定する画面に進んだら、以下の設定を入力します。

  • スタック名: cfn-inline-lambda-demo

このテンプレートにはパラメータがないため、そのまま次へ進みます。
スタックオプションも特に変更せず、次の確認画面まで進んでください。
最後の確認画面では、今回のテンプレートで IAM ロールを作成するため、「AWS CloudFormation によって IAM リソースが作成される場合があることを承認します」にチェックを入れたうえで送信をクリックします。

ステータスが CREATE_COMPLETE になれば作成完了です。

作成した Lambda 関数を確認しコードを見てみるとテンプレートに記載したコードが反映されているのがわかります。

lambda-code-inline

Code.S3Bucket / S3Key

次に、Lambda のコードを zip ファイルにして S3 にアップロードし、CloudFormation からその zip ファイルを参照する方法を試してみます。
今回は単一のファイルで行いますが、複数ファイル構成や外部ライブラリを含めたい場合にも対応できます。

Lambda コードと zip ファイルの作成

まずは Lambda にデプロイするコードを用意します。
ローカルに lambda_function.py を作成し、以下の内容を記述します。

def handler(event, context):
    name = event.get("name", "World")

    return {
        "statusCode": 200,
        "message": f"Hello, {name}! This Lambda was deployed from an S3 zip file."
    }

作成したファイルを zip 化して function.zip という名前で保存します。

S3 バケットの作成とアップロード

次に、zip ファイルを置くための S3 バケットを作成します。
マネジメントコンソールから S3 を開き、以下の設定でバケットを作成してください。

  • バケット名: cfn-lambda-code-demo-20260529(任意の一意な名前)
  • リージョン: アジアパシフィック(東京) ap-northeast-1
  • その他: デフォルトのまま

バケットを作成したら、先ほどの function.zip をバケット直下にアップロードします。

s3-zip

テンプレートの作成

続いて CloudFormation テンプレートを作成します。
ローカルに s3-lambda.yaml を作成し、以下の内容を記述します。

AWSTemplateFormatVersion: '2010-09-09'
Description: Deploy Lambda with code from S3 zip

Parameters:
  CodeBucketName:
    Type: String
    Description: S3 bucket name for Lambda deployment package

  CodeS3Key:
    Type: String
    Description: S3 key for Lambda deployment package
    Default: function.zip

Resources:
  S3ZipLambdaExecutionRole:
    Type: AWS::IAM::Role
    Properties:
      RoleName: cfn-s3zip-lambda-role
      AssumeRolePolicyDocument:
        Version: '2012-10-17'
        Statement:
          - Effect: Allow
            Principal:
              Service: lambda.amazonaws.com
            Action: sts:AssumeRole
      ManagedPolicyArns:
        - arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole

  S3ZipLambdaFunction:
    Type: AWS::Lambda::Function
    Properties:
      FunctionName: cfn-s3zip-lambda-demo
      Runtime: python3.12
      Handler: lambda_function.handler
      Role: !GetAtt S3ZipLambdaExecutionRole.Arn
      Timeout: 10
      Code:
        S3Bucket: !Ref CodeBucketName
        S3Key: !Ref CodeS3Key

Outputs:
  FunctionName:
    Description: Lambda function name
    Value: !Ref S3ZipLambdaFunction

Lambda のコードを指定しているのは以下の部分です。

Code:
  S3Bucket: !Ref CodeBucketName
  S3Key: !Ref CodeS3Key

今回は直接コードを書かず、!Ref を使用して S3 バケット名と zip ファイルのオブジェクトキーを指定します。
具体的な値はスタック作成時に設定するため、今はパラメータ名だけ書いておきます。

スタックの作成

作成したテンプレートを使って、CloudFormation コンソールからスタックを作成します。
CloudFormation から「スタックの作成」をクリックし、「新しいリソースを使用」を選択します。
テンプレートの指定では「テンプレートファイルのアップロード」を選び、先ほど作成した s3-lambda.yaml をアップロードして次へ進みます。

スタックの詳細を指定する画面に進んだら、以下の設定を入力します。

  • スタック名: cfn-s3zip-lambda-demo
  • CodeBucketName: 先ほど作成した S3 バケット名
  • CodeS3Key: function.zip

parameter-code

スタックオプションは特に変更せず次へ進み、最後の確認画面で「AWS CloudFormation によって IAM リソースが作成される場合があることを承認します」にチェックを入れて送信をクリックします。

ステータスが CREATE_COMPLETE になれば作成完了です。

Lambda のコードを開くと、function.zip の中身が反映されています。

s3-lambda-code

おわりに

以上で、CloudFormation で Lambda をコード入りでデプロイする方法の紹介は終了です。
前回紹介した IaC ジェネレーター は Lambda のコードまで変換できないため、今回の方法を使って Lambda のコード部分をテンプレートに含めることもできます。
ぜひ前回の記事と合わせて試してみてください。

参考資料

https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/configuration-function-zip.html#configuration-function-cloudformation
https://qiita.com/kihoair/items/fe204fc8582946646d07

クラスメソッドオペレーションズ株式会社について

クラスメソッドグループのオペレーション企業です。

運用・保守開発・サポート・情シス・バックオフィスの専門チームが、IT・AIをフル活用した「しくみ」を通じて、お客様の業務代行から課題解決や高付加価値サービスまでを提供するエキスパート集団です。

当社は様々な職種でメンバーを募集しています。

「オペレーション・エクセレンス」と「らしく働く、らしく生きる」を共に実現するカルチャー・しくみ・働き方にご興味がある方は、クラスメソッドオペレーションズ株式会社 コーポレートサイト をぜひご覧ください。※2026年1月 アノテーション㈱から社名変更しました

この記事をシェアする

AWSのお困り事はクラスメソッドへ

関連記事