aws lambda php,在AWS Lambda上运行脚本语言:PHP、Ruby和Go(外文翻译)

备注:Go已经在2018/01/15成为了AWS Lambda原生支持的语言,你能够从这里了解到更多信息aws.amazon.com/blogs/compu…node

在与合做伙伴与顾客一块儿的平常工做中,咱们看到过不少不一样领域、不一样寻常的专业技能和经验,以及不少不一样的编程语言。这些语言有些很老旧,而有一些很是前沿,不少团队都对它们的其中之一专研颇深,他们极可能想,在AWS上的新组件,好比AWS Lambda上也使用这些语言。react

Lambda自己对不少语言提供原生支持,例如Java、Node.js、Python和C#。在这篇文章中咱们想描述如何在Lambda中使用其余的脚本语言(非原生支持的)。c++

对于每个你想要使用的语言,你须要完成下面的任务:编程

准备: 从AMI启动一个实例,而后用SSH登录。json

编译: 打包你要在Lambda使用的语言windows

安装: 建立Lambda包并测试代码运行安全

每一个编程语言的准备和安装步骤基本相同,因此咱们在这里只提供PHP、Go、和Ruby的,一步一步编译打包的例子。ruby

准备开始前共通步骤

Lambda容许你在Lambda运行环境中执行任何可执行文件。下面的步骤只是一个如何运行PHP、Go、Ruby在Lambda上面的大框。无论怎么说,你仍是能够用这个方法,添加一些特定的库,扩展编译范围,使用JSON将你的Lambda函数和Amazon API Gateway或者其它服务互联。

在编译好二级制文件,并设定好基础文件结构以后,你就不须要再新建项目或者修改代码的时候重复作这些步骤。只须要简单编写代码接受STDIN的标准输入,而后输出结果到标准输出STDOUT,写好的Node.js包装器将会负责链接你的输入输出到运行环境。

为了简单起见,咱们仅演示准备PHP的步骤,但这些步骤一样适用于后面描述的其余运行环境。

在EC2控制台,选择Lanch instance,选择AMI时,请使用在Lambda Execution Environment and Available Libraries中的一个AMI,请设定你想要运行PHP代码和启动EC2的区域。有关更多信息,请参阅Step 1: Launch an Instance。

选择t2.large实例类型,它具备两个内核和8 GB内存,能够缩短PHP编译时间。

3306e3ff44f54f09c465a4d5a80aed62.png

选择Review and Launch,使用存储的默认值,而且把实例加入到一个只开放SSH访问的由向导生成的安全组中。

选择Launch继续;在启动对话框中,您能够为登陆选择现有的密钥对值,也能够建立一个新的密钥对值。在这个例子中,咱们建立一个名为php的新密钥对并下载它。

4a0ad0c9051d868c645f35fb60261b34.png

下载密钥后,命令行进入到文件所在的文件夹并运行如下命令:

chmod 400 php.pem

复制代码

基于SSH的安全标准,咱们必须修改秘钥权限。如今可使用EC2的公共DNS链接到实例。在控制台中选择实例并在屏幕右下方的公共DNS下查找实例,得到地址。

ssh -i php.pem ec2-user@[PUBLIC DNS]

复制代码

当实例启动并运行后,你就在一个适当的区域中有了一个适当AMI,你能够用上面的命令登录实例,继续执行其余步骤。

准备PHP运行环境

登陆到正在运行的AMI后,你能够从源代码编译PHP7环境,并准备好为Lambda环境打包。

给实例配置PHP

下一步是编译PHP7,将PHP7编译器的输出配置到指定目录,最后编译PHP7到Lambda AMI。

运行如下命令更新程序包管理器:

sudo yum update –y

复制代码

安装最少的必要的库,用于编译PHP7:

sudo yum install gcc gcc-c++ libxml2-devel -y

复制代码

安装依赖项后,您须要从PHP Downloads下载可用的PHP 7源代码。

在这个例子中,咱们在爱尔兰运行一台EC2,所以咱们选择了http://ie1.php.net/get/php-7.0.7.tar.bz2/from/this/mirror做为咱们的镜像。运行如下命令将源下载到实例,读者能够根据你的Instance所在的区域选择本身的镜像。

cd ~

wget http://ie1.php.net/distributions/php-7.0.7.tar.bz2 .

复制代码

使用如下命令提取文件:

tar -jxvf php-7.0.7.tar.bz2

复制代码

上面的命令在你的home目录中建立php-7.0.7文件夹,而后经过下面的命令,建立一个专用的php-7二进制文件。

mkdir /home/ec2-user/php-7-bin

cd php-7.0.7

