📝

CloudFormation, SAM, CDK で Lambda をデプロイしてみた

に公開

AWS の IaC ツールで最小構成の Lambda をデプロイしてみました。

CloudFormation

よくある質問 - AWS CloudFormation | AWS

AWS CloudFormation は、開発や本運用に必要な、互いに関連する AWS およびサードパーティーのリソースコレクションを作成し、そのリソースを適切な順序かつ予測可能な方法でプロビジョニングおよび管理するためのサービスです。

AWS の IaC の代表サービスです。
YAML や JSON ファイルにコードでリソースを定義してデプロイできます。

今回のコードは以下の通りです。

AWSTemplateFormatVersion: "2010-09-09"
Description: "CloudFormation template for Lambda function deployment"

Resources:
  MyLambdaFunction:
    Type: AWS::Lambda::Function
    Properties:
      FunctionName: my-cloudformation-lambda
      Handler: index.handler
      Role: your-existing-lambda-role # 既存のIAMロールARNを指定
      Runtime: nodejs22.x
      Code:
        ZipFile: |
          exports.handler = async function (event) {
            // TODO implement
            const response = {
              statusCode: 200,
              body: JSON.stringify('Hello from Lambda!'),
            };
            return response;
          };

Role には Lambda 用に作成した既存の IAM ロール ARN を指定しています。
上記コードを任意の名称の yaml ファイルに保存します。
例: template.yaml

デプロイ手順はドキュメントの通りです。
CloudFormation コンソールからスタックを作成する - AWS CloudFormation

CloudFormation コンソールからスタックを作成する際、保存した yaml ファイルをアップロードします。

スタック名を入力し、その他の設定はデフォルト設定のままスタックを作成すると Lambda 関数が作成されます。

SAM

What is the AWS Serverless Application Model (AWS SAM)? - AWS Serverless Application Model

AWS Serverless Application Model (AWS SAM) is an open-source framework for building serverless applications using infrastructure as code (IaC).

サーバレスアプリケーションを IaC で構築することに特化したツールです。
SAM 独自の構文によって CloudFormation より簡潔なコードでデプロイできます。

ただし、SAM でサポートされているリソースは限られています。
List of Supported AWS Resources - AWS Serverless Application Repository

SAM では CloudFormation の文法との共存が可能なため、SAM でサポートされているリソースは SAM 構文、SAM でサポートされていないリソースは CloudFormation の構文で記載するという方法が可能です。
20190814_AWS-Blackbelt_SAM_rev.pdf

SAM は CloudFormation の拡張なので、通常の CloudFormation の文法と共存できる

今回のコードは以下の通りです。

template.yaml
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: SAM template for Lambda function deployment

Resources:
  MyLambdaFunction:
    Type: AWS::Serverless::Function
    Properties:
      FunctionName: my-sam-lambda
      Handler: index.handler
      Runtime: nodejs22.x
      Role: your-existing-lambda-role
      InlineCode: |
        exports.handler = async function (event) {
          // TODO implement
          const response = {
            statusCode: 200,
            body: JSON.stringify('Hello from Lambda!'),
          };
          return response;
        };

Role には Lambda 用に作成した既存の IAM ロール ARN を指定しています。
上記コードを template.yaml という名称のファイルに保存します。

デプロイ手順はドキュメントの通りです。
Introduction to deploying with AWS SAM - AWS Serverless Application Model

SAM でデプロイするためには AWS CLI や SAC CLI のインストールが必要なため、ドキュメントの前提条件をご確認ください。
AWS SAM prerequisites - AWS Serverless Application Model

今回は Cloud9 から以下のコマンドでデプロイしました。

$ sam build
$ sam deploy --guided
# 設定値はすべてデフォルト値でデプロイしました

デプロイ完了後、CloudFormation コンソールにスタックが作成され、Lambda 関数が作成されていることも確認できます。

CDK

What is the AWS CDK? - AWS Cloud Development Kit (AWS CDK) v2

The AWS Cloud Development Kit (AWS CDK) is an open-source software development framework for defining cloud infrastructure in code and provisioning it through AWS CloudFormation.

CDK はプログラミング言語で AWS リソースを定義できる OSS ツールです
TypeScript、JavaScript、Python、Java、C#/.Net、Go がサポートされているため、各言語の記法で AWS リソースを定義可能な点がメリットです。

今回は TypeScript で実装しました。

lib/cdk-lambda-project-stack.ts
import * as cdk from 'aws-cdk-lib';
import { Construct } from 'constructs';
import * as lambda from 'aws-cdk-lib/aws-lambda';
import * as iam from 'aws-cdk-lib/aws-iam';

export class CdkLambdaProjectStack extends cdk.Stack {
  constructor(scope: Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    const existingRole = iam.Role.fromRoleArn(
      this, 
      'ExistingRole', 
      'your-existing-lambda-role',
      { mutable: false }
    );
    
    new lambda.Function(this, 'MyLambdaFunction', {
      functionName: 'my-cdk-lambda',
      runtime: lambda.Runtime.NODEJS_22_X,
      handler: 'index.handler',
      role: existingRole,
      code: lambda.Code.fromInline(`
        exports.handler = async function (event) {
          // TODO implement
          const response = {
            statusCode: 200,
            body: JSON.stringify('Hello from Lambda!'),
          };
          return response;
        };
      `),
    });
  }
}

your-existing-lambda-role には Lambda 用に作成した既存の IAM ロール ARN を指定しています。
デプロイ手順については以下のブログもご参照ください。
今から始める CDK 入門 #1

今回は Cloud9 から以下のコマンドでプロジェクトの作成を行いました。

$ mkdir -p ~/.npm-global
$ npm config set prefix '~/.npm-global'
$ echo 'export PATH=~/.npm-global/bin:$PATH' >> ~/.bashrc
$ source ~/.bashrc
$ npm install -g typescript

$ mkdir cdk-lambda-project && cd cdk-lambda-project
$ cdk init app --language typescript

プロジェクト作成後、lib/cdk-lambda-project-stack.ts に上記コードを定義して保存します。
その後、以下のコマンドでデプロイします。

$ cdk synth

# 作業リージョンで初めて CDK を使用する場合のみ実行
$ cdk bootstrap

$ cdk deploy

デプロイ完了後、CloudFormation コンソールにスタックが作成され、Lambda 関数が作成されていることも確認できます。

まとめ

今回は AWS の IaC ツールで最小構成の Lambda をデプロイしてみました。
どなたかの参考になれば幸いです。

参考資料

Discussion