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 の文法と共存できる
今回のコードは以下の通りです。
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 で実装しました。
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 をデプロイしてみました。
どなたかの参考になれば幸いです。
参考資料
- よくある質問 - AWS CloudFormation | AWS
- CloudFormation コンソールからスタックを作成する - AWS CloudFormation
- What is the AWS Serverless Application Model (AWS SAM)? - AWS Serverless Application Model
- List of Supported AWS Resources - AWS Serverless Application Repository
- 20190814_AWS-Blackbelt_SAM_rev.pdf
- Introduction to deploying with AWS SAM - AWS Serverless Application Model
- AWS SAM prerequisites - AWS Serverless Application Model
- What is the AWS CDK? - AWS Cloud Development Kit (AWS CDK) v2
- 今から始める CDK 入門 #1
Discussion