./configure --prefix=/home/ec2-user/php-7-bin/

复制代码

这能够确保PHP编译很好地打包到您在home目录中建立的指定PHP文件夹中。请记住,咱们只在此处编译最基本PHP以减小Lambda函数的依赖。

你可使用./configure中提供的选项为Lambda中PHP二进制文件加入更多依赖项或者编译器选项。 运行./configure -h能够获取有关能够打包到PHP发行版中的内容的更多信息。但请记住,这将增长PHP二进制包的总体大小(可能影响PHP Lambda代码的总体启动时间,译者注)。

最后,运行如下命令,开始编译:

make install

复制代码

d0a0a2e66c650873044442ced4916377.png

编译完成后,能够经过运行如下命令快速确认PHP是否正常运行:

cd ~/php-7-bin/bin/

./php -v

PHP 7.0.7 (cli) (built: Jun 16 2016 09:14:04) ( NTS )

Copyright (c) 1997-2016 The PHP Group

Zend Engine v3.0.0, Copyright (c) 1998-2016 Zend Technologies

复制代码

代码时间

使用你最喜欢的编辑器,建立一个入口PHP文件,在这个例子中,咱们从Linux管道读取输入,获取一个简单的JSON文档,并计算此JSON数据的顶层节点数量,将结果输出stdout。

$data = stream_get_contents(STDIN);

$json = json_decode($data, true);

$result = json_encode(array('result' => count($json)));

echo $result."\n";

?>

复制代码

建立Lambda包

既然PHP的编译和准备已经就绪了,如今须要作的就是建立Lambda包,而后将Node.js包装器做为入口点。

首先,使用如下命令对二进制文件所在的php-7-bin文件夹进行tar压缩:

tar -zcvf php-7-bin.tar.gz php-7-bin/

复制代码

而后,退出远程主机,x运行下面的命令如下载压缩文件到本地计算机(Linux、OSX或者在windows上用相似WinSCP的工具)

scp -i php.pem ec2-user@[EC2_HOST]:~/php-7-bin.tar.gz .

复制代码

下载玩压缩包以后,新建一个Lambda项目,将全部文件解压缩到此文件夹中,项目的目录结构以下:

php-lambda

+-- php-7-bin

复制代码

下一步是建立一个Node.js包装器文件。该文件接受Lambda调用的输入,使用helloLambda.php做为参数调用PHP可执行文件,并经过Linux管道向PHP提供输入以进行处理。复制以下内容到php.js:

// Javascript

process.env['PATH'] = process.env['PATH'] + ':' + process.env['LAMBDA_TASK_ROOT'];

const spawn = require('child_process').spawn;

exports.handler = function(event, context) {

//var php = spawn('php',['helloLambda.php']); //local debug only

var php = spawn('php-7-bin/bin/php',['helloLambda.php']);

var output = "";

//send the input event json as string via STDIN to php process

php.stdin.write(JSON.stringify(event));

//close the php stream to unblock php process

php.stdin.end();

//dynamically collect php output

php.stdout.on('data', function(data) {

output+=data;

});

//react to potential errors

php.stderr.on('data', function(data) {

console.log("STDERR: "+data);

});

//finalize when php process is done.

php.on('close', function(code) {

context.succeed(JSON.parse(output));

});

}

//local debug only

//exports.handler(JSON.parse("{"hello":"world"}"));

复制代码

最终,全部文件结构以下:

php-lambda

+-- php-7-bin

-- helloLambda.php

-- php.js

复制代码

部署以前的最后一步是将项目压缩成能够上传到Lambda上的压缩包LambdaPHP.zip。若是你想,能够从php-7-bin / bin文件夹中删除没必要要的文件,如phpdebug,以减小压缩包的大小。 有关如何建立部署包的更多详细信息,请参阅文档。

译者总结

其实,使用Lambda运行PHP的原理很简单,Lambda自己不原生支持PHP,但其实Lambda的背后也是一台Linux的Instance。那么你要作的就是,用一台和Lambda运行环境同样的机器来编译PHP可执行文件,它能够执行PHP代码,而后在你的Lambda项目中包含这个PHP可执行文件。而后再以node.js为入口,启动PHP可执行文件,这个可执行文件会运行你指定的PHP脚本。在node.js的包装器中,将Lambda参数传递给标准输入,并等待标准输出的结果,获得结果后,将其做为Lambda的运行结果返回。 而在这个过程当中PHP代码会等待标准输入,处理,并将结果输出到标准输出。

原文还写了如何运行Go和Ruby在方法,由于跟运行PHP方式大同小异,因此在此就不作翻译,感兴趣的读者请阅读原文。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值