快手、孩子王、华为等专家分享大模型在电商运营、母婴消费、翻译等行业场景的实际应用 了解详情
写点什么

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

发布了 1843 篇内容, 共 109.7 次阅读, 收获喜欢 77 次。

关注

评论

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

命名规范与原则

Appleex

代码人生 命名规范

数据中台坠落神坛,数据服务平台闪亮登场,阿里、快手又整烂活?

雨果

数据中台

在线问题反馈模块实战(六):接口文档定义

bug菌

springboot 项目实战 10月月更

“程”风破浪的开发者|你真的会用Redis做消息队列吗

芥末拌个饭吧

学习方法 redis 底层原理 10月月更

经历了6个月的失踪,我将带着干货终究归来!【RocketMQ入门到精通】

洛神灬殇

1024 10月月更

golang中的init初始化函数

六月的

golang init

计算机体系结构“圣经”新版,图灵奖得主扛鼎之作,影响无数技术人

图灵教育

计算机体系结构 图灵奖

计算机体系结构“圣经”新版,图灵奖得主扛鼎之作,影响无数技术人

图灵社区

计算机体系结构

HashMap源码分析(二)

知识浅谈

hashmap 10月月更

创建容器镜像:如何编写正确、高效的Dockerfile

okokabcd

Docker

在线问题反馈模块实战(四):封装通用字段类

bug菌

springboot 项目实战 10月月更

在线问题反馈模块实战(五):实现对通用字段内容自动填充功能

bug菌

springboot 项目实战 10月月更

Linux下内存空间分配、物理地址与虚拟地址映射

DS小龙哥

10月月更

2022年8月银行APP月活跃人数盘点

易观分析

手机银行 8月

Flash软件应用项目(三)

张立梵

设计师 Flash 10月月更

树莓派4B安装docker-compose(64位Linux)

程序员欣宸

Docker 10月月更 树莓派4

群主发红包带你深入了解继承和super、this关键字

共饮一杯无

Java 关键字 10月月更

【LeetCode】连续子数组的最大和Java题解

Albert

算法 LeetCode 10月月更

基于强化学习的测试日志智能分析实践

华为云开发者联盟

人工智能 测试 华为云 强化学习 企业号十月 PK 榜

区块链架构的层级:第 0、1、2、3 层介绍

devpoint

区块链 10月月更

数据湖(五):Hudi与Hive集成

Lansonli

10月月更 Hudi与Hive集成

【一Go到底】第二十天---闭包

指剑

Go golang 10月月更

华为云从入门到实战 | AI云开发ModelArts入门与WAF应用与部署

TiAmo

华为 华为云 云开发 10月月更

“全球金牌课程”【11月CSM认证】国际Scrum联盟认证导师CST授课 | 火热报名中

ShineScrum捷行

Scrum CSM 敏捷项目 ScrumMaster认证

Redis哨兵机制了解一下

芥末拌个饭吧

后端 redis 底层原理 10月月更

Redis的string内存消耗为何如此之大

芥末拌个饭吧

后端 redis 底层原理 10月月更

如果你看不懂别人画的 UML 类图,看这一篇文章就够了

跟着飞哥学编程

Java设计模式 10月月更 UML类图

Photoshop软件应用项目(三)

张立梵

设计师 ps 10月月更

golang中的接口

六月的

golang interface

优雅代码的秘密,都藏在这6个设计原则中

小小怪下士

Java 接口

第K个语法符号

掘金安东尼

算法 10月月更

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