Lambda运行时内部:窥视无服务器巢穴

有没有想过lambda里面是什么样的? 不要怀疑了 让我们找出答案。

自从2014年问世以来,AWS的lambda函数就成为了一个热门话题,在无服务器计算领域开辟了全新的历史。 无状态,零维护,按次执行的好东西实际上正在改变(即使不连根拔起)云计算范式的根源。 当其他玩家(例如Google和MS Azure)加入游戏时,AWS显然是赢家。

好吧,抛开说教,它到底看起来像一个lambda函数内部?

根据AWS专家的说法,lambda 由容器技术驱动 ; 确切地说,是AWS EC2容器服务(ECS) 。 因此,在这一点上,lambda只是一个Docker容器 ,外部访问受限。 但是,我们在容器内运行的功能代码几乎可以无限制地访问它(root特权除外),包括文件系统,内置和已安装的命令以及CLI工具,系统元数据和统计信息,日志等。 对于普通的lambda作者而言,它不是很有用,但是如果您打算深入研究OS级的内容,可能会有用。

显然,探索所有这些操作系统级产品的最简单方法是让CLI(shell)访问lambda环境。 不幸的是,目前这还不可能。 尽管如此,结合NodeJS运行时提供的极其简单的语法以及lambda具有几分钟的保持活动时间这一事实,我们可以轻松地编写一个可以模拟shell的十层lambda。 尽管无法以这种方式建立真正的“会话”(例如,您无法在实时更新视图的top运行),但是您可以重复运行一系列命令,就像与用户控制台进行交互一样。

let {exec} = require('child_process');exports.handle = (event, context, callback) => {console.log(event);exec(event.cmd, (err, stdout, stderr) => {console.log(stdout);if (err) console.log(stderr);callback(undefined, {statusCode: 200});});
}

对我们来说幸运的是,由于代码仅是十行代码,零外部依赖关系,因此我们可以通过单个CloudFormation 模板部署整个lambda(包括代码,配置和执行角色) :

AWSTemplateFormatVersion: '2010-09-09'
Resources:shell:Type: AWS::Lambda::FunctionProperties:FunctionName: shellHandler: index.handleRuntime: nodejs6.10Code:ZipFile: >let {exec} = require('child_process');exports.handle = (event, context, callback) => {console.log(event);exec(event.cmd, (err, stdout, stderr) => {console.log(stdout);if (err) console.log(stderr);callback(undefined, {statusCode: 200});});}Timeout: 60Role:Fn::GetAtt:- role- Arnrole:Type: AWS::IAM::RoleProperties:ManagedPolicyArns:- arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRoleAssumeRolePolicyDocument:Version: 2012-10-17Statement:- Action: sts:AssumeRoleEffect: AllowPrincipal:Service: lambda.amazonaws.com

部署整个过程非常简单:

aws cloudformation deploy --stack-name shell --template-file /path/to/template.yaml --capabilities CAPABILITY_IAM

或选择模板并将其上传到CloudFormation仪表板 ,以防您没有AWS CLI (讨厌)的方式进行此操作。

部署后,只需使用包含所需shell命令的有效负载调用lambda即可:

{"cmd":"the command to be executed"}

如果您具有AWS CLI,则通过以下shell代码段调用时,整个过程将变得更加性感:

echo -n "> "
read cmd
while [ "$cmd" != "exit" ]; doechoaws lambda invoke --function-name shell --payload "{\"cmd\":\"$cmd\"}" --log-type Tail /tmp/shell.log --query LogResult --output text | base64 -dechoecho -n "> "read cmd
done

使用此脚本后,您只需要调用该脚本即可。 您将得到一个伪造的“ shell”,您可以在其中执行您期待已久的命令,lambda将执行该命令并将输出立即返回到控制台,从而使您回到“ shell”提示符下:

> freeSTART RequestId: c143847d-12b8-11e8-bae7-1d25ba5302bd Version: $LATEST
2018-02-16T01:28:56.051Z	c143847d-12b8-11e8-bae7-1d25ba5302bd	{ cmd: 'free' }
2018-02-16T01:28:56.057Z	c143847d-12b8-11e8-bae7-1d25ba5302bd	             total       used       free     shared    buffers     cached
Mem:       3855608     554604    3301004        200      44864     263008
-/+ buffers/cache:     246732    3608876
Swap:            0          0          0END RequestId: c143847d-12b8-11e8-bae7-1d25ba5302bd
REPORT RequestId: c143847d-12b8-11e8-bae7-1d25ba5302bd	Duration: 6.91 ms	Billed Duration: 100 ms 	Memory Size: 128 MB	Max Memory Used: 82 MB>

通过这种方式,您可以了解有关Lambda函数的栖息地和生活方式的很多知识。 首先,我开始了解到容器运行时环境由Amazon Linux实例组成,具有大约4GB(可能是共享的)备忘录和几个(不可用的)相当大的磁盘挂载(除了“推荐使用” 500MB)安装在/tmp ):

