目次
はじめに
AWS LambdaでPHPは使用できないのですが、どうしてもPHPで実装する必要があったのでAWSのドキュメントを見ながら作成しました。Amazon Linux 2023のDockerImageを使用してPHPのLambdaとして動く環境を構築します。
参考にしたURL:
コンテナ Lambda をカスタマイズして、自分好みの PHP イメージを作ろう !
Docker コンテナイメージを使用した PHP Lambda 関数の構築
環境構築
①DockerDesktopをインストール
②VSCodeインストール
③VSCodeにDocker関係の拡張機能インストール
私の環境は①~③はインストール済みだったので問題はなかったです。ローカル環境にPHPはインストール不要です。
ファイルは4ファイル作成します。
Dockerfile | Dockerコンテナ上でPHPを動かす環境 |
docker-compose.yml | Docker-composeの設定ファイル |
bootstrap | Lambdaの起動ファイル |
app.php | Lambdaの処理内容(本体) |
まずDockerfileを準備します。参考にしたURLではAmazonLinux2、PHP7.4で構築していましたが、どうせなら新しいほうがいいなと思いAmazonLinux2023、PHP8.3で構築します。PHPのインストール、composerのインストール、guzzelのインストールをしています。その後、ローカル環境からDocker環境へのファイル(ファイルに関しては後述)のコピーになります。最後の1行のCMD [ “app.handler” ]ですが、app.phpのhandler()関数を呼び出しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
# Lambda base image Amazon linux 2023 FROM public.ecr.aws/lambda/provided:al2023 # Install php RUN dnf install -y php php-devel php-json # Install Composer RUN curl -sS https://getcomposer.org/installer | /usr/bin/php -- --install-dir=/opt/ --filename=composer # Install Guzzle RUN cd /opt/ && /usr/bin/php /opt/composer require guzzlehttp/guzzle COPY runtime/bootstrap ${LAMBDA_RUNTIME_DIR} RUN chmod 0755 ${LAMBDA_RUNTIME_DIR}/bootstrap COPY app.php ${LAMBDA_TASK_ROOT} CMD [ "app.handler" ] |
docker-compose.ymlは本来は不要で私はdocker-composeで動かすために作成しました。Lambdaは1台のサーバーで済むのでdocker-composeは不要です。
1 2 3 4 5 6 7 8 |
services: php: container_name: php build: dockerfile: Dockerfile ports: - 9000:8080 platform: linux/x86_64 |
次にapp.php。今回はPHPで受け取ったjsonのHMAC-SHA256を出力する関数を作りました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
<?php function handler($event, $context) { echo json_encode($event['json']); $json = json_encode($event['json']); return response(hash_hmac("sha256", $json, 'abcdefghijklmn')); } function response($body) { $headers = array( "Content-Type"=>"application/json" ); return json_encode(array( "statusCode"=>200, "headers"=>$headers, "body"=>$body )); }さ |
最後にbootstrapを作成します。これはこのDockerがLambdaとして動作するためのファイルになります。参考にしたURLにあるbootstrapそのままで動きます。1点注意なのがbootstrapのはじめにGuzzleの読み込みを行うのでそのディレクトリだけDockerfileと合わせる必要があります。今回の場合は/opt/vendorがそれにあたります。
動作確認
VSCodeのターミナルを開いて以下のコマンドでコンテナを作成し、起動します。
コンテナ内でOSの確認とPHPのバージョンの確認をします。
HTTPリクエストを出して応答を確認します。VSCodeの拡張機能「REST Client」を使用してGETリクエストとPOSTリクエストを出してみます。
期待通りGETリクエストに対しては404 Not Found、POSTリクエストに対しては200 OKで渡したJSONに対するハッシュ値が帰ってきています。
おわりに
今回はDockerを使用してAWS LambdaのPHPで動作する環境を構築しました。あとはAmazonECRにプッシュしてLambdaをデプロイしてあげるとAWS Lambda上で動くようになります。
また今回はGuzzleを使用しましたが、BrefやLaravelを使ったやり方もあるようです。