写点什么

动手 lambda 新功能,custom runtime

  • 2019-10-12
  • 本文字数:2809 字

    阅读完需:约 9 分钟

动手 lambda 新功能,custom runtime

什么是 lambda custom runtime

背景

lambda 原来只能支持有限的语言种类,包括 node.js, python, .Net, Go, java, ruby 等。


如果需要在 Lambda 上运行不支持的语言或者二进制文件该怎么办呢?原先有一种比较有趣的方案,其实就是用已经支持的语言来写一个代理,包装在不被支持的语言的二进制运行文件之上。(参考 在 lambda 上运行其他语言)


而 lambda custom runtime 就是正统的这个问题的解决方案。


AWS 新出的官方对于 c++和 rust 的支持其实都是基于 custom runtime 来实现的,底层都使用了 runtime API 技术。


  • rust runtime

  • cpp runtime

什么是 runtime API

runtime API 是 aws lambda 所提供的 http API, 帮助 custom runtime 监听 lambda 的触发事件,和返回处理结果。


runtime API 一共有 4 个 API 接口:


触发事件监听


HTTP 请求类型: GET


HTTP 请求路径: /runtime/invocation/next


curl “http://${AWS_LAMBDA_RUNTIME_API}/2018-06-01/runtime/invocation/next”


返回正常处理结果


HTTP 请求类型: POST


HTTP 请求路径: /runtime/invocation/AwsRequestId/response


REQUEST_ID=156cb537-e2d4-11e8-9b34-d36013741fb9
curl -X POST "http://${AWS_LAMBDA_RUNTIME_API}/2018-06-01/runtime/invocation/$REQUEST_ID/response" -d "SUCCESS"
复制代码

返回处理异常

HTTP 请求类型: POST


HTTP 请求路径: /runtime/invocation/AwsRequestId/error


REQUEST_ID=156cb537-e2d4-11e8-9b34-d36013741fb9
ERROR="{\"errorMessage\" : \"Error parsing event data.\", \"errorType\" : \"InvalidEventDataException\"}"
curl -X POST "http://${AWS_LAMBDA_RUNTIME_API}/2018-06-01/runtime/invocation/$REQUEST_ID/error" -d "$ERROR"
复制代码

返回初始化错误

HTTP 请求类型: POST


HTTP 请求路径: /runtime/init/error


REQUEST_ID=156cb537-e2d4-11e8-9b34-d36013741fb9
ERROR="{\"errorMessage\" : \"Failed to load function.\", \"errorType\" : \"InvalidFunctionException\"}"
curl -X POST "http://${AWS_LAMBDA_RUNTIME_API}/2018-06-01/runtime/init/error" -d "$ERROR"
复制代码

runtime API 的使用

runtime API 的使用流程一般是:


1.循环监听触发事件监听 API


2.对每次事件,使用相对应自定义代码处理


3.根据处理的成功和失败,使用相对应的返回 API 返回结果


4.将以上这些逻辑打包成为一个 bootstrap 可执行文件,上传到 lambda


接下来的小实验会帮助大家动手理解 runtime API 的使用方式,大家也可以之后参考 rust runtime 的实现方式

小实验

1.用 custom runtime 跑 bash 脚本


2.用 layer 分离 runtime 和 lambda 方法


3.用 custom runtime 跑 php 脚本

用 custom runtime 跑 bash 脚本

这个小实验当中,我们参考官方教程创建一个 bash 的 custom runtime,实现简单的直接 echo 返回事件输入数据的功能。


1.创建 bootstrap 和 function 代码


bootstrap


#!/bin/sh

set -euo pipefail

# Initialization - load function handler
source $LAMBDA_TASK_ROOT/"$(echo $_HANDLER | cut -d. -f1).sh"

