通知1:与本博文相关的所有代码都可以在

https://github.com/turjachaudhuri/AWS-Serverless/tree/SAMRepositoryApp1

随意分叉,让我知道你用我蹩脚的代码做了什么很棒的事情。

什么是 AWS Serverless Application Repository?

AWS Serverless Application Repository 使开发人员和企业可以轻松地在 AWS 云中快速查找、部署和发布无服务器应用程序。有关更多详细信息,请查看 -https://docs.aws.amazon.com/serverlessrepo/latest/devguide/what-is-serverlessrepo.html

基本上,这个 repo 是由 AWS 团队和世界各地的开发人员贡献的无服务器应用程序的集合。这些应用程序可以直接部署到您自己的 AWS 账户中,只需单击一个按钮,并设置一些参数(稍后会详细介绍)。

您可能要提交到这些存储库的任何应用程序都需要遵循一些规则,其中之一是您的应用程序需要有一个有效的 AWS 无服务器应用程序模型 (AWS SAM) 模板文件,该文件定义您使用的 AWS 资源应用程序。

什么是 AWS SAM?

对于那些在 Serverless 应用程序方面有一定工作经验的人来说,你必须意识到,在一段时间之后,手动维护一个 Serverless 应用程序是相当困难的。因为一个应用程序中有这么多不同的组件,主要是在它开始增长的时候。随着时间的推移,会添加复杂的新组件。一个应用程序很容易拥有大约 20 多个 lambdas、它们相关联的事件、IAM 角色和与这些 lambdas 相关联的策略、DynamoDB 表、S3 存储桶等。如果没有某种框架,维护这样的解决方案是极其困难的。这就是 AWS SAM 的用武之地。

AWS SAM 有一个模板文件(JSON/YAML 格式),它描述了您的应用程序需要具备的一切,从 lambdas 开始,它们的代码所在的位置、DynamoDB 表、关联的 IAM 角色和策略。它与 CloudFormation 模板极为相似,SAM 引擎在内部实际上将 SAM 模板转换为 CloudFormation(CF) 模板,然后使用 AWS CF 将其部署到您的 AWS 设置中。

SAM 使得开始创建无服务器应用程序和维护它们变得非常容易,因为它们开始变得越来越复杂和参与。有关 SAM 的更多信息,请查看 -https://github.com/awslabs/serverless-application-model

我刚开始时希望完成什么?

基本上,我想创建一个非常基本的无服务器应用程序并将其发布到 AWS SAM 存储库,以便其他用户可以部署它。另外,我想了解整个流程,因为我之前没有使用过 SAM。

以前,我主要依靠无服务器框架来完成这类工作。如果您想查看无服务器框架,以及它可以为您做什么,请访问此站点 -https://serverless.com/

我的应用程序是做什么的?

从任何标准来看,我的应用程序都非常简单。它只是由一个 lambda 函数组成,每次将某个对象插入配置的 S3 存储桶时都会触发该函数,然后将文件名和时间戳加载到 DynamoDB 表中。我的目标不是为业务场景创建复杂的无服务器应用程序,我只是想了解 SAM 的工作原理以及如何利用它来更轻松地维护无服务器项目。

使用 SAM 是否意味着我不必编码?

一点也不 。 SAM 只是一个模板文件,它是对应用程序所有组件、这些组件之间交互的事件、IAM 角色等的技术描述。它不是进入 lambda 函数的代码的替代方案。您仍然需要编写可构建的代码,但是 SAM 会毫不费力地将您的 lambda 函数与您的代码链接起来。

此外,SAM 引擎可以帮助您验证 SAM 模板是否正确,并可以帮助您使用一些基本命令从 SAM-cli 轻松部署整个应用程序。

够了!如何开始?

要安装 SAM-cli ,最简单的方法是通过 pip 开始。 SAM-cli 是在 python 上编写的,因此需要在您的系统上安装 python 作为先决条件。

