InfoQ|一个经典的100%无服务器架构在AWS上是什么样?( 四 )


https://docs.aws.amazon.com/zh_cn/apigateway/latest/developerguide/apigateway-integrate-with-cognito.html
然而 , 还有一个忠告:Cogito 现在还不是用于管理你整个用户数据的数据库不二之选 。 它有一些不足 , 例如 , 你可以拥有的属性数量是存在限制 的。 如果你需要一些灵活性 , 你最好将自定义的属性存在 DynamoDB 中 。
状态机
InfoQ|一个经典的100%无服务器架构在AWS上是什么样?
本文插图

在某些情形下 , 我们的逻辑和数据流可能会非常复杂 。 如果直接在 Lambda 函数内部手动维护和操作这些数据流 , 你可能会难以跟踪和理解正在发生的事情 。 因此 , AWS 为我们提供了专门提供了一个服务:可视化工作流服务 (Step Functions) 。
https://aws.amazon.com/cn/step-functions/
我们通过 CloudFormation 来声明状态机:包括每个子步骤和状态、每个希望得到的结果和不希望得到的结果 , 并且将一些原生操作(例如等待、选择)或者一个 Lambda 挂载在这些步骤上 。 然后 , 我们可以通过 AWS 界面实时看到我们的服务可视化地运行(并且还能查看日志) 。 在其中的每个步骤中 , 我们可以定义重试和失败处理逻辑 。 Ben Ellerby 在这篇文章中进一步详细介绍了该服务 。
https://medium.com/serverless-transformation/serverless-event-scheduling-using-aws-step-functions-b4f24997c8e2
举一个更加具体的例子 , 假设我们希望通过 SaaS 发送一个电子邮件广告 , 并且能够确保该广告已经发送完毕:
步骤 1 , Lambda:要求 SaaS 发送电子邮件广告系列并获取广告的 ID 。
步骤 2 , 任务令牌 Lambda:从 Step Function 中获得回调令牌 , 将其链接到广告 ID , 然后等待来自 SaaS 的回调 。
步骤 3 , (在任务流之外的)Lambda:在广告的状态发生改变时(待定、存档、失败、成功) , 从 SaaS 通过一个钩子函数调用 , 然后通过对应的回调令牌根据新的广告状态来继续任务流 。
步骤 4 , 选择(Choice):基于状态选择 , 如果这个广告还没有成功 , 回到第二步 。
步骤 5 , (结束)Lambda:在广告发送后 , 更新用户 。
这篇文章深入讲述了任务令牌(Task Tokens )是如何工作的 。
https://medium.com/@zaccharles/9df97fe8973c
安全
InfoQ|一个经典的100%无服务器架构在AWS上是什么样?
本文插图

Identity and Access Management (IAM) 帮助我们非常细粒度地管理任何 AWS 访问 , 不 管是开发人员的访问、持续集成与持续交付流程,还是 AWS 的服务调用另一个服务 。 它乍看之下可能令人望而却步 , 但它的优点是十分先进和精细 , 要求我们认真思考某个特定的“消费者”被允许操作的每个微小行为 。 这意味着我们基础架构中的每一层都是受到保护的 。 Ben EllerbyerverlessDays 在 Nashville 的峰会中提到了这个话题 。
https://www.youtube.com/watch?v=qhIzUHvllGw
对于非常敏感的数据 , 比如 SaaS 的 API 密钥 , 我们将其安全地存储在 System Manager 中的 Parameter Store 中 。 无论是来自我们的无服务器架构框架还是 CloudFormation 文件 , 甚至是来自我们的代码的访问 , 都必须通过对应的 SDK 来请求它们 。 值得一提的是 ,AWS Secrets Manager 也可以完成类似的工作 。 并且 Key Management System 也可以帮助我们管理加密密钥 。
https://aws.amazon.com/cn/systems-manager/
如果对该话题感兴趣 , 我推荐来自 Sat G 的这篇文章 , 关于无服务器架构中的安全问题在此文章中有更详细的概述 。
https://medium.com/version-1/protecting-your-serverless-solution-cd5d4247e27c


推荐阅读