Lambdaアプリケーションの生成 – SAM+Docker

Shopify

はじめに

以下に、ローカル開発、Docker使用、一括デプロイ、環境変数管理を実現する方法として、「AWS Serverless Application Model (SAM)」を使ってLambdaアプリケーションを構築する手順を紹介します。

なぜSAMが適しているのか?

  1. 一括管理が簡単:
    • 複数のLambda関数を1つのテンプレートで管理。
  2. Dockerサポート:
    • Lambda公式Dockerイメージをローカルで利用可能。
  3. 環境変数管理:
    • SAMで環境変数を設定するか、.env ファイルを統合可能。
  4. 一括デプロイ:
    • 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

デプロイ時の入力

  1. スタック名を指定(例: kaq-shopify-stack)。
  2. デプロイ先のAWSリージョンを指定(例: us-east-1)。
  3. 環境変数やデプロイ設定を保存。

デプロイ後の出力

デプロイが成功すると、各関数のAPI Gateway URLが出力されます。

関連記事

カテゴリー

アーカイブ

Lang »