aws-lambda-php-integration について
aws-lambda-php-integration は、Bref または標準の PHP を使って PHP・Symfony アプリを AWS Lambda にデプロイするパターンをまとめたスキルです。Lambda プロジェクトの構築や移行に向け、API Gateway、コールドスタート、デプロイ設定を扱います。
主な機能
- 01Bref と標準 PHP の方式を紹介
- 02Symfony アプリの Lambda 構成を説明
- 03API Gateway とイベントトリガーの設定を扱う
- 04コールドスタートと接続の最適化を提示
- 05デプロイ、テスト、セキュリティの指針を収録
活用シーン
- 01Symfony アプリを AWS Lambda に移行
- 02PHP の Lambda 関数や API を構築
- 03コールドスタートを最適化してデプロイを設定
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ giuseppe-trisciuoglio/ developer-kit --skill aws-lambda-php-integrationインストール後、Claude Code で/aws-lambda-php-integrationを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/best-practices.mdbref-lambda.mdexamples.mdpatterns.mdraw-php-lambda.mdserverless-deployment.mdtesting-lambda.md詳細
AWS Lambda PHP 統合
Bref フレームワークを使用して、PHP および Symfony アプリケーションを AWS Lambda にデプロイするためのパターンです。
概要
2 つのアプローチを利用できます。
- Bref フレームワーク - Symfony をサポートする、Lambda 上の標準的な PHP。組み込みルーティングに対応し、コールドスタートは 2 秒未満です
- Raw PHP - オーバーヘッドを最小限に抑え、最大限の制御が可能で、コールドスタートは 500 ミリ秒未満です
どちらも、本番環境に対応した設定で API Gateway 統合をサポートします。
使用する場面
- PHP で新しい Lambda 関数を作成する場合
- 既存の Symfony アプリケーションを Lambda に移行する場合
- コールドスタートのパフォーマンスを最適化する場合
- API Gateway または SQS/SNS イベントトリガーを設定する場合
- PHP Lambda のデプロイパイプラインをセットアップする場合
手順
1. アプローチを選択する
| アプローチ | コールドスタート | 最適な用途 | 複雑さ |
|---|---|---|---|
| Bref | 2 秒未満 | Symfony アプリ、機能が充実した API | 中 |
| Raw PHP | 500 ミリ秒未満 | シンプルなハンドラー、最大限の制御 | 低 |
2. プロジェクト構成
Bref を使用する Symfony の構成
my-symfony-lambda/
├── composer.json
├── serverless.yml
├── public/
│ └── index.php # Lambda entry point
├── src/
│ └── Kernel.php # Symfony Kernel
├── config/
│ ├── bundles.php
│ ├── routes.yaml
│ └── services.yaml
└── templates/
Raw PHP の構成
my-lambda-function/
├── public/
│ └── index.php # Handler entry point
├── composer.json
├── serverless.yml
└── src/
└── Services/
3. 実装
Bref を使用する Symfony:
// public/index.php
use Bref\Symfony\Bref;
use App\Kernel;
use Symfony\Component\HttpFoundation\Request;
require __DIR__.'/../vendor/autoload.php';
$kernel = new Kernel($_SERVER['APP_ENV'] ?? 'dev', $_SERVER['APP_DEBUG'] ?? true);
$kernel->boot();
$bref = new Bref($kernel);
return $bref->run($event, $context);
Raw PHP ハンドラー:
// public/index.php
use function Bref\Lambda\main;
main(function ($event) {
$path = $event['path'] ?? '/';
$method = $event['httpMethod'] ?? 'GET';
return [
'statusCode' => 200,
'body' => json_encode(['message' => 'Hello from PHP Lambda!'])
];
});
4. コールドスタートの最適化
- 遅延読み込み - 重いサービスの読み込みを必要になるまで延期します
- 未使用の Symfony 機能を無効にする - バリデーションとアノテーションを無効にします
- Composer のオートロードを最適化する - 本番環境ではクラスマップを使用します
- Bref の最適化済みランタイムを使用する - PHP 8.x の最適化を活用します
5. 接続管理
// Cache AWS clients at function level
use Aws\DynamoDb\DynamoDbClient;
class DatabaseService
{
private static ?DynamoDbClient $client = null;
public static function getClient(): DynamoDbClient
{
if (self::$client === null) {
self::$client = new DynamoDbClient([
'region' => getenv('AWS_REGION'),
'version' => 'latest'
]);
}
return self::$client;
}
}
ベストプラクティス
メモリとタイムアウト
- メモリ:Symfony は 512MB、Raw PHP は 256MB から始めます
- タイムアウト:コールドスタート用のバッファーとして、Symfony は 10~30 秒、Raw PHP は通常 3~10 秒で十分です
依存関係
{
"require": {
"php": "^8.2",
"bref/bref": "^2.0",
"symfony/framework-bundle": "^6.0"
},
"config": {
"optimize-autoloader": true,
"preferred-install": "dist"
}
}
エラー処理
try {
$result = processRequest($event);
return [
'statusCode' => 200,
'body' => json_encode($result)
];
} catch (ValidationException $e) {
return [
'statusCode' => 400,
'body' => json_encode(['error' => $e->getMessage()])
];
} catch (Exception $e) {
error_log($e->getMessage());
return [
'statusCode' => 500,
'body' => json_encode(['error' => 'Internal error'])
];
}
ロギング
error_log(json_encode([
'level' => 'info',
'message' => 'Request processed',
'request_id' => $context->getAwsRequestId(),
'path' => $event['path'] ?? '/'
]));
デプロイ
サーバーレス設定
# serverless.yml
service: symfony-lambda-api
provider:
name: aws
runtime: php-82
memorySize: 512
timeout: 20
package:
individually: true
exclude:
- '**/node_modules/**'
- '**/.git/**'
functions:
api:
handler: public/index.php
events:
- http:
path: /{proxy+}
method: ANY
デプロイと検証
# 1. Install Bref
composer require bref/bref --dev
# 2. Test locally (validate before deploy)
sam local invoke -e event.json
# 3. Deploy
vendor/bin/bref deploy
# 4. Verify deployment
aws lambda invoke --function-name symfony-lambda-api-api \
--payload '{"path": "/", "httpMethod": "GET"}' /dev/stdout
Symfony の完全な設定
# serverless.yml for Symfony
service: symfony-lambda-api
provider:
name: aws
runtime: php-82
stage: ${self:custom.stage}
region: ${self:custom.region}
environment:
APP_ENV: ${self:custom.stage}
APP_DEBUG: ${self:custom.isLocal}
iam:
role:
statements:
- Effect: Allow
Action:
- dynamodb:GetItem
- dynamodb:PutItem
Resource: '*'
functions:
web:
handler: public/index.php
timeout: 30
memorySize: 1024
events:
- http:
path: /{proxy+}
method: ANY
console:
handler: bin/console
timeout: 300
events:
- schedule: rate(1 day)
plugins:
- ./vendor/bref/bref
custom:
stage: dev
region: us-east-1
isLocal: false
制約と警告
Lambda の制限
- デプロイパッケージ:解凍後の最大サイズは 250MB(圧縮後は 50MB)
- メモリ:128MB~10GB
- タイムアウト:API Gateway では 29 秒、非同期処理では 15 分
- 同時実行数:デフォルトで 1000
PHP 固有の考慮事項
- コールドスタート:PHP のコールドスタートは中程度です。最適化されたランタイムには Bref を使用します
- 依存関係:composer.json を最小限に保ち、共有依存関係には Lambda Layers を使用します
- PHP バージョン:Lambda のパフォーマンスを最大限に高めるには、PHP 8.2 以降を使用します
- ローカルストレージなし:Lambda コンテナは一時的なものです。永続化には S3/DynamoDB を使用します
よくある落とし穴
- vendor フォルダーが大きい - 開発用の依存関係を除外し、--no-dev を使用します
- セッションストレージ - ローカルファイルストレージは使用せず、DynamoDB を使用します
- 長時間実行プロセス - Lambda には適していません。代わりに ECS を使用します
- WebSocket - 代わりに API Gateway WebSockets または AppSync を使用します
セキュリティに関する考慮事項
- 認証情報をハードコードせず、IAM ロールと SSM Parameter Store を使用します
- すべての入力データを検証します
- 最小権限の IAM ポリシーを使用します
- 監査ログ用に CloudTrail を有効にします
- 適切な CORS ヘッダーを設定します
例
例 1:Symfony Lambda API を作成する
入力:「todo アプリケーション向けに、Bref を使用した Symfony Lambda REST API を作成してください」
手順:
composer create-projectで Symfony プロジェクトを初期化します- Bref をインストールします:
composer require bref/bref - serverless.yml を設定します
- config/routes.yaml でルートを設定します
- ローカルでテスト:
sam local invoke - デプロイ:
vendor/bin/bref deploy - 検証:
aws lambda invoke --function-name <name> --payload '{}'
出力: REST API、DynamoDB 統合、デプロイ設定を含む、完全な Symfony プロジェクト構成
例 2:Symfony のコールドスタートを最適化する
入力:「Symfony Lambda のコールドスタートに 5 秒かかります。どうすれば最適化できますか?」
手順:
- 起動時に読み込まれるサービスを分析します
- 未使用の Symfony 機能(バリデーション、アノテーション)を無効にします
- 重いサービスに遅延読み込みを使用します
- Composer のオートロードを最適化します
- 測定: デプロイして呼び出し、コールドスタートが 2 秒未満であることを確認します
出力: コールドスタートが 2 秒未満になるようにリファクタリングされた Symfony 設定
例 3:GitHub Actions でデプロイする
入力:「Serverless Framework を使用して Symfony Lambda の CI/CD を設定する」
手順:
- GitHub Actions のワークフローを作成します
- Composer を使用して PHP 環境をセットアップします
- PHPUnit テストを実行します
- Serverless Framework でデプロイします
- 検証:Lambda 関数が存在し、応答することを確認します
**出力:**複数ステージのパイプラインとテスト自動化を備えた、完全な .github/workflows/deploy.yml
参考資料
- Bref Lambda - Bref の完全なセットアップ、Symfony の統合、ルーティング
- Raw PHP Lambda - 最小限のハンドラーパターン、キャッシュ、パッケージ化
- Serverless Deployment - Serverless Framework、SAM、CI/CD パイプライン
- Testing Lambda - PHPUnit、SAM Local、統合テスト