mcpField
A
aws-lambda-php-integration

aws-lambda-php-integration

github.com/giuseppe-trisciuoglioクラウド・DevOps3653.5k 回インストール7 週間前に更新
リポジトリ

aws-lambda-php-integration について

aws-lambda-php-integration は、Bref または標準の PHP を使って PHP・Symfony アプリを AWS Lambda にデプロイするパターンをまとめたスキルです。Lambda プロジェクトの構築や移行に向け、API Gateway、コールドスタート、デプロイ設定を扱います。

主な機能

  1. 01Bref と標準 PHP の方式を紹介
  2. 02Symfony アプリの Lambda 構成を説明
  3. 03API Gateway とイベントトリガーの設定を扱う
  4. 04コールドスタートと接続の最適化を提示
  5. 05デプロイ、テスト、セキュリティの指針を収録

活用シーン

  1. 01Symfony アプリを AWS Lambda に移行
  2. 02PHP の Lambda 関数や API を構築
  3. 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.md
bref-lambda.md
examples.md
patterns.md
raw-php-lambda.md
serverless-deployment.md
testing-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. アプローチを選択する
アプローチコールドスタート最適な用途複雑さ
Bref2 秒未満Symfony アプリ、機能が充実した API中
Raw PHP500 ミリ秒未満シンプルなハンドラー、最大限の制御低
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. コールドスタートの最適化
  1. 遅延読み込み - 重いサービスの読み込みを必要になるまで延期します
  2. 未使用の Symfony 機能を無効にする - バリデーションとアノテーションを無効にします
  3. Composer のオートロードを最適化する - 本番環境ではクラスマップを使用します
  4. 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 を使用します
よくある落とし穴
  1. vendor フォルダーが大きい - 開発用の依存関係を除外し、--no-dev を使用します
  2. セッションストレージ - ローカルファイルストレージは使用せず、DynamoDB を使用します
  3. 長時間実行プロセス - Lambda には適していません。代わりに ECS を使用します
  4. WebSocket - 代わりに API Gateway WebSockets または AppSync を使用します
セキュリティに関する考慮事項
  • 認証情報をハードコードせず、IAM ロールと SSM Parameter Store を使用します
  • すべての入力データを検証します
  • 最小権限の IAM ポリシーを使用します
  • 監査ログ用に CloudTrail を有効にします
  • 適切な CORS ヘッダーを設定します

例

例 1:Symfony Lambda API を作成する

入力:「todo アプリケーション向けに、Bref を使用した Symfony Lambda REST API を作成してください」

手順:

  1. composer create-project で Symfony プロジェクトを初期化します
  2. Bref をインストールします:composer require bref/bref
  3. serverless.yml を設定します
  4. config/routes.yaml でルートを設定します
  5. ローカルでテスト: sam local invoke
  6. デプロイ: vendor/bin/bref deploy
  7. 検証: aws lambda invoke --function-name <name> --payload '{}'

出力: REST API、DynamoDB 統合、デプロイ設定を含む、完全な Symfony プロジェクト構成

例 2:Symfony のコールドスタートを最適化する

入力:「Symfony Lambda のコールドスタートに 5 秒かかります。どうすれば最適化できますか?」

手順:

  1. 起動時に読み込まれるサービスを分析します
  2. 未使用の Symfony 機能(バリデーション、アノテーション)を無効にします
  3. 重いサービスに遅延読み込みを使用します
  4. Composer のオートロードを最適化します
  5. 測定: デプロイして呼び出し、コールドスタートが 2 秒未満であることを確認します

出力: コールドスタートが 2 秒未満になるようにリファクタリングされた Symfony 設定

例 3:GitHub Actions でデプロイする

入力:「Serverless Framework を使用して Symfony Lambda の CI/CD を設定する」

手順:

  1. GitHub Actions のワークフローを作成します
  2. Composer を使用して PHP 環境をセットアップします
  3. PHPUnit テストを実行します
  4. Serverless Framework でデプロイします
  5. 検証:Lambda 関数が存在し、応答することを確認します

**出力:**複数ステージのパイプラインとテスト自動化を備えた、完全な .github/workflows/deploy.yml

参考資料

  • Bref Lambda - Bref の完全なセットアップ、Symfony の統合、ルーティング
  • Raw PHP Lambda - 最小限のハンドラーパターン、キャッシュ、パッケージ化
  • Serverless Deployment - Serverless Framework、SAM、CI/CD パイプライン
  • Testing Lambda - PHPUnit、SAM Local、統合テスト

コメント