[PHP] Symfony でメモ帳アプリを作り Lambda でホストする
2026-09-26
Symfony でメモ帳アプリを作り AWS Lambda でホストします。 データは DynamoDB へ保存します。
構成
Lambda (Web Adapter + Function URL) DynamoDB
クライアントは Lambda Function URL を叩きます。 すると Lambda が起動します。Symfony へリクエストが流れ DynamoDB へ接続します。
コード
</>
メモ
Controller
MapQueryParameter にてクエリパラメータをマッピングします
DTO。リクエストボディをマッピングします。またレスポンスボディの構築にもDTOを使います
Repository。DynamoDB へデータを保存するため Doctrine ORM は使いません
SAM のテンプレート。DynamoDB テーブルと Lambda 関数を作成します
ローカル開発用のスクリプト。DynamoDB Local へテーブルを作成します
デプロイ
SAM CLI にてデプロイします。 構築されるリソースは Lambda, DynamoDB です。※template.yamlへ記載
sam build
sam deploy --guided
コマンドを実行すると、 Lambda 関数が作成されました。
関数URLが有効化されてます。
動作確認
関数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>'
ローカル開発
ローカル開発は 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 のテーブル設計をした。 その前提であれば、案外雑にテーブル設計してもいいんじゃないかと思えてきた。