写点什么

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

  • 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:00755

评论

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

架构训练营模块5-作业

sophiahuxh

vue入门:组件概述

小鲍侃java

8月日更

从0搭建在线聊天室,只需4步!

网易云信

SpringBoot dockerfile生成镜像

Rubble

8月日更

在线图片水印平铺工具

入门小站

工具

架构实战营 - 模块五作业

Julian Chu

架构实战营

从字节码探索代理模式

4ye

Java 后端 字节码 代理模式 8月日更

【Flutter 专题】65 图解基本 TextField 文本输入框 (二)

阿策小和尚

Flutter 小菜 0 基础学习 Flutter Android 小菜鸟 8月日更

手撸二叉树之从根到叶的二进制数之和

HelloWorld杰少

数据结构与算法 8月日更

计算机字符编码的前世今生

vivo互联网技术

Unicode utf-8 编码 ASCII 字符集

也许你曾对怎么样才算认真做事情感到好奇,这本书给我三个启发,我想与你分享。

叶小鍵

kafka - 基础介绍

旺仔大菜包

kafka

Python代码阅读(第11篇):展开嵌套列表

Felix

Python 编程 Code Programing 阅读代码

【Vue2.x 源码学习】第三十八篇 - 组件部分 - 组件的编译

Brave

源码 vue2 8月日更

JavaScript 中 Array map() 方法

HoneyMoose

Linux之wget命令

入门小站

Linux

架构实战营 模块五 作业

一雄

作业 架构实战营 模块五

浪潮云IBP机器学习平台通过中国信通院可信云评估 荣获“先进级”认证

云计算

JVM集合之开篇点题

阿Q说代码

JVM hotspot 8月日更 栈式架构 寄存器架构

高可用架构演进之单元化

华为云开发者联盟

物联网 IoT 华为云

架构实战营模块五作业 -微博评论高性能高可用架构

hello

架构训练营

JavaScript 中 Array map() 方法

HoneyMoose

Pulsar Manager - Use Docker

ZHOUWEI

Apache Pulsar

细数浅拷贝和深拷贝

苹果看辽宁体育

Java 后端

Lodash 是什么

HoneyMoose

Regan Yue带你一起学习微软AZ-900认证的有关知识「 第Ⅲ章」

Regan Yue

云计算 微软 8月日更

什么是强化学习?

华为云开发者联盟

机器学习 强化学习 智能体 环境 动作空间

iOS开发:真机调试提示XXX, but code signing identity Apple Development问题

三掌柜

8月日更 8月

Rust从0到1-高级特性-不安全的Rust

rust unsafe 高级特性 不安全

Java双刃剑之Unsafe类详解

码农参上

Java unsafe 8月日更

JavaScript 的 null 和 undefined 判断

HoneyMoose

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