> dfSTART RequestId: bb0034fa-12ba-11e8-8390-cb81e1cfae92 Version: $LATEST
2018-02-16T01:43:04.559Z	bb0034fa-12ba-11e8-8390-cb81e1cfae92	{ cmd: 'df' }
2018-02-16T01:43:04.778Z	bb0034fa-12ba-11e8-8390-cb81e1cfae92	Filesystem     1K-blocks    Used Available Use% Mounted on
/dev/xvda1      30830568 3228824  27501496  11% /
/dev/loop8        538424     440    526148   1% /tmp
/dev/loop9           128     128         0 100% /var/taskEND RequestId: bb0034fa-12ba-11e8-8390-cb81e1cfae92
REPORT RequestId: bb0034fa-12ba-11e8-8390-cb81e1cfae92	Duration: 235.44 ms	Billed Duration: 300 ms 	Memory Size: 128 MB	Max Memory Used: 22 MB> cat /etc/*-releaseSTART RequestId: 6112efb9-12bd-11e8-9d14-d5c0177bc74f Version: $LATEST
2018-02-16T02:02:02.190Z	6112efb9-12bd-11e8-9d14-d5c0177bc74f	{ cmd: 'cat /etc/*-release' }
2018-02-16T02:02:02.400Z	6112efb9-12bd-11e8-9d14-d5c0177bc74f	NAME="Amazon Linux AMI"
VERSION="2017.03"
ID="amzn"
ID_LIKE="rhel fedora"
VERSION_ID="2017.03"
PRETTY_NAME="Amazon Linux AMI 2017.03"
ANSI_COLOR="0;33"
CPE_NAME="cpe:/o:amazon:linux:2017.03:ga"
HOME_URL="http://aws.amazon.com/amazon-linux-ami/"
Amazon Linux AMI release 2017.03END RequestId: 6112efb9-12bd-11e8-9d14-d5c0177bc74f
REPORT RequestId: 6112efb9-12bd-11e8-9d14-d5c0177bc74f	Duration: 209.82 ms	Billed Duration: 300 ms 	Memory Size: 128 MB	Max Memory Used: 22 MB>

的确,除了数十种其他可能的增强功能之外,输出格式(主要是CloudWatch Logs的原始格式)可以得到显着改善。 因此,让我们在评论下进行讨论!

翻译自: https://www.javacodegeeks.com/2018/02/inside-lambda-runtime-peek-serverless-lair.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/347445.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于(7, 5)归零非删余Turbo码的参数识别与分析

关注公众号【逆向通信猿】试读更多内容!!! 本文主要来源于复现文献的部分内容,有一定的参考价值: [1] 钟兆根, 吴昭军, 刘杰, 张立民. 高误码率下归零Turbo帧结构识别[J]. 电子学报. 2019(10). 文末有代码和参考文献网盘下载地址,有问题欢迎留言交流! 1 引言 随着现代…

给出一个正整数 nnn,请你计算从 111 到 nnn 的所有正整数中,有多少个数字的各位数和是 999,Java

题目描述: 给出一个正整数 nnn,请你计算从 111 到 nnn 的所有正整数中,有多少个数字的各位数和是 999? 输入格式: 输入一个不超过 100000010000001000000 的正整数 nnn。 输出格式: 输出一个整数表示答案…

【2020.12.30更新】信号处理常用公式(一)

积化和差 cos⁡αcos⁡β12[cos⁡(αβ)cos⁡(α−β)]\cos \alpha \cos \beta \frac{1}{2}[\cos (\alpha \beta ) \cos (\alpha - \beta )]cosαcosβ21​[cos(αβ)cos(α−β)]sin⁡αcos⁡β12[sin⁡(αβ)sin⁡(α−β)]\sin \alpha \cos \beta \frac{1}{2}[\sin (\al…

一个直角三角形的两个直角边是 a,b(a≤b),其斜边是 c,且 a,b,c都是正整数。现在我们已经知道了斜边长度c,请问这个直角三角形的两个直角边的长度是什么?Java

题目描述:一个直角三角形的两个直角边是 a,b(a≤b),其斜边是 c,且 a,b,c都是正整数。现在我们已经知道了斜边长度c,请问这个直角三角形的两个直角边的长度是什么? 输入格式:输入一个整数 c(1≤…

矩阵可逆的一种刻画方式

问题 若矩阵A满足AATIAA^{\rm{T}}IAATI,则A可逆。 证明一 反证法。假设A不可逆,则 ∃x0≠0\exists{x_0}\ne0∃x0​​0,使得Ax00A{x_0}0Ax0​0,则 x0AT(Ax0)T0T{x_0}{A^{\rm{T}}} {(A{x_0})^{\rm{T}}} {0^{\rm{T}}}x0​AT(A…

我们知道计算机的大小单位有 B, KB, MB 等,现在请你编写一个计算器进行大小单位换算。Java洛谷传智杯

题目描述: 我们知道计算机的大小单位有 B, KB, MB 等,现在请你编写一个计算器进行大小单位换算。 输入格式:输入一个字符串,由一个 0 到 1023 之间的整数,一个单位名称(大写字母),一…

eclipselink_EclipseLink MOXy和用于JSON处理的Java API –对象模型API

eclipselink用于JSON处理的Java API(JSR-353)是作为Java EE 7的一部分引入的用于生成和使用JSON的Java标准。JSR-353包括对象(类似于DOM)和流(类似于StAX)API。 在本文中,我将演示我们在Eclipse…

传智杯Java志愿者传智专修学院总共召集了n位志愿者来负责打扫活动,现在需要你负责帮忙统计每位志愿者的工作情况,用来制作光荣榜,给他们发小花花

Java实现思路:创建一个志愿者内部类,包括编号、服务时长、难度、贡献度属性。使用ArrayList将多个志愿者对象联系在一起。使用Collection的sort方法,重写compare方法进行按规则比较。 Java代码: import java.util.ArrayList; im…

将可见的电子签名添加到PDF

我知道这将是一个非常特殊的话题。 电子签名PDF远不是主流用例。 但是,我将其编写的原因有两个:第一,我认为它对真正需要它的人非常有用;第二,我认为随着eIDAS法规的普及,它将变得越来越普遍。电子签名在欧…

高斯白噪声下基于EM的多径时延估计

本文主要来源于复现文献的部分内容,有一定的参考价值: [1] 刘波. 基于EM的突发通信参数估计技术研究[D]. 2009. 文末有代码和参考文献网盘下载地址,有问题欢迎留言交流! 1 引言 对于多径传播,接收信号是由源信号与它…

传智杯Java终端有一天您厌烦了电脑上又丑又没用的终端,打算自己实现一个 Terminal

Java思路&#xff1a;使用String的字符串处理以及ArrayList的列表处理。 Java代码&#xff1a; import java.util.ArrayList; import java.util.Scanner; public class Main{public static ArrayList<String> list new ArrayList<>();public static void main(S…

新年迈出Java后台服务器与数据库交互第一步2022最新通用Java8jdbc8连接mysql8数据库进行增删改查等基本操作详解(IDEA),jar包导入,图片等文件流,批量操作

文章目录一、JDBC下载与导入二、获取连接三、PreparedStatement类操作数据库四、操作BLOB类型字段&#xff08;图片视频等&#xff09;五、Batch批量插入&#x1f646;&#x1f3fb;‍♀️&#x1f646;&#x1f3fb;‍♀️文末最新版jdbc jar包下载 &#x1f646;&#x1f3fb…

最优化理论与算法笔记

最优化理论与算法笔记

ejb+jpa_使用Arquillian(包括JPA,EJB,Bean验证和CDI)测试Java EE 6

ejbjpa很长时间以来&#xff0c;我听到很多人对Arquillian说好话 。 尽管我一直在阅读有关其用法的文章&#xff0c;但实际上我无法在一篇文章中找到涵盖我认为重要的某些方面的文章。 当然&#xff0c;我看起来还不够努力。 我要讲的要点是&#xff1a; 使用JPA。 我只是在这…

Win32编程之基于MATLAB与VC交互的多项式回归

运行环境 Matlab R2018b x64 or x32 Visual Studio 2017 企业版 程序预览 文末有完整程序代码下载地址,有任何问题欢迎留言,谢谢点赞哟! 程序功能描述 矩阵运算是大多数科学运算的必要工具。通常情况下,Matlab是实现矩阵运算的最佳工具,但是大多数Matlab运算都是基于d…

隔离区别对待?如何捆绑?Java中的jdbc数据库事务及其隔离级别

文章目录一、数据库事务简介二、JDBC事务处理三、事务的ACID属性四、数据库的隔离级别五、设置隔离级别一、数据库事务简介 事务&#xff1a;一组逻辑操作单元&#xff0c;使数据从一种状态变换到另一种状态。 事务处理&#xff08;事务操作&#xff09;&#xff1a;保证所有…

基于VS的连连看小游戏

运行环境 Matlab R2018b x64 or x32 Visual Studio 2017 企业版 程序预览 目前功能只开发了基本模式,也即是基本的连连看功能和帮助功能,文末有完整程序代码下载地址,有任何问题欢迎留言,谢谢点赞哟! 重要设计步骤和思路以及实现如下所示。 设计思路 类设计

idea使用c3p0数据库连接池无法加载配置文件xml,配置文件放置的位置

注意&#xff1a;要把c3p0-config.xml文件放在输出的文件夹里面&#xff0c;即放在out里面&#xff0c;而不是放在src里面。&#xff08;如下图&#xff09; 至于配置文件怎么写&#xff0c;可以参考其他经验教程&#xff0c;这里不再赘述。

spring boo_为您的下一个基于Spring的应用程序考虑使用spring-boot的原因!

spring booSpring-boot提供了一种创建基于Spring的应用程序的快速方法。 对于下一个项目&#xff0c;有一些非常令人信服的理由考虑使用Spring-boot&#xff1a; 原因1&#xff1a;使用spring-boot启动程序项目进行更简单的依赖性管理。 考虑使用CR2是使用h2数据库来实现的&am…