写点什么

在本地构建和测试无服务器应用程序

  • 2019-11-11
  • 本文字数:3383 字

    阅读完需:约 11 分钟

在本地构建和测试无服务器应用程序

今天,我们将发布一款新工具 — SAM Local (Beta 版)。使用这款工具,您可以轻松在本地构建和测试无服务器应用程序。在本文中,我们将使用 SAM Local 快速构建、调试并部署一款应用程序,该应用程序允许我们通过对终端节点运行 curl 命令给 Tabs 或 Spaces 投票。AWS 去年推出了无服务器应用程序模式 (SAM),让开发人员能够更轻松地部署无服务器应用程序。如果您还不熟悉 SAM,请阅读我的同事 Orr 发布的一篇优秀文章,其中详细介绍了如何使用 SAM,读完该文章大约需要 5 分钟。SAM 的核心是基于 AWS CloudFormation 的强大开源规范,它可轻松将您的无服务器基础设施保持为代码并提供可爱的标识。



SAM Local 吸收了 SAM 的全部精华并将它们应用到您的本地计算机中。



有多种安装 SAM Local 的方法,但最简便的方法是通过 NPM。通过运行 npm install -g aws-sam-local 命令可以快速安装,但如果您希望获得最新版本,始终可以直接从来源安装: go get github.com/awslabs/aws-sam-local (这将创建一个名为 aws-sam-local 而非 sam 的二进制文件)。


我想要投票,因此我们来编写一款简单的 SAM 应用程序,将票投给 Spaces 而不是 Tabs。我们将使用非常简单但功能强大的 API Gateway 架构来处理 Lambda 函数,并将结果存储在 DynamoDB 中。最终,用户应能够对 API 运行 curl 命令 curl https://SOMEURL/ -d '{"vote": "spaces"}' 并返回票数。


我们首先来编写一个简单的 SAM template.yaml:


YAML


AWSTemplateFormatVersion : '2010-09-09'Transform: AWS::Serverless-2016-10-31Resources:  VotesTable:    Type: "AWS::Serverless::SimpleTable"  VoteSpacesTabs:    Type: "AWS::Serverless::Function"    Properties:      Runtime: python3.6      Handler: lambda_function.lambda_handler      Policies: AmazonDynamoDBFullAccess      Environment:        Variables:          TABLE_NAME: !Ref VotesTable      Events:        Vote:          Type: Api          Properties:            Path: /            Method: post
复制代码


我们创建一个 [dynamo_i] 表,并通过一个环境变量向我们的 Lambda 函数公开该表,该环境变量名为 TABLE_NAME


为了测试此模板是否有效,我继续调用 sam validate 确保我没有打错字。该命令返回 Valid! ,接下来我们继续处理 Lambda 函数。


Python


import osimport osimport jsonimport boto3votes_table = boto3.resource('dynamodb').Table(os.getenv('TABLE_NAME'))
def lambda_handler(event, context): print(event) if event['httpMethod'] == 'GET': resp = votes_table.scan() return {'body': json.dumps({item['id']: int(item['votes']) for item in resp['Items']})} elif event['httpMethod'] == 'POST': try: body = json.loads(event['body']) except: return {'statusCode': 400, 'body': 'malformed json input'} if 'vote' not in body: return {'statusCode': 400, 'body': 'missing vote in request body'} if body['vote'] not in ['spaces', 'tabs']: return {'statusCode': 400, 'body': 'vote value must be "spaces" or "tabs"'}
resp = votes_table.update_item( Key={'id': body['vote']}, UpdateExpression='ADD votes :incr', ExpressionAttributeValues={':incr': 1}, ReturnValues='ALL_NEW' ) return {'body': "{} now has {} votes".format(body['vote'], resp['Attributes']['votes'])}
复制代码


我们在本地测试一下这个函数。我需要创建一个真实的 DynamoDB 数据库进行演示,并且需要通过环境变量 TABLE_NAME提供该数据库的名称。我可以使用 env.json 文件来执行该操作,也可以直接在命令行中传递它。首先,我可以通过调用


$ echo '{"httpMethod": "POST", "body": "{\"vote\": \"spaces\"}"}' |\ TABLE_NAME="vote-spaces-tabs" sam local invoke "VoteSpacesTabs"


来测试 Lambda 函数,它返回 Spaces 的票数,因此从理论上讲,函数内容全都正确无误。用键盘输入上述全部内容比较费劲,但我可以使用 sam local generate-event api 生成示例事件,并将该事件传递到本地调用。最简单的方式是在本地运行我们的 API。让我们运行: sam local start-api。接下来,我可以对我的本地终端节点运行 curl 命令进行测试。


我将运行命令 $ curl -d '{"vote": "tabs"}' http://127.0.0.1:3000/ ,该命令返回:“tabs now has 12 votes”。当然,第一次尝试编写此函数的效果并不完美。我编辑并保存了几次。热重载的其中一个优点是我可以随意更改函数,而不必执行任何额外的操作来测试新函数。这大大简化了迭代开发。


假设我们不希望通过网络访问真正的 DynamoDB 数据库。我们应该怎么做?我们可以下载 DynamoDB Local,并通过运行如下命令启动它: java -Djava.library.path=./DynamoDBLocal_lib -jar DynamoDBLocal.jar -sharedDb。然后,我们可以在 Lambda 函数中使用 AWS_SAM_LOCAL 环境变量,以决定其行为方式。我们来稍微修改一下函数:


Python


import osimport jsonimport boto3if os.getenv("AWS_SAM_LOCAL"):    votes_table = boto3.resource(        'dynamodb',        endpoint_url="http://docker.for.mac.localhost:8000/"    ).Table("spaces-tabs-votes")else:    votes_table = boto3.resource('dynamodb').Table(os.getenv('TABLE_NAME'))
复制代码


