Try to run WordPress on AWS Lambda
Today, AWS announced a new feature about AWS Lambda. We can create Lambda function by custom runtime. So, I […]
目次
Today, AWS announced a new feature about AWS Lambda. We can create Lambda function by custom runtime.
So, I’ll try to create AWS Lambda using PHP runtime and put the WordPress.
Getting started
We can create PHP function by following project.
The example can deploy source code by SAM.
$ mkdir my-php-app
$ cd my-php-app
$ touch template.yaml
You can create SAM templage (template.yaml
) by following.
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
The property Layer
can define a custom library, and the example selected PHP layer.
Prepare PHP files
Next, we need to create php files.
$ mkdir -p src/server
$ touch src/server/router.php
And src/server/router.php
is following code.
<?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';
?>
And get WordPress source code and place these files.
$ wget https://github.com/WordPress/WordPress/archive/master.zip
$ unzip master.zip
$ mv WordPress-master/ src/server
The project directory is following structure.
$ 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
Deploy it!
Finally, we can deploy the function by SAM.
$ 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
The example does not include Output parameters, so we have to get the API endpoint from the API Gateway console. The resource name my-first-serverless-php-service
You can access by the following path. https://xxxxx.execute-api.us-east-1.amazonaws.com/Prod/index
But it does not works.
I’ve checked the log file. The returned value is following.
{
"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
}
The function returns Your PHP installation appears to be missing the MySQL extension which is required by WordPress.
Error.
So we have to add MySQL extensions into the function.
And the function executed a redirection.
[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
Conclusion
There are a lot of issues to run the WordPress into the AWS Lambda.
- Where should we place the wp-content files?
- How should we connect Aurora Serverless DB?
- How should we added some extensions to the Lambda?
If you interested the topic, please try it yourself!