[PHP] Symfony でメモ帳アプリを作り Lambda でホストする

2026-09-26
Symfony でメモ帳アプリを作り AWS Lambda でホストします。
データは DynamoDB へ保存します。
構成
Lambda (Web Adapter + Function URL)
DynamoDB
./sarch.png
クライアントは Lambda Function URL を叩きます。
すると Lambda が起動します。Symfony へリクエストが流れ DynamoDB へ接続します。
./sexample.png
コード
</>
1
メモ
Controller
MapQueryParameter にてクエリパラメータをマッピングします
DTO。リクエストボディをマッピングします。またレスポンスボディの構築にもDTOを使います
Repository。DynamoDB へデータを保存するため Doctrine ORM は使いません
SAM のテンプレート。DynamoDB テーブルと Lambda 関数を作成します
ローカル開発用のスクリプト。DynamoDB Local へテーブルを作成します
デプロイ
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 を立ち上げます。
</>
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 Local のセットアップをします。
docker compose up
docker compose exec app composer run setup:local
終わり
感想
コールドスタート何とかならんか..

データ量が少ないという前提で DynamoDB のテーブル設計をした。
その前提であれば、案外雑にテーブル設計してもいいんじゃないかと思えてきた。