# Processing
while true
do
HEADERS="$(mktemp)"
# Get an event
EVENT_DATA=$(curl -sS -LD "$HEADERS" -X GET "http://${AWS_LAMBDA_RUNTIME_API}/2018-06-01/runtime/invocation/next")
REQUEST_ID=$(grep -Fi Lambda-Runtime-Aws-Request-Id "$HEADERS" | tr -d '[:space:]' | cut -d: -f2)

# Execute the handler function from the script
RESPONSE=$($(echo "$_HANDLER" | cut -d. -f2) "$EVENT_DATA")

# Send the response
curl -X POST "http://${AWS_LAMBDA_RUNTIME_API}/2018-06-01/runtime/invocation/$REQUEST_ID/response" -d "$RESPONSE"
donefunction.sh
function handler () {
EVENT_DATA=$1
echo "$EVENT_DATA" 1>&2;
RESPONSE="Echoing request: '$EVENT_DATA'"

echo $RESPONSE}
复制代码


打包 bootstrap 和 function.sh 到一个 zip 文件。


注意: bootstrap 和 function.sh 都需要配置成为可执行文件, 大家也可以直接使用我已经打包好的 zip


3.在控制台创建 lambda 并上传 zip 文件


创建 lambda



上载 zip 包



创建测试案例并测试



测试



用 layer 分离 runtime 和 lambda 方法


这个小实验中,我们在实验 1 的基础上面把 bash 的 custom runtime 分离到 lambda layer(什么是 layer?)上去。


因为 layer 是可以和多个 lambda 分享的,所以以后我们要写一个 bash 的 lamda 程序,只需要写一下自己的function.sh,然后再在该 lambda 上加入 bash custom runtime layer 就可以直接工作了!


1.创建 lambda


和实验一中的步骤一样创建 lambda, 唯一的区别在于上载的zip包中现在只包含funtion.sh


大家可以直接使用我已经打包好的 function_only.zip


2.打包 layer 代码


单独打包 bootstrap 代码到 runtime.zip 大家可以直接使用我已经打包好的 runtime.zip


3.创建 layer



记录下 layer 的 ARN



添加 layer 到 lambda



注意:添加过程中请选择“提供层版本 ARN”, 并填写刚才记录下的 layer 的 ARN



5.测试


和实验一中的测试步骤和结果相同

用 custom runtime 跑 php 脚本

在本实验当中,我们借用 stackery 分享的 php custom runtime 来跑 PHP 的脚本,实现简单的 hello world 功能。


1.创建 lambda


创建 index.php 代码


Hello World! You've reached <?php print($_SERVER['REQUEST_URI']); ?>
复制代码


如实验 1,2 一样创建 lambda,打包 index.php,并上传。 大家可以直接使用我打包好的 function_php.zip


注意:处理程序项要填写成 index.php


添加 php custom 层


如实验 2 中一样在 lambda 上添加层。


大家可以直接使用我分享在中国北京区的 php 层。(arn:aws-cn:lambda:cn-north-1:074481125102:layer:stackery_php:1)



也可以自己如实验 2 一样创建新的 php custom 层。


关于创建 php custom 层时所需要使用的 zip 包,大家可以根据 stackery 文档编译 custom runtime,或直接下载我打包编译好的 php71.zip


3.创建测试案例并测试


创建测试案例,选择 API gateway lambda proxy 模板。 注意:我们现在使用的 stackery php 层,默认识别的请求格式为 API gateway lambda proxy 格式。如果格式不同,需要修改配置或者 runtime 代码。



测试结果



后话


custom runtime 通过 runtime API 的形式让 lambda 有了无限的可能性。什么是以前 lambda 不能做,现在却能做的事情呢?欢迎大家发挥想象,一起玩起来!


相关文章:


runtime api: https://docs.aws.amazon.com/zh_cn/lambda/latest/dg/runtimes-api.html


创建 custom runtime 官方教程: https://docs.aws.amazon.com/zh_cn/lambda/latest/dg/runtimes-walkthrough.html


作者介绍:


任庆杰


