lambda 匿名内部类_Lambda运行时内部:窥视无服务器巢穴

lambda 匿名内部类

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

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

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

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

显然,探索所有这些OS级产品的最简单方法是让CLI(shell)访问lambda环境。 不幸的是,目前这还不可能。 尽管如此,结合NodeJS运行时提供的极其简单的语法以及lambda具有几分钟的保持活动时间这一事实,我们可以轻松地编写一个可以模拟shell的10层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

lambda 匿名内部类

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

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

相关文章

java VM argument_java之program arguments与VM arguments

program arguments 中的值作为 args[] 的参数传入的,而 VM Arguments 是设置的虚拟机的属性。program arguments 是要传给你的应用程序的,它通过主函数中的 args 来传值。 VM arguments是系统的属性,要传给 java 虚拟机的。如图:是…

java iterator 嵌套_Java中的集合嵌套

import java.util.HashMap;import java.util.Iterator;import java.util.Map;import java.util.Set;public classDemo06 {public static voidmain(String[] args) {//大 MapHashMap> oraclenew HashMap>();//小MapHashMap java1018 new HashMap();HashMap java1227 new H…

Linux/Unix 如何查看 man 搜索到的手册页(manual page)的位置及复制手册页的内容

文章目录命令 man 是如何搜索手册页的?如何查看手册页所在的路径通过管道输出给 vim命令 man 是如何搜索手册页的? man uses a sophisticated method of finding manual page files, based on the invocation options and environment variables, the …

xml不利于调试_流利的接口不利于维护

xml不利于调试流畅的界面 (最初由Martin Fowler 创造)是一种与OOP中的对象进行通信的非常便捷的方式。 它使他们的外墙更易于使用和理解。 但是,它破坏了它们的内部设计,使它们更难以维护。 Marco Pivetta在他的博客文章Fluent In…

java输入月份求天数_java输入年份,月份,输出当月天数

package 第二次作业; public class 第二题 { //java文件名 public static void main(String[] args) { //相当于创建主函数 String 年份 = javax.swing.JOptionPane.showInputDialog("输入一个年份:"); //求出输…

java 换行 运算符格式_Java代码样式运算符换行格式

java 换行 运算符格式上周,我发现了什么决定了我在较长时间里一直在努力解决的问题的决定:是否放置&& , ||之类的运算符 或在同一行或下一行。 在构造布尔表达式或隐含字符串时,我们可能需要中断长行。 根据《 Google Ja…

pipeline java_架构模式:pipeline

知名的 Pipeline 模式unix 的 pipelinecat helloworld.txt | grep "hello world" | rev | > output.txt读取文本内容,并过滤 “hello world”,然后反转字符,将最终结果输出到 output.txtWeb 框架中间件Laravel 中的管道Laravel …

MacOS 系统使用命令安装软件包

文章目录 使用 Homebrew 安装软件包先安装 Homebrew使用命令 brew 安装软件包使用命令 installer 安装 pkg 软件包使用命令安装 dmg 格式的软件包包含普通的应用程序文件的 dmg 文件如何使用命令完成安装呢?包含 pkg 安装程序的 dmg 文件又该如何通过命令完成安装呢?Linux 操…

身份证验证 校验码_用户身份验证最佳做法清单

身份证验证 校验码用户身份验证是每个Web应用程序共享的功能。 我们已经实施了很多次了,所以早就应该完善它了。 然而,错误无时无刻不在。 造成这种情况的部分原因是,可能出错的事情列表很长。 您可能会错误地存储密码,可能会具有…

mysql查询不确定的信息_mysql 07.18

1.索引搜索引导,索引是一个特殊的数据结构,期存储的是数据的关键信息与详细详细的位置对应关系。目的:加速查询。索引的影响:不是说拥有索引就能加速,得看你的查询语句有没有正确使用索引,索引也需要占用额…

MacOS 常用命令汇总

文章目录设置环境变量列出所有可以更新的软件包直接更新所有可以更新的软件包打包压缩文件忽略 Mac OS 文件系统中的扩展属性忽略 Mac OS 专有的隐藏文件创建 DMG 格式的文件修改 DMG 文件的大小修改 DMG 格式中的加密口令挂载 DMG 格式的文件推出 DMG 文件将 ISO 格式的文件转…

java多功能钟_Java 11将包含更多功能

java多功能钟Java 11即将发布的功能是什么?它与Java 9和10有何不同? Java 10可能是新手,但现在该谈论Java 11了。Oracle迈向更快的发布周期意味着更多的特性和功能以比以往更快的速度出现。 尽管距离Java 11发行还有六个月的时间&#xff0…

MacOS 好用的插件和图形界面程序

文章目录文件预览插件OS X 图形界面程序文件预览插件 有些插件可以让 Mac 上的文件预览更有效,比如语法高亮、markdown 渲染、json 预览等。 $ brew cask install qlcolorcode $ brew cask install qlstephen $ brew cask install qlmarkdown $ brew cask install…

java 线程安全性_我如何测试Java类的线程安全性

java 线程安全性我在最近的一次网络研讨会中谈到了这个问题,现在是时候以书面形式进行解释了。 线程安全是Java等语言/平台中类的重要品质,在Java中我们经常在线程之间共享对象。 缺乏线程安全性导致的问题很难调试,因为它们是零星的&#xf…

java asin_Java asin()方法

Java asin()方法asin() 方法用于返回指定double类型参数的反正弦值。语法doubleasin(doubled)参数 d -- 任何原生数据类型。返回值返回指定double类型参数的反正弦值。实例public class Test{public static void main(String args[]){double degrees 45.0;double radians Mat…

MacOS 的软件包管理工具 HomeBrew 详解

文章目录一、软件介绍二、安装 Homebrew使用 Ruby 或者 Shell 脚本安装手动 clone 安装三、卸载 Homebrew四、Homebrew 安装目录五、安装包所在位置六、程序安装目录七、软件版本切换八、清除旧版本文件九、brew 命令汇总安装、升级和删除软件包查看和检验软件包参考示例服务相…

java中的深度克隆浅克隆_了解Java中的可克隆接口

java中的深度克隆浅克隆什么是对象克隆? 对象克隆是生成具有不同名称的对象的精确字段到字段副本的过程。 克隆的对象在内存中有自己的空间,可在其中复制原始对象的内容。 这就是为什么在克隆后更改原始对象的内容时,所做的更改不会反映在克隆…

python env_#!/usr/bin/env python 有什么用?

我们经常会在别人的脚本或者项目的入口文件里看到第一行是下面这样#!/usr/bin/python或者这样#!/usr/bin/env python那么他们有什么用呢?要理解它,得把这一行语句拆成两部分。第一部分是 #!第二部分是 /usr/bin/python 或者 /usr/bin/env python关于 #! …

MacBook(macOS) 如何安装 Homebrew Cask(作废)

文章目录重要通知(不要再去安装 Homebrew Cask 了)Homebrew Cask 简介相关文件和目录Homebrew Cask 安装使用命令下载安装直接从官网下载安装包利用国内源手动 clone下载(推荐)Homebrew Cask 换源重要通知(不要再去安装…

java.io.file()_JAVA基础知识之IO-File类

File类介绍File是java.io包下面的一个类,代表与平台无关的文件或者目录。JAVA中,无论文件还是目录,都可以看作File类的一个对象。File类能对文件或目录新建,删除,获取属性等操作,但是不能直接操作文件内容(…