[PHP] Symfony で REST API を作り Lambda へデプロイする

2026-09-27
Symfony で REST API を作り AWS Lambda でホストしました。
簡単なメモ帳アプリです。データは DynamoDB へ保存します。
構成
Lambda
DynamoDB
./sarch.png
Lambda は関数URLを有効化します。

クライアントから関数URLを呼ぶと、Lambda が起動して、
Symfony へリクエストが流れて DynamoDB へ接続する。という具合です。
./sexample.png
コード
</>
1
メモ
Controller
MapQueryParameter にてクエリパラメータをマッピングします
DTO。リクエストボディをマッピングします。またレスポンスボディの構築にもDTOを使います
Repository。DynamoDB へデータを保存するため Doctrine ORM は使いません
SAM のテンプレート。DynamoDB テーブルと Lambda 関数を作成します
ローカル開発用のスクリプト。DynamoDB Local へテーブルを作成します
デプロイ
AWS SAM CLI にてデプロイしました。
Lambda 関数や DynamoDB テーブルを構築します。※template.yamlへ記載
sam build
sam deploy --guided
./sdeployguide.png
コマンドを実行すると、
Lambda 関数が作成されました。
./slambda.png
関数URLが有効化されてます。
./slambdafunctionurl.png
動作確認
関数URLを curl で叩きます。
# 作成
curl -X POST 'https://xxx.on.aws/memos' --json '{"title":"aaa","description":"aaa aaa"}'

# 一覧
curl 'https://xxx.on.aws/memos'

# 一覧(キーワード検索)
curl 'https://xxx.on.aws/memos?q=aaa'

# 詳細
curl 'https://xxx.on.aws/memos/<id>'

# 更新
curl -X PUT 'https://xxx.on.aws/memos/<id>' --json '{"title":"aaa","description":"ccc ccc"}'

# 削除
curl -X DELETE 'https://xxx.on.aws/memos/<id>'
./sresult.png
ローカル開発
docker compose でローカル開発します。
DynamoDB のエミュレータとして DynamoDB Local を立ち上げます。
# コンテナを立ち上げ
docker compose up

# DynamoDB Local のセットアップ
docker compose exec app composer run setup:local
docker-compose.yml
</>
services:
  app:
    build:
      context: .
      dockerfile: Dockerfile
      target: local
    volumes:
      - .:/var/www/html
    ports:
      - 8000:8080
    environment:
      - AWS_ENDPOINT_URL_DYNAMODB=http://dynamodb-local:8000
      - AWS_REGION=ap-northeast-1
      - DYNAMODB_TABLE=memos
      - AWS_ACCESS_KEY_ID=local
      - AWS_SECRET_ACCESS_KEY=local
    depends_on:
      - dynamodb-local

  # see https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/DynamoDBLocal.DownloadingAndRunning.html
  dynamodb-local:
    image: amazon/dynamodb-local:latest
    command: ["-jar", "DynamoDBLocal.jar", "-inMemory", "-sharedDb"]
    ports:
      - 8001:8000

  dynamodb-admin:
    image: aaronshaf/dynamodb-admin:latest
    environment:
      - DYNAMO_ENDPOINT=http://dynamodb-local:8000
      - AWS_REGION=ap-northeast-1
      - AWS_ACCESS_KEY_ID=local
      - AWS_SECRET_ACCESS_KEY=local
    ports:
      - 8002:8001
    depends_on:
      - dynamodb-local
なお SAM CLI を使っているので、SAM Local にてローカル開発する手もあります。
が DynamoDB Local への接続にめんどくささを感じたため、あえて使わずに docker compose で開発しました。
おわり
感想
・コールドスタートあるのでなんとかしたいが..
・データ量が少ないという前提で DynamoDB のテーブル設計をした。
 その前提であれば、案外雑にテーブル設計してもいいんじゃないかと思えてきた。