pip install aws-sam-cli

进入全屏模式 退出全屏模式

问题 1: 由于 aws-cli 、 sam-cli 、 boto3 、 boto-core 等之间的版本冲突和依赖错误,我在这个原本简单的安装中遇到了很多问题。但是,它们并不是致命的错误,如果你只是有耐心,并且一个一个地处理依赖关系,这将是一个不费吹灰之力的解决方案。

请点击此链接了解详细说明 -https://docs.aws.amazon.com/lambda/latest/dg/sam-cli-requirements.html

问题 2: 不,您不需要 docker 来安装 sam-cli 。仅当您想使用 SAM Local 在本地机器上进行单元测试时才需要 Docker,这将是一篇完全不同的博客文章(如果我弄明白的话)。

设置项目

转到您的工作目录并运行此命令-

sam init --runtime dotnetcore2.0

进入全屏模式 退出全屏模式

您可以根据自己的舒适度从支持的运行时中选择任何运行时。我更喜欢 C# ,所以我选择了 dotnetcore 。上面的命令将为您创建一个带有示例 template.yaml 文件和一些示例 C# 代码的 HelloWorld 项目。

现在您可以在您最喜欢的 IDE 中打开解决方案,并根据需要编写代码。

**问题 3:**模板文件不仅需要在 YAML 中。也支持 JSON。到目前为止,我更喜欢 JSON 而不是 YAML。所以我只是使用了 template.json 而不是 template.yaml 。但是,在这种情况下,在 SAM cli 中的所有后续命令中,您需要明确提及您的模板文件名为 template.json。

**问题 4:**互联网上关于 SAM 模板的大多数示例都是 YAML 示例。如果您需要继续,必须能够快速且没有任何错误地将它们转换为 JSON。在我的开发过程中,我经常使用在线工具https://codebeautify.org/yaml-to-json-xml-csv。

如何处理template.json文件?

如果您不熟悉 CloudFormation 或任何 IaC(基础设施即代码)脚本工具/任何类型的语言,那么开始使用 SAM 会有些困难。但是一旦你掌握了它,它就会非常直观且易于使用。您可以描述 S3 Bucket、DynamoDB 表等资源,在脚本中使用变量/参数使它们更加动态,使用一些巧妙的 CF 转换来帮助您。此外,网络上有很多示例可以帮助您,以防您遇到困难。

问题 5: 对于熟悉 CF 模板的人来说,他们知道在 CF 中我们可以定义角色、策略、将策略与角色关联,然后将这些角色关联到其他资源,例如 lambda 函数或 kinesis 流。在 SAM 中都可以做到这一点,但无服务器存储库不会接受所有 SAM 策略。截至目前,AWS 有一个仅在 AWS Serverless 存储库中受支持的策略模板列表。您不能创建自定义角色并使用它们。即使 SAM 模板将验证,并且您可以使用 SAM deploy 命令将它们部署到您的帐户,但这些 SAM 模板不会被 Serverless 应用程序存储库接受。更多信息可以在这里找到:https://docs.aws.amazon.com/serverlessrepo/latest/devguide/using-aws-sam.html#serverlessrepo-policy-templates

编码完成,我可以在本地测试吗?

AWS SAM Local 可用于本地测试。我个人还没有修改它,虽然我希望有一天。据我了解,它使用您的代码生成一个 docker 实例,您可以使用它。

但是,我通过 Visual Studio 进行单元测试。归根结底,即使您编写的代码是针对 lambda 函数的,它也是类中的函数,因此也可以进行测试。然而,困难的是模拟 S3 事件或 API 请求事件。适用于 .NET 的 AWS 开发工具包具有可用于创建示例事件的类,然后使用这些测试事件和测试执行上下文调用您的 lambda 函数代码。

检查我在本博客顶部提到的 GitHub 存储库中的代码。我有一个单独的单元测试文件夹,其中包含一个单元测试,它模拟 S3 事件并使用测试事件调用 lambda 函数以验证所有调用是否可以正确完成。

