たけまるの日記

たけまるの日記です。web関係の技術ネタが多いですが、好きなことを適当に書いています。

AWS LambdaでPHP動かしてみた

やること

何を書こうか頭を捻っていたのですが、ちょうど良くネタが降ってきたので便乗してみます。

re:Invent 2019 で発表された製品・機能一覧 | AWS

昨今サーバーレスアーキテクチャという言葉を聞くようになりました。 従来は何らかのサービスを提供するためには、いつでもリクエストを処理できるようサーバーを常時起動させておく必要がありました。 サーバーレスアーキテクチャではリクエストが発生してからコンピュータリソースが割り当てられるため、用意していたリソースが使われずに無駄になるという事がなくなる、といった仕組みです。 たとえばVPSを1台借りていれば月額いくらという料金がかかりますが、仮に1度もリクエストが無くても料金が発生します。 サーバーレスアーキテクチャであればリクエストの量に応じて課金になるため、無駄が発生しにくくなるわけです。 また、サーバーというサイズの決まった箱を用意しなくて済むので、急激なサービス拡大によってリクエスト量が増えても対応しやすい、というメリットもあります。

LambdaはAWS(AmazonWebServices)が提供する、サーバーレスアーキテクチャを実現するサービスです。 対応している言語が限られていましたが、先日ついにPHPも利用できるようになり、PHPerのワイ大歓喜といったところでございます。

今回は簡単なPHPプログラムをLambdaにデプロイし、動作を確認するところまでをやってみました。

環境

  • macos 10.13.6
  • AWSのアカウントを用意しておく

事前準備

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

コンテンツの準備

基本的には

github.com

の内容そのままです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()を動かすことに

src/php/index.php

<?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()の画面が出れば成功です

f:id:takemaru123:20181206000945p:plain

まとめ

本当はもう少しいろいろやりたかったのですが、環境構築に手間取り時間がなくなってしまいました。

実際動かしてわかったのですが、最初はCakePHPでも動かしてみるかと思ったのですが、mbstring等の必要なライブラリが入っておらずそのままでは動かなそうです。

このあたりが今後の課題だと思いますが、折角ですので徐々に実案件でも使えるようにしていきたいと思います!

参考

github.com

wp-kyoto.net

qiita.com