LambdaでPHPが動いた! PHP Layer For AWS Lambdaを使って、kokexaの画像を動的にランダム表示 #reInvent #kokexa #lambda #php

記事タイトルとURLをコピーする

https://cdn-ak.f.st-hatena.com/images/fotolife/s/serverworks/20200711/20200711190039.png

こんにちは、サーバーワークスのこけしの人、坂本(@t_sakam)です。

re:Invent 2018のキーノートでLambdaの「Custom Runtimes」と「Layers」が発表されました。これにより、AWS公式での言語サポートではありませんが、パートナーの「Stackery」が公開している「PHP Layer For AWS Lambda」を使うことで、LambdaPHPが使えるので、簡単に試してみたいと思います。    LambdaとPHPを使って、先日デビューした「New kokexa dot」、通称「ejixa」の画像を動的にランダム表示するページを作ってみたいと思います。

New kokexa dotについてはこちら

http://blog.serverworks.co.jp/tech/2018/11/26/alexa/

手順

PHP Layer For AWS Lambda」に書いてある手順を参考に、足りないところは足しつつ進めてみます。

PHPをインストール

開発環境のEC2にPHPが入っていませんでしたので、yumでインストールします。バージョンは、7.1です。

$ sudo yum install php71

SAMをインストール

SAMも使ったことがなかったので、インストールします。

$ pip install --user aws-sam-cli

デプロイ用のS3バケットを作成

$ aws s3 mb s3://kokexa-php --region ap-northeast-1

開発用のディレクトリを作成して中へ

$ mkdir kokexa-php
$ cd kokexa-php

template.ymlファイル作成

 中身は、「PHP Layer For AWS Lambda」に載っているtemplate.ymlそのままです。

$ vim template.yml
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/server
      Runtime: provided
      Handler: index.php
      MemorySize: 3008
      Timeout: 30
      Tracing: Active
      Layers:
        - !Sub arn:aws:lambda:${AWS::Region}:887080169480:layer:php71:3
      Events:
        api:
          Type: Api
          Properties:
            Path: /{proxy+}
            Method: ANY

以下の構造になるようにディレクトリを追加

kokexa-phpディレクトリの構造

├── template.yaml
└── src
    └── server
        └── index.php

index.phpの作成

$ vim src/server/index.php
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>kokexa-php</title>
  </head>
  <body>
    <h1>New kokexa dot</h1>
<?php
$url = "https://s3-ap-northeast-1.amazonaws.com/xxx-xxx/";

$img01 = $url . "kokexa_01.jpg";
$img02 = $url . "kokexa_02.jpg";

$img = array($img01, $img02);
$rand = rand(0, 1);
?>
    <img src = <?php echo $img[$rand]; ?>>
  </body>
</html>

 「xxx-xxx」というS3バケットにkokexaの画像が2枚置かれているイメージです。この2つをランダムに切り替えます。

デプロイ

$ sam package \
    --template-file template.yaml \
    --output-template-file serverless-output.yaml \
    --s3-bucket kokexa-php

$ sam deploy \
    --template-file serverless-output.yaml \
    --stack-name kokexa-php \
    --capabilities CAPABILITY_IAM

アクセス

 API Gatewayのマネジメントコンソールで発行されたURLを確認して、アクセスしてみます。 https://cdn-ak.f.st-hatena.com/images/fotolife/s/serverworks/20200711/20200711185835.pnghttps://cdn-ak.f.st-hatena.com/images/fotolife/s/serverworks/20200711/20200711190045.pnghttps://cdn-ak.f.st-hatena.com/images/fotolife/s/serverworks/20200711/20200711190051.png  「https://xxxxxxxxxx.execute-api.ap-northeast-1.amazonaws.com/Prod/index.php」にアクセスすると、S3に置かれた2枚のkokexaの画像のどちらかが表示されるようになりました。  

まとめ

 今回は、「PHP Layer For AWS Lambda」を使って、LambdaでPHPを動かしてみました。これで、新しいkokexa dotの画像を簡単にランダムに表示できるようになりましたね!

 PHPはHTMLの中に簡単にコードを入れられるので、今回のようなちょっとした動的ページがこれからはLambdaでサクッと作れますね!

 いや〜、「PHP Layer For AWS Lambda」って本当にいいものですね!