这样,我们就使用本地终端节点连接到本地数据库,这让在没有 WiFi 的环境下工作变得更轻松。


SAM Local 还支持交互调试!在 Java 和 Node.js 中,我只需传递 -d 标记和一个端口,即可立即启用调试程序。在 Python 中,我可以使用诸如 import [](https://github.com/sassoftware/epdb); epdb.serve() 之类的库并通过库进行连接。然后,我们可以调用 sam local invoke -d 8080 "VoteSpacesTabs" ,我们的函数将暂停执行,等待您逐步完成调试程序。


好的,我想我们已经准备就绪,现在开始部署吧!


首先,我将调用 sam package 命令 (该命令只是 aws cloudformation package 的别名),然后我将使用该命令的结果来运行 sam deploy命令。


$ sam package --template-file template.yaml --s3-bucket MYAWESOMEBUCKET --output-template-file package.yamlUploading to 144e47a4a08f8338faae894afe7563c3  90570 / 90570.0  (100.00%)Successfully packaged artifacts and wrote output template to file package.yaml.Execute the following command to deploy the packaged templateaws cloudformation deploy --template-file package.yaml --stack-name $ sam deploy --template-file package.yaml --stack-name VoteForSpaces --capabilities CAPABILITY_IAMWaiting for changeset to be created..Waiting for stack create/update to completeSuccessfully created/updated stack - VoteForSpaces
复制代码


这将转到我们的 API:



我将跳到生产阶段,并添加一些速率限制,以防你们过度投票,但另一方面,我们已经完成了本地工作并将它部署到云中,而这并不复杂。我非常享受第一次部署就成功的状态!


现在,您可以投票并实时查看结果了!http://spaces-or-tabs.s3-website-us-east-1.amazonaws.com/



我们希望 SAM Local 能够简化无服务器应用的测试、调试和部署。我们提供了 CONTRIBUTING.md 指南,并欢迎你们提交提取请求。请 @ 我们,让我们知道您构建的超酷应用程序。您可以查看我们的新增功能文章以及此处在线提供的文档。


Randall


本文转载自 AWS 技术博客。


原文链接:


https://amazonaws-china.com/cn/blogs/china/new-aws-sam-local-beta-build-and-test-serverless-applications-locally/


2019-11-11 08:00672

评论

发布
暂无评论
发现更多内容

发挥云网融合优势,天翼云为政企铺设数字化转型跑道

天翼云开发者社区

数字化转型 数字化基础 云网融合

读书笔记之《你想过怎样的一生?》

宇宙之一粟

读书笔记 8月月更

百问百答第49期:极客有约——国内可观测领域SaaS产品的发展前景

博睿数据

可观测性 智能运维 博睿数据 极客有约 中信证券

【CSS】基础选择器,包括标签选择器、类选择器、id选择器和通配符选择器...

翼同学

CSS html 前端 HTML5, CSS3 8月月更

开源一夏 | Web开发(七):登录实现及功能测试

是Dream呀

连续三次 | 灵雀云入选Gartner中国ICT技术成熟度曲线报告

York

云计算 云原生 数字化转型 ICT Gartner

线程池原理与实践|从入门到放弃,深度解析

领创集团Advance Intelligence Group

线程池 内存溢出 线程池工作原理

Spring Boot整合Mybatis

JAVA活菩萨

Java 程序员 后端

MyBatis操作数据库

JAVA活菩萨

Java 程序员 后端

实现客户服务自助,打造产品知识库

Baklib

企业云成本管控,你真的做对了吗?

Kyligence

云成本管控 云成本分析

面试官:可以谈谈乐观锁和悲观锁吗

JAVA活菩萨

面试官

深入理解IO流(第一篇)

JAVA活菩萨

Java 程序员

魔豹联盟:佛萨奇2.0dapp系统开发模式详情

开发微hkkf5566

DevOps之代码检查

凌云Cloud

DevOps 研发管理 代码检查器

Mqtt开发笔记:windows下C++ ActiveMQ客户端介绍、编译和使用

JAVA活菩萨

Java 程序员 后端

KunlunBase 1.0 发布了!

KunlunBase昆仑数据库

国产数据库

Linux Lab 编译 riscv-gnu-toolchain

贾献华

8月月更

竞赛:糖尿病遗传风险检测挑战赛(科大讯飞)

Lingxw

数据挖掘 Kaggle 8月月更

什么是现场服务管理系统(FSM)?有什么好处?

优秀

企业管理系统 现场管理

一款好用的FAQ搭建工具

Geek_da0866

一朵“云“如何带来产业新变革

天翼云开发者社区

云网融合

开源一夏 | 计算机网络:物理层

是Dream呀

开源

麦聪DaaS平台 3.7.0 Release 正式发布:全面支持国际化

雨果

DaaS数据即服务

天翼云4.0来了!千城万池,无所不至!

天翼云开发者社区

云计算 云平台

千万级QPS下服务如何才能平滑启动

HelloGeek

微服务架构 Service Mesh 高并发优化

开源一夏 |【云原生】DevOps(五):集成Harbor

是Dream呀

从技术全景到场景实战,透析「窄带高清」的演进突破

阿里云视频云

云计算 直播 视频

玩转云端 | 天翼云对象存储ZOS高可用的关键技术揭秘

天翼云开发者社区

云平台 云存储

天翼云4.0分布式云赋能千行百业数字化转型

天翼云开发者社区

云存储 云上架构

这份562页的算法知识点集结刷题手册,将是你拿大厂offer的突破口

了不起的程序猿

程序员 算法 编程语言 java程序员 大厂面试

在本地构建和测试无服务器应用程序_语言 & 开发_亚马逊云科技 (Amazon Web Services)_InfoQ精选文章