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
總結
以上是生活随笔為你收集整理的Lambda运行时内部:窥视无服务器巢穴的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 谢霆锋电影有哪些(谢霆锋演的评分最高的十
- 下一篇: 联想k29升级cpu(联想k29升级CP
