AWS LambdaでPHP動かしてみた
やること
何を書こうか頭を捻っていたのですが、ちょうど良くネタが降ってきたので便乗してみます。
re:Invent 2019 で発表された製品・機能一覧 | AWS
昨今サーバーレスアーキテクチャという言葉を聞くようになりました。 従来は何らかのサービスを提供するためには、いつでもリクエストを処理できるようサーバーを常時起動させておく必要がありました。 サーバーレスアーキテクチャではリクエストが発生してからコンピュータリソースが割り当てられるため、用意していたリソースが使われずに無駄になるという事がなくなる、といった仕組みです。 たとえばVPSを1台借りていれば月額いくらという料金がかかりますが、仮に1度もリクエストが無くても料金が発生します。 サーバーレスアーキテクチャであればリクエストの量に応じて課金になるため、無駄が発生しにくくなるわけです。 また、サーバーというサイズの決まった箱を用意しなくて済むので、急激なサービス拡大によってリクエスト量が増えても対応しやすい、というメリットもあります。
LambdaはAWS(AmazonWebServices)が提供する、サーバーレスアーキテクチャを実現するサービスです。 対応している言語が限られていましたが、先日ついにPHPも利用できるようになり、PHPerのワイ大歓喜といったところでございます。
今回は簡単なPHPプログラムをLambdaにデプロイし、動作を確認するところまでをやってみました。
環境
事前準備
AWS CLIのインストール
$ brew install awscli $ aws --version aws-cli/1.16.60 Python/3.7.1 Darwin/17.7.0 botocore/1.12.50 $ aws configure ※Credentialsの設定をする
AWS SAM CLIのインストール
$ brew tap aws/tap $ brew install aws-sam-cli $ sam --version SAM CLI, version 0.8.1
S3バケット作成(パッケージをデプロイするのに使う)
$ aws s3 mb s3://takemaru-lambda-test
コンテンツの準備
基本的には
の内容そのままですw
適当なディレクトリを作成します
$ mkdir -p test-lambda-php/src/php $ cd test-lambda-php
template.yaml ファイルを作成します
AWSTemplateFormatVersion: 2010-09-09 Description: My PHP Application Transform: AWS::Serverless-2016-10-31 Resources: phpserver: Type: AWS::Serverless::Function Properties: FunctionName: !Sub ${AWS::StackName}-phpserver Description: PHP Webserver CodeUri: src/php Runtime: provided Handler: index.php MemorySize: 3008 Timeout: 30 Tracing: Active Layers: - !Sub arn:aws:lambda:${AWS::Region}:887080169480:layer:php71:4 Events: api: Type: Api Properties: Path: /{proxy+} Method: ANY
実行するPHPプログラムを用意します
今回は超無難にphpinfo()を動かすことに
<?php phpinfo();
こんな感じのディレクトリ構造になりました
. ├── template.yaml └── src └── php └── index.php
次に作成した内容をパッケージ化しデプロイします
$ sam package \ --template-file template.yaml \ --output-template-file serverless-output.yaml \ --s3-bucket takemaru-lambda-test $ sam deploy \ --template-file serverless-output.yaml \ --stack-name testlambda2 \ --capabilities CAPABILITY_IAM
無事済んだらAWSコンソールのAPI Gatewayダッシュボードを確認し、APIのエンドポイントURLを確認します
https://xxxxx.execute-api.ap-northeast-1.amazonaws.com/Prod/index
アクセスしてphpinfo()の画面が出れば成功です
まとめ
本当はもう少しいろいろやりたかったのですが、環境構築に手間取り時間がなくなってしまいました。
実際動かしてわかったのですが、最初はCakePHPでも動かしてみるかと思ったのですが、mbstring等の必要なライブラリが入っておらずそのままでは動かなそうです。
このあたりが今後の課題だと思いますが、折角ですので徐々に実案件でも使えるようにしていきたいと思います!