なるべく、簡潔にできるようにまとめてみました。
##前提
Mac
AWSアカウント作成済
Dockerインストール済
##手順
- Docker内で、PHPの実行環境を作り、それをzip化
- そのzipファイルをLambdaにアップロード
- API GatewayでAPI作成
##1. Docker内で、PHPの実行環境を作り、それをzip化
stackery/phplambdalayerというツールを使うと、makeコマンド一つで簡単にできました。
このツールには、PHPの実行環境をzip化するために必要なスクリプトや、Lambdaでカスタムランタイム自体を動作させるboostrapファイル等がまとめて入っている
$ git clone https://github.com/stackery/php-lambda-layer.git
$ cd php-lambda-layer
$ make php71.zip
php71.zip
というファイルが作成される
make php71.zip
の内容を見ると、
php71.zip:
docker run --rm -e http_proxy=${http_proxy} -v $(ROOT_DIR):/opt/layer lambci/lambda:build-provided /opt/layer/build.sh
- lambci/lambdaというlambda環境のDockerイメージを使っている
- そのイメージで起動したDockerコンテナ内で、build.shが実行されている
-
build.sh
の内容を見ると、Lambda用のPHP7.1実行環境を作って、zip化している
#!/bin/bash
# 依存関係により、php本体もここでインストールされている
yum install -y php71-mbstring.x86_64 zip php71-pgsql php71-mysqli
mkdir /tmp/layer
cd /tmp/layer
cp /opt/layer/bootstrap .
sed "s/PHP_MINOR_VERSION/1/g" /opt/layer/php.ini >php.ini
mkdir bin
cp /usr/bin/php bin/
mkdir lib
for lib in libncurses.so.5 libtinfo.so.5 libpcre.so.0; do
cp "/lib64/${lib}" lib/
done
cp /usr/lib64/libedit.so.0 lib/
cp /usr/lib64/libpq.so.5 lib/
cp -a /usr/lib64/php lib/
zip -r /opt/layer/php71.zip .
##2. 作成したzipファイルをLambdaにアップロード
ここから下は、全てAWSのコンソールでやりました。
####2-1. レイヤー作成
レイヤーは、実行環境をアップロードしておくことで、複数のLambda関数で利用できるようにするもの
- レイヤーを作成し、作成したzipファイルをアップロードする
- レイヤーバージョンARNは、後で使うため、メモっておく
####2-2. Lambda関数作成
- 「一から作成」
- ランタイム:「ユーザー独自のブートストラップを提供する」
- 「実行ロール」(IAMロール)も一緒に作成される
- すでにある3つのファイルは使わないため、削除。代わりに、以下のindex.phpを作成
<?php phpinfo(); ?>
####2-3. Lambda関数とレイヤーを結びつける
「レイヤーバージョンARNを提供」を選択し、上でメモった「レイヤーバージョンARN」を貼る
##3. API GatewayでAPI作成
「APIの作成」
- メソッドの作成:Any
- 「Lambdaプロキシ統合の使用」にチェックを入れる
- 最後にAPIのデプロイ(ステージ名入力。このステージは、アクセスするパスになる)
APIへのアクセスは、該当するLambda関数を選択→APIGatewayを選択すると、APIエンドポイントが表示され、ワンクリックでできる。