写点什么

使用来自 AWS Serverless Application Repository 的组件构建无服务器应用程序

  • 2019-10-10
  • 本文字数:4212 字

    阅读完需:约 14 分钟

使用来自 AWS Serverless Application Repository 的组件构建无服务器应用程序

许多人都有过多次从零开始构建用户登录或授权服务的经历。而且,您可能还构建过许多其他用于处理付款或导出 PDF 等类似的服务。其实,我们都曾不止一次地这样做过。现在,使用 AWS Serverless Application Repository,您可以投入更多的时间和精力开发业务逻辑,更快的向客户交付重要的功能。

什么是 AWS Serverless Application Repository?

借助 AWS Serverless Application Repository,开发人员可以开发、发布常用的无服务器组件并在其团队和组织之间进行共享。AWS Serverless Application Repository 的公有库包含社区构建的开源无服务器组件,这些组件可以即刻使用自定义的参数和预定义的许可进行搜索和部署。这些组件使用 AWS 无服务器应用程序模型 (AWS SAM) 构建和发布,AWS SAM 是一种基础设施即代码服务,支持 YAML 语言,用于开发 AWS 资源的模板。

如何在生产中使用 AWS Serverless Application Repository

我想构建一款可让客户选择产品并付款的应用程序。乍听上去,这会颇费周章,对不对? 实际上,由于使用了 AWS Serverless Application Repository,这并未花费我多少时间。


大致而言,我构建了以下项目:


  • 一个具有 Buy 按钮的产品页面,它自动链接到 Stripe Checkout 开发工具包。当客户选择 Buy 时,该页面会显示 Stripe Checkout 付款表单。

  • 一项具有 API 终端节点的 Stripe 支付服务,它接受来自 Stripe 的回调,向客户收款,并发送交易成功的通知。

  • 在本文中,我创建了一个预先构建的示例静态页面,该页面不仅会显示产品详细信息,而且具有 Stripe Checkout JavaScript 代码。


尽管使用了预先构建的页面,仍然可以集成支付服务。既然许多其他开发人员已经至少构建过一次支付应用程序,我为何还要花费时间构建相同的功能呢? 这正是 AWS Serverless Application Repository 的用武之地。


查找和部署组件


首先,我在 AWS Serverless Application Repository 公有库中搜索现有组件。然后,我键入“stripe”,选择查看已创建自定义 IAM 角色或资源策略的应用程序。我看到了以下结果:



我选择名为 api-lambda-stripe-charge 的应用程序,然后在组件的详细信息页面中选择 Deploy。



在部署任何组件之前,我都对其进行了检查,以确保它的安全性和生产就绪性。


评估组件


评估 AWS Serverless Application Repository 组件的建议方法分为四个步骤:


1.检查组件的权限。


2.检查组件的实施。


3.在受限环境中部署和运行组件。


4.监控组件的行为和成本,然后再用于生产。


这可能看似与 AWS Serverless Application Repository 的快速交付优势相悖,但实际上,您只需对每个组件验证一次。然后,您可以轻松在整个公司重复使用和共享组件。


下文介绍了如何在添加 Stripe 组件时运用此方法。


1.检查组件的权限


组件分为两类:公有组件和私有组件。公有组件是开源的,但私有组件不一定如此。在本例中,Stripe 组件是公有组件。我检查了代码,以确保它不会提供可能会损害安全性的不必要权限。


