10 月 23 - 25 日,QCon 上海站即将召开,现在购票,享9折优惠 了解详情
写点什么

动手 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:261373
用户头像

发布了 1927 篇内容, 共 154.3 次阅读, 收获喜欢 81 次。

关注

评论

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

5年经验,不会Java性能优化,面试原地翻车

程序员小毕

程序员 后端 JVM java面试 Java性能优化

复旦大学附属中山医院:利用明道云进行风险管理及器械溯源的实践案例分享

明道云

华为云CodeArts Artifact 5大特性,揭秘大型企业制品管理面纱

云计算 华为云 华为开发者大会2023

自从前端用上了低代码,开发速度直接起飞

伤感汤姆布利柏

和鲸科技 ModelWhale 入选北京市人工智能行业赋能典型案例(2023)丨2023全球数字经济大会人工智能高峰论坛

ModelWhale

人工智能 AI 数字化 大模型 论坛

华为开发者大会2023(Cloud):华为云邀您共话开源

华为云开源

开源 云原生 HDC.Cloud

通过容器化实现前端微服务化架构设计

FinFish

小程序容器 小程序化 小程序技术 前端服务化

高性能存储SIG月度动态:io_uring支持nvme直通,DSMS完成开发测试

OpenAnolis小助手

开源 io_uring 高性能存储 anck 龙蜥sig

多项目管理难在哪,多项目同时进行该如何做好进度管理?

优秀

项目管理 项目进度管理

国产软件崛起,用友引领企业数智化转型新风向

用友BIP

国产替代

DevOps|从腾讯TEG CDC解散聊技术中台价值和建设

laofo

DevOps 研发效能 技术中台 组织建设

[杂谈] pdfbox 2.0.28 文字水印移除操作(Acrobat/WPS)

alexgaoyh

Java PDF remove pdfbox text watermarker

华为云语音交互服务SIS——与人打交道的智慧软件,非常值得一试

平平无奇爱好科技

华为云图像识别Image:技术服务提供商的首选

平平无奇爱好科技

华为云视频封面&摘要服务:让视频内容更具吸引力

平平无奇爱好科技

​瓶颈期别挣扎了,低代码或许可以帮到你

伤感汤姆布利柏

追击策略?微软云服务器业务2022年规模少于亚马逊AWS一半

B Impact

第十八届研电赛“安谋科技杯”上海赛区决赛成功举办

脑极体

AI

想要快速上线网站?香港虚拟主机助你一臂之力!

一只扑棱蛾子

香港虚拟主机

复杂的舆论场,企业该如何保障内容审核安全?

平平无奇爱好科技

创新引擎加速数字时代:揭秘JNPF平台与云计算的完美共舞!

不在线第一只蜗牛

云计算 低代码 数字化

MQTT 性能测试入门:常见测试场景和指标

EMQ映云科技

物联网 性能测试 mqtt

数据挖掘18大算法实现以及其他相关经典DM算法:决策分类,聚类,链接挖掘,关联挖掘,模式挖掘。图算法,搜索算法等

汀丶人工智能

人工智能 数据挖掘 机器学习 深度学习 决策树

Flink-Learning 实战营在升级!更多精美好礼等你来!

Apache Flink

大数据 flink 实时计算

营销SaaS SemRush 2.9 亿美元年收入的五个经营数据分析

B Impact

算法复杂度介绍

宁静知行者

算法

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