LambdaでPHPが動くので、とりあえずWordPressをいれてみた

Lambdaがカスタムランタイム対応しましたね。PHPのLayerが公開されていましたので、恒例のやつをやってみましょう。 セットアップ LambdaでPHPを使う方法は以下のGitHubが参考になります。 PHP La […]

広告ここから
広告ここまで

目次

    Lambdaがカスタムランタイム対応しましたね。PHPのLayerが公開されていましたので、恒例のやつをやってみましょう。

    セットアップ

    LambdaでPHPを使う方法は以下のGitHubが参考になります。

    PHP Layer For AWS Lambda

    プロジェクトの準備

    SAMでデプロイできます。

    $ mkdir my-php-app
    $ cd my-php-app
    $ touch template.yaml

    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/server
          Runtime: provided
          Handler: router.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

    LayersにいれているARNがPHPをLambdaで実行するためのものです。

    PHPファイルの準備

    続いてLambdaで動かすPHPファイルを用意します。

    $ mkdir -p src/server
    $ touch src/server/router.php

    src/server/router.phpには以下のようにコードを書きます。

    <?php
    if (is_file($_SERVER['DOCUMENT_ROOT'].'/'.$_SERVER['SCRIPT_NAME'])) {
      // Serve static files directly
      return false;
    }
    
    // Run index.php for all requests
    $_SERVER['SCRIPT_NAME'] = '/index.php';
    require 'index.php';
    ?>

    WordPressをいれてみる

    いよいよですね。今回はとりあえずということで、GitHubからzipを落としてきて放り込みます。

    https://github.com/WordPress/WordPress/archive/master.zip

    $ wget https://github.com/WordPress/WordPress/archive/master.zip
    $ unzip master.zip
    $ mv WordPress-master/ src/server

    ディレクトリ構成はこのようになります。

    $ tree -L 3
    .
    ├── src
    │   └── server
    │       ├── index.php
    │       ├── license.txt
    │       ├── readme.html
    │       ├── router.php
    │       ├── wp-activate.php
    │       ├── wp-admin
    │       ├── wp-blog-header.php
    │       ├── wp-comments-post.php
    │       ├── wp-config-sample.php
    │       ├── wp-content
    │       ├── wp-cron.php
    │       ├── wp-includes
    │       ├── wp-links-opml.php
    │       ├── wp-load.php
    │       ├── wp-login.php
    │       ├── wp-mail.php
    │       ├── wp-settings.php
    │       ├── wp-signup.php
    │       ├── wp-trackback.php
    │       └── xmlrpc.php
    └── template.yaml
    

    デプロイする

    どうせちゃんと動かないというのは見えているので、とりあえずやるだけやってみましょう。

    $ sam package \
        --template-file template.yaml \
        --output-template-file serverless-output.yaml \
        --s3-bucket <your SAM deployment bucket created above>
    
    $ sam deploy \
        --template-file serverless-output.yaml \
        --stack-name my-first-serverless-php-service \
        --capabilities CAPABILITY_IAM

    サンプルのCloudFormationにはOutputが記載されていませんので、API Gatewayのコンソールからmy-first-serverless-php-serviceというAPIを探して、ダッシュボードからAPI URLを確認しましょう。

    あとはAPIにアクセスすればOKです。indexとか適当なパスをつけてアクセスしてみましょう。

    もちろん動きません。

    Lambdaのログを確認すると、以下のような出力でした。

    {
      "multiValueHeaders": {
        "Host": [
          "localhost:8000",
          "localhost:8000"
        ],
        "Date": [
          "Thu, 29 Nov 2018 18:35:22 +0000",
          "Thu, 29 Nov 2018 18:35:22 +0000"
        ],
        "Connection": [
          "close",
          "close"
        ],
        "X-Powered-By": [
          "PHP/7.1.7",
          "PHP/7.1.7"
        ],
        "Location": [
          "https://localhost:8000/index.php/path/to/wp-admin/setup-config.php"
        ],
        "Content-type": [
          "text/html; charset=UTF-8"
        ],
        "Content-Type": [
          "text/html; charset=utf-8"
        ]
      },
      "body": "Your PHP installation appears to be missing the MySQL extension which is required by WordPress.",
      "statusCode": 500
    }

    Your PHP installation appears to be missing the MySQL extension which is required by WordPress.とのことなので、MySQLエクステンションが必要な様子です。Layerを作るか探していれればいけるかもしれません。

    ちなみに以下のように302リダイレクトが走っている様子でした。

    [Thu Nov 29 18:35:22 2018] 127.0.0.1:40630 [302]: /path/to/resource
    [Thu Nov 29 18:35:22 2018] 127.0.0.1:40632 [500]: /index.php/path/to/wp-admin/setup-config.php

    初期化しようと頑張っているところが伺えますね。

    まとめ

    「ダメだろうな」とは思っていましたが、案の定でした。ただし必要なエクステンションを揃えれば動くようになるかもしれません。

    ただ、wp-content/配下をどこに保存させるのかとか、Aurora Serverlessあたりとうまく繋げるのかの調整など、頑張ることは多そうです。

    (だれかこの先頑張って)

    広告ここから
    広告ここまで
    Home
    Search
    Bookmark