At the present time (04.04.2020) aws lambda does not support default php programs on their system, only supports languages like python, nodejs … if you want to use php code on lambda they We have to manually build the runtime of php to execute our code. This article I will guide you the steps necessary to run php code on each lambda field.
Build php runtime
Perform the following steps to build custom php runtime.
- Initialize EC2 instance amzn-ami-hvm-2018.03.0.20181129-x86_64-gp2 . Note that you must use the aws instance to perform this build runtime, you cannot build locally or any other server, if the build on another environment put into the lambda it will file error.
- The SSh enters the newly created ec2 server executing the following commands. Install the necessary packages:123sudo yum update -ysudo yum install autoconf bison gcc gcc-c++ openssl-devel libcurl-devel libxml2-devel libjpeg-devel libpng-devel php-mysqlnd php-zip php-devel php-gd php-mcrypt php-mbstring php-curl php-xml php-pear php-bcmath php-json -y
- Conducting PHP Compiling
- Download PHP 7.3 source1234mkdir ~/php-7.3-bincurl -sL https://github.com/php/php-src/archive/php-7.3.0.tar.gz | tar -xvzcd php-src-php-7.3.0
- Compiling1234./buildconf --force./configure --prefix=/home/ec2-user/php-7.3-bin/ --with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd --with-openssl --with-openssl-dir=/usr/include/openssl --with-curl --with-zlib --enable-mbstring --with-gd --with-jpeg-dir=/usr/lib64make install
This build operation takes a long time, please wait a bit After you have done this, it will create a load of folders in /home/ec2-user/php-7.3-bin/ directory for you, including a php file in the
~/php-7.3-bin/bin/php
directory~/php-7.3-bin/bin/php
, this is what you need to run php on each lambda field. Here you can download this~/php-7.3-bin/bin/php
do it locally. - Download PHP 7.3 source
- Next step, you create a directory structure as follows:
1 2 3 4 5 6 7 8 9 10 | /home/ec2-user/php-example/ +-- bin/ | +-- php* # là cái php đã build được |-- bootstrap* # ngang hàng với thư mục bin và src +-- src/ +-- hello.php |-- composer.json # ngang hàng với thư mục bin và src có 2 folder, 4 files tất cả (tý sẽ có thêm folder vendor) |
The file will have the following content:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 | // file bootstrap #!/opt/bin/php <span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token comment">// require vendors from layer</span> <span class="token keyword">require</span> <span class="token constant">__DIR__</span> <span class="token punctuation">.</span> <span class="token single-quoted-string string">'/vendor/autoload.php'</span> <span class="token punctuation">;</span> <span class="token comment">// require file with function basing on ENV configuration</span> <span class="token variable">$handlerFunction</span> <span class="token operator">=</span> <span class="token function">array_slice</span> <span class="token punctuation">(</span> <span class="token function">explode</span> <span class="token punctuation">(</span> <span class="token single-quoted-string string">'.'</span> <span class="token punctuation">,</span> <span class="token variable">$_ENV</span> <span class="token punctuation">[</span> <span class="token single-quoted-string string">'_HANDLER'</span> <span class="token punctuation">]</span> <span class="token punctuation">)</span> <span class="token punctuation">,</span> <span class="token operator">-</span> <span class="token number">1</span> <span class="token punctuation">)</span> <span class="token punctuation">[</span> <span class="token number">0</span> <span class="token punctuation">]</span> <span class="token punctuation">;</span> <span class="token keyword">require_once</span> <span class="token variable">$_ENV</span> <span class="token punctuation">[</span> <span class="token single-quoted-string string">'LAMBDA_TASK_ROOT'</span> <span class="token punctuation">]</span> <span class="token punctuation">.</span> <span class="token single-quoted-string string">'/src/'</span> <span class="token punctuation">.</span> <span class="token variable">$handlerFunction</span> <span class="token punctuation">.</span> <span class="token single-quoted-string string">'.php'</span> <span class="token punctuation">;</span> <span class="token comment">// Generate random number to test Lambda Execution Context</span> <span class="token variable">$sharedRandom</span> <span class="token operator">=</span> <span class="token function">rand</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token variable">$client</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name"> GuzzleHttp Client</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">while</span> <span class="token punctuation">(</span> <span class="token boolean">true</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$request</span> <span class="token operator">=</span> <span class="token function">getNextRequest</span> <span class="token punctuation">(</span> <span class="token variable">$client</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">try</span> <span class="token punctuation">{</span> <span class="token variable">$response</span> <span class="token operator">=</span> <span class="token variable">$handlerFunction</span> <span class="token punctuation">(</span> <span class="token variable">$request</span> <span class="token punctuation">[</span> <span class="token single-quoted-string string">'payload'</span> <span class="token punctuation">]</span> <span class="token punctuation">,</span> <span class="token variable">$sharedRandom</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span> <span class="token class-name"> Exception</span> <span class="token variable">$e</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">// Handle invocation error and notify Runtime API</span> <span class="token function">handleInvocationError</span> <span class="token punctuation">(</span> <span class="token variable">$client</span> <span class="token punctuation">,</span> <span class="token variable">$request</span> <span class="token punctuation">[</span> <span class="token single-quoted-string string">'invocationId'</span> <span class="token punctuation">]</span> <span class="token punctuation">,</span> <span class="token variable">$e</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">continue</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token function">sendResponse</span> <span class="token punctuation">(</span> <span class="token variable">$client</span> <span class="token punctuation">,</span> <span class="token variable">$request</span> <span class="token punctuation">[</span> <span class="token single-quoted-string string">'invocationId'</span> <span class="token punctuation">]</span> <span class="token punctuation">,</span> <span class="token variable">$response</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">function</span> <span class="token function">getNextRequest</span> <span class="token punctuation">(</span> <span class="token variable">$client</span> <span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token keyword">array</span> <span class="token punctuation">{</span> <span class="token variable">$response</span> <span class="token operator">=</span> <span class="token variable">$client</span> <span class="token operator">-</span> <span class="token operator">></span> <span class="token function">get</span> <span class="token punctuation">(</span> <span class="token single-quoted-string string">'http://'</span> <span class="token punctuation">.</span> <span class="token variable">$_ENV</span> <span class="token punctuation">[</span> <span class="token single-quoted-string string">'AWS_LAMBDA_RUNTIME_API'</span> <span class="token punctuation">]</span> <span class="token punctuation">.</span> <span class="token single-quoted-string string">'/2018-06-01/runtime/invocation/next'</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">return</span> <span class="token punctuation">[</span> <span class="token single-quoted-string string">'invocationId'</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token variable">$response</span> <span class="token operator">-</span> <span class="token operator">></span> <span class="token function">getHeader</span> <span class="token punctuation">(</span> <span class="token single-quoted-string string">'Lambda-Runtime-Aws-Request-Id'</span> <span class="token punctuation">)</span> <span class="token punctuation">[</span> <span class="token number">0</span> <span class="token punctuation">]</span> <span class="token punctuation">,</span> <span class="token single-quoted-string string">'payload'</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token function">json_decode</span> <span class="token punctuation">(</span> <span class="token punctuation">(</span> string <span class="token punctuation">)</span> <span class="token variable">$response</span> <span class="token operator">-</span> <span class="token operator">></span> <span class="token function">getBody</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">,</span> <span class="token boolean">true</span> <span class="token punctuation">)</span> <span class="token punctuation">]</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">function</span> <span class="token function">sendResponse</span> <span class="token punctuation">(</span> <span class="token variable">$client</span> <span class="token punctuation">,</span> <span class="token variable">$invocationId</span> <span class="token punctuation">,</span> <span class="token variable">$response</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$client</span> <span class="token operator">-</span> <span class="token operator">></span> <span class="token function">post</span> <span class="token punctuation">(</span> <span class="token single-quoted-string string">'http://'</span> <span class="token punctuation">.</span> <span class="token variable">$_ENV</span> <span class="token punctuation">[</span> <span class="token single-quoted-string string">'AWS_LAMBDA_RUNTIME_API'</span> <span class="token punctuation">]</span> <span class="token punctuation">.</span> <span class="token single-quoted-string string">'/2018-06-01/runtime/invocation/'</span> <span class="token punctuation">.</span> <span class="token variable">$invocationId</span> <span class="token punctuation">.</span> <span class="token single-quoted-string string">'/response'</span> <span class="token punctuation">,</span> <span class="token punctuation">[</span> <span class="token single-quoted-string string">'body'</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token variable">$response</span> <span class="token punctuation">]</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">function</span> <span class="token function">handleInvocationError</span> <span class="token punctuation">(</span> <span class="token variable">$client</span> <span class="token punctuation">,</span> <span class="token variable">$invocationId</span> <span class="token punctuation">,</span> <span class="token package">Exception</span> <span class="token variable">$e</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$client</span> <span class="token operator">-</span> <span class="token operator">></span> <span class="token function">post</span> <span class="token punctuation">(</span> <span class="token single-quoted-string string">'http://'</span> <span class="token punctuation">.</span> <span class="token variable">$_ENV</span> <span class="token punctuation">[</span> <span class="token single-quoted-string string">'AWS_LAMBDA_RUNTIME_API'</span> <span class="token punctuation">]</span> <span class="token punctuation">.</span> <span class="token single-quoted-string string">'/2018-06-01/runtime/invocation/'</span> <span class="token punctuation">.</span> <span class="token variable">$invocationId</span> <span class="token punctuation">.</span> <span class="token single-quoted-string string">'/error'</span> <span class="token punctuation">,</span> <span class="token punctuation">[</span> <span class="token single-quoted-string string">'body'</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token function">json_encode</span> <span class="token punctuation">(</span> <span class="token punctuation">[</span> <span class="token single-quoted-string string">'errorType'</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token single-quoted-string string">'CustomInvocationError'</span> <span class="token punctuation">,</span> <span class="token single-quoted-string string">'errorMessage'</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token variable">$e</span> <span class="token operator">-</span> <span class="token operator">></span> <span class="token function">getMessage</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">,</span> <span class="token single-quoted-string string">'stackTrace'</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token variable">$e</span> <span class="token operator">-</span> <span class="token operator">></span> <span class="token function">getTraceAsString</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">]</span> <span class="token punctuation">)</span> <span class="token punctuation">,</span> <span class="token single-quoted-string string">'headers'</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token punctuation">[</span> <span class="token double-quoted-string string">"Lambda-Runtime-Function-Error-Type"</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token double-quoted-string string">"Unhandled"</span> <span class="token punctuation">]</span> <span class="token punctuation">]</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> </span> |
# composer.json
1 2 3 4 5 6 7 8 | <span class="token punctuation">{</span> <span class="token property">"require"</span> <span class="token operator">:</span> <span class="token punctuation">{</span> <span class="token property">"guzzlehttp/guzzle"</span> <span class="token operator">:</span> <span class="token string">"^6.3"</span> <span class="token punctuation">,</span> <span class="token property">"aws/aws-sdk-php"</span> <span class="token operator">:</span> <span class="token string">"^3.99"</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> |
Finally, hello.php
1 2 3 4 5 | <span class="token keyword">function</span> <span class="token function">hello</span> <span class="token punctuation">(</span> <span class="token variable">$data</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token double-quoted-string string">"Hello, <span class="token interpolation"><span class="token punctuation">{</span> <span class="token variable">$data</span> <span class="token punctuation">[</span> <span class="token single-quoted-string string">'name'</span> <span class="token punctuation">]</span> <span class="token punctuation">}</span></span> !"</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> |
- Go to this directory to install the next content
- Install composer, many machines already have, then skip this step12curl -sS http://getcomposer.org/installer | php
- Install dependencies12php composer.phar install
- Create zip file to deploy code1234zip -r runtime.zip bin/ bootstrapzip -r vendor.zip vendor/zip -r hello.zip src/*
I explain each of these zip files in detail:- the runtime.zip is the php runtime for lambda to run the php code
- vendor.zip is php packages like guzzlehttp, aws-sdk-php, you can add any package for coding here.
- hello.zip is your source.
==> the runtime and vendor will upload it to the lambda layer’s section, and hellp.zip then pload into the function section.
At this step, if anyone knows how to deploy lambda, they can deploy it themselves, I will guide you to deploy new lambda using aws cli.
- You must first create a role for the lambda function AWSLambdaBasicExecutionRole and S3FullAccess policies
- Configure AWS CLI tool
- Create layers
- Custom runtime layer12aws lambda publish-layer-version --layer-name php-custom-runtime --zip-file fileb://runtime.zip
- Layer with vendor12aws lambda publish-layer-version --layer-name php-custom-runtime-vendor --zip-file fileb://vendor.zip
- Custom runtime layer
After running each of the above commands it will return you an version arn
you save this to create a function:
- Create function12345678aws lambda create-function--function-name hello--zip-file fileb://hello.zip--handler hello--role "{ARN_OF_CREATED_ROLE}"--runtime provided--layers "{ARN_OF_RUNTIME_LAYER}" "{ARN_OF_VENDOR_LAYER}"
ok to this step, you have finished deploying your fucntion lambda, now you need to log into the aws console to add trigger or perform the corresponding add operation.Document