AWS最近發(fā)布了一款測試版的新工具SAM Local,該工具可以幫助開發(fā)者在本地計(jì)算機(jī)上更輕松地構(gòu)建并測試無服務(wù)器AWS Lambda應(yīng)用程序。SAM Local提供的核心功能包括:在本地運(yùn)行的Docker中測試AWS Lambda函數(shù),借助SAM模板通過一個(gè)簡單的CLI啟動(dòng)本地API網(wǎng)關(guān)并置于Lambda函數(shù)之前,驗(yàn)證SAM模板,以及針對(duì)S3、Kinesis、CloudTrail等各種AWS事件源的測試工作生成示例載荷。
AWS去年發(fā)布的無服務(wù)器應(yīng)用程序模型(Serverless Application Model,SAM),意在幫助開發(fā)者更輕松地部署無服務(wù)器應(yīng)用。SAM是一種開源規(guī)范,基于AWS CloudFormation構(gòu)建并對(duì)其進(jìn)行了擴(kuò)展,這是AWS提供的基礎(chǔ)架構(gòu)即代碼(IaC)產(chǎn)品,可供開發(fā)者以聲明的方式指定云資源的部署和配置。
SAM Local的主要功能包括:
在本地通過SAM Local和Docker開發(fā)并測試AWS Lambda函數(shù)。 通過SAM模板啟動(dòng)本地Amazon API Gateway,并借助熱重載(Hot-reloading)技術(shù)針對(duì)函數(shù)的開發(fā)進(jìn)行快速迭代。 快速驗(yàn)證SAM模板,包括與Linter或IDE集成。 為Lambda函數(shù)提供了交互式的調(diào)試支持。通過SAM Local在本地運(yùn)行無服務(wù)器項(xiàng)目和函數(shù)需要安裝并運(yùn)行Docker,此時(shí)SAM Local將使用DOCKER_HOST環(huán)境變量連接Docker守護(hù)進(jìn)程。SAM Local可通過NPM安裝(npm install -g aws-sam-local),或可從原代碼庫直接安裝最新版(訪問github.com/awslabs/aws-sam-loca,并創(chuàng)建一個(gè)名為aws-sam-local,而非sam的二進(jìn)制文件)。
開發(fā)者可通過增強(qiáng)的CloudFormation模板格式指定函數(shù)的部署配置以及相關(guān)的集成式AWS資源(這種格式最終會(huì)轉(zhuǎn)換為標(biāo)準(zhǔn)的CloudFormation模板)。例如,下列template.yaml文件定義了一個(gè)簡單的DynamoDB表,一個(gè)基于Python的Lambda函數(shù)(源代碼包含在一個(gè)單獨(dú)的文件中,其名稱可通過'Handler property' lambda_function.py指定),以及一個(gè)支持GET和POST方法的API網(wǎng)關(guān)實(shí)例。
---AWSTemplateFormatVersion : '2010-09-09'Transform: AWS::Serverless-2016-10-31Resources: VotesTable: Type: "AWS::Serverless::SimpleTable" VoteSpacesTabs: Type: "AWS::Serverless::Function" Properties: Timeout: 30 Runtime: python3.6 Handler: lambda_function.lambda_handler Policies: AmazonDynamoDBFullAccess Environment: Variables: TABLE_NAME: !Ref VotesTable Events: GetVotes: Properties: Method: get Path: / Type: Api Vote: Properties: Method: post Path: / Type: ApiRandall Hunt撰寫的一篇AWS博客文章提供了SAM部署與API網(wǎng)關(guān)集成的范例,并演示了SAM Local對(duì)整個(gè)開發(fā)流程提供的幫助。相關(guān)說明已經(jīng)很完善,但實(shí)際使用時(shí)需要首先創(chuàng)建相應(yīng)的DynamoDB表,隨后才能測試函數(shù)(例如下列示例通過AWS CLI執(zhí)行了create-table命令),此外在針對(duì)測試用途運(yùn)行本地DynamoDB時(shí),還需要將函數(shù)中的DynamoDB主機(jī)名改為計(jì)算機(jī)的本地網(wǎng)絡(luò)IP地址,不能直接使用localhost,這是因?yàn)楹瘮?shù)實(shí)際上運(yùn)行在Docker容器內(nèi),而Mac或Windows上的Docker都運(yùn)行在自己的虛擬機(jī)內(nèi),此時(shí)localhost代表不同的上下文。
aws dynamodb create-table --table-name spaces-tabs-votes --attribute-definitions AttributeName=id,AttributeType=S --key-schema AttributeName=id,KeyType=HASH --provisioned-throughput ReadCapacityUnits=1,WriteCapacityUnits=1 --endpoint-url http://localhost:8000SAM Local可以針對(duì)測試用途生成AWS服務(wù)事件,例如運(yùn)行sam local generate-event
在本地開發(fā)并測試無服務(wù)器應(yīng)用后,可以使用SAM CLI將應(yīng)用程序打包并部署到生產(chǎn)環(huán)境。sam package命令可將代碼壓縮為Zip格式,上傳至S3,并生成一個(gè)可直接通過AWS CloudFormation部署至Lambda的SAM文件。sam deploy命令可將打包后的SAM模板部署至CloudFormation。sam package和sam deploy的作用分別等同于AWS CLI中的aws cloudformation package和aws cloudformation deploy命令。
有關(guān)SAM Local的更多信息可訪問AWS博客文章:“新增 - AWS SAM Local (Beta) – 本地構(gòu)建并測試無服務(wù)器應(yīng)用程序”,或訪問該項(xiàng)目的GitHub代碼庫。
閱讀英文原文:AWS Release ‘SAM Local’ to Facilitate Local Build and Test of AWS Lambda Serverless Applications