lambda表达式_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的十层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::Function
    Properties:
      FunctionName: shell
      Handler: index.handle
      Runtime: nodejs6.10
      Code:
        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: 60
      Role:
        Fn::GetAtt:
        - role
        - Arn
  role:
    Type: AWS::IAM::Role
    Properties:
      ManagedPolicyArns:
      - arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole
      AssumeRolePolicyDocument:
        Version: 2012-10-17
        Statement:
        - Action: sts:AssumeRole
          Effect: Allow
          Principal:
            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" ]; do
  echo
  aws lambda invoke --function-name shell --payload "{\"cmd\":\"$cmd\"}" --log-type Tail /tmp/shell.log --query LogResult --output text | base64 -d
  echo
  echo -n "> "
  read cmd
done

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

> free

START 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          0

END 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 ):

> df

START 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/task

END 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/*-release

START 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.03

END 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表达式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值