问题 6: 当实际的 lambda 函数在 AWS 生态系统中运行时,它将以与其关联的角色的权限运行。但是,当您进行单元测试时会发生什么。您的代码将拥有或不拥有什么特权,是否能够进行 AWS API 调用,或者它们会失败?

在这种情况下继续进行的方法是使用 AWS 配置文件。更多信息在这里 -https://docs.aws.amazon.com/cli/latest/userguide/cli-multiple-profiles.html。您可以创建一个或多个您想要的配置文件,并在您使用 Visual Studio 时选择要使用的配置文件。如果您在 Microsoft 商店,请下载适用于 VS 2017 的 AWS Toolkit,配置您的配置文件并选择您想要的。此外,可以通过如下代码设置配置文件:

Amazon.Runtime.AWSCredentials credentials = new Amazon.Runtime.StoredProfileAWSCredentials("[PUT YOUR PROFILE NAME HERE]");

进入全屏模式 退出全屏模式

可以在此处找到更多信息:https://aws.amazon.com/blogs/developer/referencing-credentials-using-profiles/

一切正常,如何部署到我的 AWS 设置?

要部署到 AWS,只需使用一些基本命令。转到源代码所在的工作目录并键入以下内容:

命令 1-

sam validate --template template.json --profile Hackathon

进入全屏模式 退出全屏模式

这里的 template.json 可以是定义了 SAM 模板的任何文件 (json/yaml),Hackathon 是与您要使用的 AWS 账户对应的 aws 配置文件。此命令将告诉您 SAM 模板是否有效。始终在实际部署之前执行此操作。

问题 7: 不要忘记提及个人资料。如果没有提到配置文件,它将考虑默认配置文件。这可能不是您想要的,也可能不是其他 AWS 帐户。

命令 2:

aws s3 mb s3://aws-sam-test-1 --region ap-south-1 --profile Hackathon

进入全屏模式 退出全屏模式

这只是创建一个 bucket 。这是我们的整个应用程序详细信息(代码)将被压缩和存储的存储桶。当我们在未来的步骤中将我们的应用程序部署到 AWS 时,CloudFormation 引擎将创建所有必需的资源并从该存储桶中的 zip 填充 AWS Lambda 函数。

问题 8: 存储桶名称在所有 AWS 中必须是唯一的(所有区域、所有用户、所有内容)

命令 3:

sam package --profile Hackathon --template-file template.json --output-template-file serverless-output.yaml --s3-bucket aws-sam-test-1 --force-upload

进入全屏模式 退出全屏模式

此命令会将整个应用程序打包成一个 zip 并将其上传到提到的 s3 存储桶中,并创建一个输出 SAM 模板文件 serverless-output.yaml ,该文件将引用来自 s3 存储桶 zip 的代码。

命令 4:

sam deploy --profile Hackathon --template-file serverless-output.yaml --stack-name aws-sam-trial-1 --capabilities CAPABILITY_IAM --region ap-south-1

进入全屏模式 退出全屏模式

这基本上调用 CloudFormation 部署命令来实际创建具有上述指定名称的 CF 堆栈,并创建 SAM 模板文件中提到的所有资源。当此命令运行时,您实际上可以导航到 AWS 控制台并检查 CloudFormation。您可以看到您的堆栈正在被创建,并且它的所有相关资源正在被一一创建。

问题 9: 您的 AWS SAM 模板在大多数情况下都会定义一些参数,以使您的模板动态化并且您的基础设施设置可配置。这些参数通常可以在部署堆栈时由用户配置。但是,当 SAM 部署命令运行时,它不会要求用户输入,它只是使用 SAM 模板文件中提到的参数的默认值部署堆栈。所以,如果你有要创建的bucket名称的参数,请确保它是唯一的,否则创建堆栈会失败并回滚。

