LambdaでPHPが動くので、とりあえずWordPressをいれてみた
Lambdaがカスタムランタイム対応しましたね。PHPのLayerが公開されていましたので、恒例のやつをやってみましょう。 セットアップ LambdaでPHPを使う方法は以下のGitHubが参考になります。 PHP La […]
目次
Lambdaがカスタムランタイム対応しましたね。PHPのLayerが公開されていましたので、恒例のやつをやってみましょう。
セットアップ
LambdaでPHPを使う方法は以下のGitHubが参考になります。
プロジェクトの準備
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あたりとうまく繋げるのかの調整など、頑張ることは多そうです。
(だれかこの先頑張って)