AWS 解决方案架构师,无服务器专家。负责基于 AWS 的云计算方案架构的咨询和设计,同时致力于 AWS 云服务在国内和全球的应用和推广。在加入 AWS 前,拥有超过 7 年的软件开发和 IT 项目管理经验。


本文转载自 AWS 技术博客。


原文链接:


https://amazonaws-china.com/cn/blogs/china/lambda-new-function-custom-runtime/


2019-10-12 14:261220
用户头像

发布了 1852 篇内容, 共 119.6 次阅读, 收获喜欢 78 次。

关注

评论

发布
暂无评论
发现更多内容

VSCode常用快捷键大全|VSCode高级玩家宝典之第一篇

三钻

学习 程序员 效率工具 vscode 快捷键

docker-compose构建springcloud微服务项目

xcbeyond

Java Docker Docker-compose springboot

职业发展的迷茫与困境:你真的了解晋升机制吗?

伴鱼技术团队

职业规划 技术管理 技术交流 职业成长 技术人生

区块链技术在银行业的运用

CECBC

区块链 信息安全 金融

更优雅的编写JavaScript

三钻

Java 程序员 大前端 经验分享 ES6

解读CDN的应用场景与产品价值

阿里云Edge Plus

CDN

国家央行数字货币的优势与挑战

CECBC

数字货币 央行 商业银行

Lambda架构已死,去ETL化的IOTA才是未来

易观大数据

用“易于改编”原则,提升编程水平,写出更好的代码

三钻

程序员 大前端 后端 经验分享 编程风格

VSCode插件大全|VSCode高级玩家之第二篇

三钻

程序员 vscode 编辑器 插件 技巧

IDEA直连服务器,进行项目Docker部署,实现一键部署、启动

xcbeyond

Java Docker idea插件

CentOS7 下Docker安装、启动

xcbeyond

Docker 软件安装

憋再PS抠图了,3行代码给你安排的明明白白!

王坤祥

生产力 图像识别

DSN 主流项目调研 0——IPFS&&Filecoin白皮书总结

AIbot

区块链 分布式存储 分布式文件存储 IPFS Filecoin

DSN主流项目调研1——Storj和Arweave的简介

AIbot

分布式存储 区块链+ 分布式文件存储 Storj Arweave

前端必看的8个HTML+CSS技巧

三钻

Java html html5 css3 大前端

图解JavaScript——代码实现(六种异步方案,重点是Promise、Async、发布/订阅原理实现,真香)

执鸢者

原理 异步 Promise Async

Git分支管理策略及简单操作

王坤祥

git git flow

国内外低/零代码的有哪些代表?

代码制造者

编程语言 低代码 零代码 信息化 开发应用

【数据结构与算法】如何高效学习数据结构与算法

三钻

学习 数据结构与算法

6个高效学习编程的方法

三钻

学习 程序人生 大前端 后端

5大法则助你 成为更出色的开发者

三钻

学习 编程 程序员 敏捷开发 经验分享

【FCC前端教程】44关学习CSS与CSS3基础「一」

三钻

CSS css3 程序员 大前端

你真的懂怎么写`服务层`吗?

三钻

php 程序员 后端 服务 架构思维

VSCode配置同步|VSCode高级玩家宝典之第三篇

三钻

程序员 效率工具 vscode 开发工具

【第十周】学习笔记

Aldaron

【第十周作业】

Aldaron

SpringCloud服务注册与发现(Eureka)

xcbeyond

Java SpringCloud Eureka 服务注册与发现

【FCC前端教程】28关学会HTML与HTML5基础

三钻

CSS html 大前端

带你体验Vue2和Vue3开发组件有什么区别

三钻

Java Vue 大前端 Vue3 React

写给想学和在学编程的你们,学习编程的7个好处

三钻

学习 程序员 软件开发 编程之路 经验分享

动手 lambda 新功能,custom runtime_语言 & 开发_亚马逊云科技 (Amazon Web Services)_InfoQ精选文章