はじめに
以下に、ローカル開発、Docker使用、一括デプロイ、環境変数管理を実現する方法として、「AWS Serverless Application Model (SAM)」を使ってLambdaアプリケーションを構築する手順を紹介します。
なぜSAMが適しているのか?
- 一括管理が簡単:
- 複数のLambda関数を1つのテンプレートで管理。
- Dockerサポート:
- Lambda公式Dockerイメージをローカルで利用可能。
- 環境変数管理:
- SAMで環境変数を設定するか、
.env
ファイルを統合可能。
- SAMで環境変数を設定するか、
- 一括デプロイ:
- SAMで簡単に一括デプロイが可能。
手順
ディレクトリ構成
以下のようにプロジェクトを整理します。
lambda-application/
├── template.yaml # SAMテンプレート (Lambdaアプリケーション全体を定義)
├── .env # 環境変数ファイル (ローカル開発用)
├── src/ # Lambda関数のソースコード
│ ├── index.ts
│ ├── handleWebhook.ts
├── dist/ # ビルド済みコード
├── package.json # 依存関係管理
├── package-lock.json
├── tsconfig.json # TypeScript設定
├── README.md
└── Dockerfile # Lambda用Dockerイメージの定義
template.yaml
の作成
template.yaml
では、各Lambda関数を一元管理します。
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Globals:
Function:
Runtime: nodejs20.x
Timeout: 10
MemorySize: 128
Environment:
Variables:
DATABASE_URL: !Ref DatabaseUrl
SHOPIFY_API_KEY: !Ref ShopifyApiKey
SHOPIFY_API_SECRET: !Ref ShopifyApiSecret
Resources:
ManagementApiFunction:
Type: AWS::Serverless::Function
Properties:
Handler: index.handlerApi
CodeUri: ./dist
Events:
ApiEvent:
Type: Api
Properties:
Path: /management-api
Method: POST
AfterOrderFunction:
Type: AWS::Serverless::Function
Properties:
Handler: index.handlerAfterOrder
CodeUri: ./dist
Events:
ApiEvent:
Type: Api
Properties:
Path: /after-order
Method: POST
CreateCustomerFunction:
Type: AWS::Serverless::Function
Properties:
Handler: index.handlerJotFormWebhook
CodeUri: ./dist
Events:
ApiEvent:
Type: Api
Properties:
Path: /create-customer
Method: POST
HandleWebhookFunction:
Type: AWS::Serverless::Function
Properties:
Handler: index.handlerWebhook
CodeUri: ./dist
Events:
ApiEvent:
Type: Api
Properties:
Path: /webhook
Method: POST
Parameters:
DatabaseUrl:
Type: String
Default: "postgres://user:password@localhost:5432/mydb"
ShopifyApiKey:
Type: String
Default: "your-shopify-api-key"
ShopifyApiSecret:
Type: String
Default: "your-shopify-api-secret"
Dockerfile の作成
Dockerを使ってローカルで開発するため、AWS Lambda公式イメージを使用します。
FROM public.ecr.aws/lambda/nodejs:20
# 必要なソースコードと依存関係をコピー
COPY package.json package-lock.json /var/task/
RUN npm install
COPY . /var/task/
# デフォルトのエントリーポイント
CMD ["index.handlerApi"]
環境変数の管理
.env
ファイルを作成し、ローカル開発時に使用します。
DATABASE_URL=postgres://user:password@localhost:5432/mydb
SHOPIFY_API_KEY=my-shopify-api-key
SHOPIFY_API_SECRET=my-shopify-api-secret
ローカル開発の実行
a) ローカルでLambdaを実行
SAM CLIでローカル開発環境を起動します。
sam build
sam local start-api --docker-network host
エンドポイント例
http://localhost:3000/management-api
http://localhost:3000/after-order
http://localhost:3000/create-customer
http://localhost:3000/webhook
b) Docker Composeを使って複数関数を起動
Docker Composeで個別にLambda関数を起動可能です。
一括デプロイ
すべてのLambda関数をAWSに一括デプロイします。
sam deploy --guided
デプロイ時の入力
- スタック名を指定(例:
kaq-shopify-stack
)。 - デプロイ先のAWSリージョンを指定(例:
us-east-1
)。 - 環境変数やデプロイ設定を保存。
デプロイ後の出力
デプロイが成功すると、各関数のAPI Gateway URLが出力されます。