问题 10: 如果堆栈创建由于某种原因失败,则堆栈将转换为 ROLLBACK_COMPLETE。如果此时您对 template.json 进行了一些更改并再次运行 SAM deploy,它将失败。所以,你需要先删除你的堆栈,然后在这种情况下继续。

如果上述所有命令都运行没有任何错误,则意味着您的所有 AWS 资源都已根据您的模板文件创建和配置,lambda 代码也已链接到前面提到的代码 zip。此时,您可以进入您的 AWS 控制台,测试并检查一切是否正常。

Gotcha 11: 您不太可能第一次就正确地编写所有代码。您将对实际代码(不是 template.json、纯 C# 或 java 代码)进行多项更改,并希望将这些更改推送到 AWS 生态系统中。在这种情况下,SAM 部署命令将失败,因为在基础架构方面没有堆栈更改,CF 认为没有什么可部署的。在这种情况下,最好使用单独的命令或使用 AWS Toolkit for VS to deploy 。您只需单击一下即可选择您的项目并将其部署到 AWS。这只会将您最新的代码更改部署到 lambda 函数,仅此而已。

我的应用程序摇滚。现在如何将其发布到 SAM 存储库?

将应用程序发布到 SAM 存储库非常简单。只需按照此处提到的步骤 -https://docs.aws.amazon.com/serverlessrepo/latest/devguide/serverless-app-publishing-applications.html

但是有一些事情要记住。

  1. 如果你想让你的应用程序公开,它需要有一个开源许可证,并且代码需要被推送到某种公共存储库,比如 git ,以及应用程序详细信息中引用的链接。当应用程序是 public 时需要这样做,而不是在所有情况下。

  2. 发布app的时候会要求选择SAM模板文件,不要选择自己写的template.json文件。您需要选择在上一节中作为命令 3 的输出创建的 serverless-output.yaml 文件。这是因为 template.json 引用了您的本地代码,而 serverless-output.yaml 引用了打包代码所在的 S3 存储桶的实际代码 Uri。

  3. 确保添加存储桶策略,授予 SAM 存储库服务访问您的代码的权限。这是必需的,以便当用户尝试在其 AWS 账户中部署您的应用程序时,SAM 存储库服务可以通过引用存储在您的存储桶中的打包代码在您的账户中设置 CF 堆栈。这也在这里提到 -https://docs.aws.amazon.com/serverlessrepo/latest/devguide/serverless-app-publishing-applications.html

我的应用程序已发布。怎么办?

现在转到https://serverlessrepo.aws.amazon.com/applications并按应用名称/作者姓名搜索您的应用。单击应用程序旁边的部署并将其部署到其他区域以进行测试。您只需配置参数名称,让 CloudFormation 发挥它的魔力。 CF会一一生成资源,你准备好了。

从这里去哪里?

未来充满无限可能。 AWS SAM 模板为无服务器应用程序的世界提供了一个全新的维度。就像 CF 帮助您在单个 CF 文件中维护庞大的基础设施设置,可以进行版本控制一样,SAM 模板让您可以为无服务器应用程序做同样的事情。

在不同的帐户或单独的区域中复制构成您的应用程序的无服务器组件不需要一天的时间,而只需 1-5 分钟。从灾难恢复的角度来看,这也是一个巨大的优势。

此外,我相信 AWS 会将无服务器存储库开发成一个市场,充满有用的应用程序,其他用户可以利用这些应用程序作为他们下一件大事的起点或他们复杂的多层应用程序的关键组件。

截至今天,无服务器存储库中有 335 个应用程序。来吧,做一个。别忘了看看我开发的简单应用程序。搜索“FileLogTracker”或“turja”并试一试。

请随时通过我的电子邮件与我联系,或在 LinkedIn 中给我留言。很想知道你们现在在做什么。

谢谢。

Logo

云原生社区为您提供最前沿的新闻资讯和知识内容

更多推荐