在本例中,Stripe 组件位于 GitHub 上。在组件页面中,我打开了 template.yaml 文件。该文件中只有一个 AWS Lambda 函数,因此我找到了 Policies 属性并查看了它使用的策略。


  CreateStripeCharge:    Type: AWS::Serverless::Function    Properties:      Handler: index.handler      Runtime: nodejs8.10      Timeout: 10      Policies:        - SNSCrudPolicy:          TopicName: !GetAtt SNSTopic.TopicName        - Statement:          Effect: Allow          Action:            - ssm:GetParameters          Resource: !Subarn:${AWS::Partition}:ssm:${AWS::Region}:${AWS::AccountId}:parameter/${SSMParameterPrefix}/*
复制代码


该组件使用了一个预先定义的 AWS SAM 策略模板和一个自定义模板。这些预先定义的策略模板是经过 AWS 安全团队验证和推荐的 AWS 权限集。使用这些策略来指定资源权限,是使用 AWS Serverless Application Repository 上的无服务器组件的一个推荐做法。另一个自定义的 IAM 策略允许该函数检索 AWS System Manager 参数,这是存储 Stripe 加密密钥等安全值的最佳实践。


2.检查组件的实施


我希望确保该组件的主要业务逻辑只做它应该做的事情,也就是创建 Stripe 收款。此外,识别不明的第三方 HTTP 调用以防止信息泄露也非常重要。然后,我检查了此项目的依赖项。在此次检查过程中,我使用了 PureSec,当然也可以选择其他工具,例如 Protego 提供的工具。


主要业务逻辑位于 charge-customer.js 文件中。从该文件中可以看出,直接的逻辑是简单调用 Stripe 创建收款,然后用创建的收款发布一条通知。我看到这点在以下代码中有所体现:


return paymentProcessor.createCharge(token, amount, currency, description)    .then(chargeResponse => {      createdCharge = chargeResponse;      return pubsub.publish(createdCharge, TOPIC_ARN);    })    .then(() => createdCharge)    .catch((err) => {      console.log(err);      throw err;    });
复制代码


paymentProcessor 和 pubsub 的值分别是与 Stripe 和 Amazon SNS 进行通信的适配器。我对了解它们的工作机制乐此不疲。


3.在受限环境中部署和运行组件


无服务器开发的一项最佳实践是,维护一个单独的、受限的 AWS 账户来测试无服务器应用程序。我总是会确保我的测试账户设置了严格的 AWS 账单和 Amazon CloudWatch 警报。


我登录到此独立账户,打开“Stripe component”页面,然后对其进行手动部署。部署之后,我需要验证它的运行情况。由于该组件只有一个 Lambda 函数,因此我在 Lambda 控制台中寻找该函数,并打开其详细信息页面,以便可以验证代码。


4.监控组件的行为和成本,然后再用于生产


如果我的测试账户中一切都正常运作,我通常会给组件添加监控和性能功能,以帮助诊断所有事件,并评估组件的性能。为此,我经常使用 Epsagon 和 Lumigo,但添加这些步骤会使本文的篇幅过长。


我还想跟踪组件的成本。为此,我添加了严格的账单警报,该警报会跟踪组件的成本以及该组件中各项 AWS 资源的成本。


在组件通过这四项测试后,我就可以对其进行部署,将其添加到我现有的产品选择应用程序中。

将组件部署到现有应用程序

为了将我的 Stripe 组件添加到现有的应用程序中,我重新打开了组件的 Review, Configure, and Deploy 页面,然后选择“Copy as SAM Resource”。这将必要的模板代码复制到了我的剪贴板。然后,我将其粘贴到现有的 AWS SAM 模板中的“Resources”下,从而将其添加到现有的无服务器应用程序中。这些代码如下:


Resources:  ShowProduct:    Type: AWS::Serverless::Function    Properties:      Handler: index.handler      Runtime: nodejs8.10      Timeout: 10      Events:        Api:          Type: Api          Properties:            Path: /product/:productId            Method: GET  apilambdastripecharge:    Type: AWS::Serverless::Application    Properties:      Location:        ApplicationId: arn:aws:serverlessrepo:us-east-1:375983427419:applications/api-lambda-stripe-charge        SemanticVersion: 3.0.0      Parameters:        # (Optional) Cross-origin resource sharing (CORS) Origin.You can specify a single origin, all origins with "*", or leave it empty and no CORS is applied.        CorsOrigin: YOUR_VALUE        # This component assumes that the Stripe secret key needed to use the Stripe Charge API is stored as SecureStrings in Parameter Store under the prefix defined by this parameter.See the component README.       # SSMParameterPrefix: lambda-stripe-charge # Uncomment to override the default valueOutputs:  ApiUrl:    Value: !Sub https://${ServerlessRestApi}.execute-api.${AWS::Region}.amazonaws.com/Stage/product/123    Description: The URL of the sample API Gateway
复制代码


我复制并粘贴了 AWS::Serverless::Application AWS SAM 资源,它根据 ApplicationId 及其 SemanticVersion 指向该组件。然后我定义了该组件的参数。


  • 出于演示目的,我将 CorsOrigin 设置为“*”。

  • 我无需设置 SSMParameterPrefix 值,因为它会选择一个默认值。但我通过在 Systems Manager Parameter Store 中运行如下命令设置了我的 Stripe 密钥:


aws ssm put-parameter --name lambda-stripe-charge/stripe-secret-key --value --type SecureString --overwrite
复制代码


除参数之外,组件还包含输出。输出是您可以用于其他应用程序或组件的外部化组件资源或值。例如,api-lambda-stripe-charge 组件的输出为 SNSTopic,这是一个 Amazon SNS 主题。这让我可以挂载其他组件或业务逻辑,从而在付款成功时收到通知。例如,也可以挂载 lambda-send-email-ses 组件,它会在付款成功时发送一封电子邮件。


最后,我运行了以下两个命令:


aws cloudformation package --template-file template.yaml --output-template-file output.yaml --s3-bucket YOUR_BUCKET_NAMEaws cloudformation deploy --template-file output.yaml --stack-name product-show-n-pay --capabilities CAPABILITY_IAM
复制代码


对于第二个命令,您可以根据需要添加参数覆盖。


我的产品选择和付款应用程序已成功部署!

小结

AWS Serverless Application Repository 让我可以分享和重复使用常用的组件、服务和应用程序,从而真正专注于创造核心业务价值。


我只用简单几步就构建了一种可让客户选择产品并付款的应用程序。整个过程花费了几分钟,而不是几小时或几天! 您可以看到,无需很长时间即可对组件进行仔细的分析和检查。现在,我可将该组件与公司的其他团队共享,这样他们也能消除重复劳动。


现在,您可以立即使用 AWS Serverless Application Repository 来加快您的团队开发产品、交付功能以及构建和共享生产就绪型应用程序的方式。


作者介绍:


Aleksandar Simovic


AWS 无服务器精英, Science Exchange 的高级软件工程师,他与 Slobodan Stojanovic 合著了《Serverless Applications with Node.js》一书(由 Manning Publications 出版)。他还在 Medium 上撰写关于无服务器的业务和技术层面的文章。


本文转载自 AWS 技术博客。


原文链接:


https://amazonaws-china.com/cn/blogs/china/building-serverless-apps-with-components-from-the-aws-serverless-application-repository/


2019-10-10 11:22696
用户头像

发布了 1852 篇内容, 共 119.6 次阅读, 收获喜欢 78 次。

关注

评论

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

2022年牛客网最新版大厂Java八股文面试题总结(覆盖所有面试题考点)

架构师之道

编程 程序员 java面试

公司项目终于用上了插入式注解,真香!

Java永远的神

程序员 程序人生 项目 架构师 后端开发

ROMA集成关键技术:增量数据集成

华为云开发者联盟

云计算 后端 华为云 12 月 PK 榜

QSDK/ipq5018/2T2R/Bluetooth BT5.1 supporting QCN9074/industrial wifi6 module

wallysSK

QCN9074 ipq5018

我人傻了!新入职的同事三下五除二就搭建了一个简易版秒杀系统

程序员小毕

程序员 程序人生 后端 架构师 秒杀系统

柏睿数据完成阿里云PolarDB数据库产品生态集成认证

阿里云数据库开源

阿里云 polarDB PolarDB-X PolarDB-PG PolarDB for PostgreSQL

零基础学习前端开发培训机构怎么选

小谷哥

大数据有没有必要参加培训?

小谷哥

学习web前端应该选择哪个培训机构?

小谷哥

面对复杂中国式报表,哪款BI商业智能工具适合你?

小偏执o

Zebec正在以流支付的方式,推动加密支付走向主流

股市老人

PCB工程师最实用的拼版案例合集请查收!

华秋PCB

PCB PCB设计 拼版

武汉前端培训学习靠不靠谱?

小谷哥

数据治理:聊聊数据血缘!

用友BIP

重磅 | 招商局集团、招商局港口荣获CGMA年度大奖——九科信息与百年招商局共同探索财务数智化转型之路

九科Ninetech

MatrixDB v4.5.0 重磅发布,全新推出 MARS2 存储引擎!

YMatrix 超融合数据库

数据库 存储引擎 超融合数据库 版本迭代 YMatrix

体验百度Java后端一面凉经,让我有了新的感悟

小小怪下士

Java 百度 程序员 面试

行业方案 | 新规落地,企业集团财务公司如何构建数智财务体系?

袋鼠云数栈

LeaRun.net代码生成器 一键生成前后端代码

力软低代码开发平台

无代码是否能成为主流

间隔

研发 Leader 怎样写出非研发也看得懂的年终总结?

思码逸研发效能

研发效能 年终总结

瓴羊Quick BI 权限管理:开拓数据分析效率和智能化水平的新高度

对不起该用户已成仙‖

StoneDB荣获"2022年度优秀开源技术团队" : 决心做好下一代MySQL高性能分析加速器

StoneDB

MySQL 开源 HTAP 数据库· StoneDB

云计算技术是基于互联网和网络的新技术

Finovy Cloud

云服务器 云技术 云渲染

一名曾因线上P0故障导致月工资扣了10%的码农心得:如何在故障10分钟黄金时间快速排障

KINDLING

Java 运维 可观测性 线上故障 ebpf

零基础去程序员培训机构靠不靠谱?

小谷哥

产品负责人 VS 产品经理

ShineScrum

产品经理 产品负责人

AI作画技术实践第二期|用腾讯云智能图片融合优化AI绘画的效果

牵着蜗牛去散步

腾讯云 腾讯 AI作画 腾讯云智能 智能内容创作

任务管理轻松实现大规模设备管理控制——设备管理类

阿里云AIoT

运维 监控 云安全 消息中间件 储存

Java: 在Excel中插入和提取图片

Geek_249eec

Java Excel 图片

使用来自 AWS Serverless Application Repository 的组件构建无服务器应用程序_语言 & 开发_亚马逊云科技 (Amazon Web Services)_InfoQ精选文章