如何将无服务器代码与本地服务器代码分开
How to separate serverless code from local server code
我目前有一个托管在 AWS S3 存储桶托管上的静态 Web 应用程序。后端 API 在 Lambda/API 网关上 运行ning。我设置了一个持续开发管道,它自动构建(使用 CodeBuild)并将我的代码从 GitHub 存储库部署(使用 CodeDeploy)到 S3。
我现在遇到的问题是无服务器部署的代码与我需要在本地环境中 运行 的代码不同。
例如,我希望我的本地环境从本地主机调用 API,但我希望我的生产环境从 api.example.com 等站点调用 API。还有一些代码为了部署到 Lambda 而不同,如果不还原更改,它不会在本地 运行。
另一个例子:在 Express 服务器上本地 APIs 运行,但在 AWS 上代码需要包装在
exports.handler = async (event, context, callback) => {...}
到 运行 在 Lambda 上无服务器。
我的问题是,如何在我的 Git 存储库中处理本地和无服务器之间的这些差异?
有两种方法可以处理这个问题。其中之一是在构建步骤中设置正确的数据。例如,您可以拥有一个配置文件,该文件是在构建步骤中使用环境设置构建的,如果未设置,则将这些选项默认为开发选项。从环境中读取设置,即使是在构建步骤中,也是实现配置更改的常用方法。
另一种方法是有两个配置文件,开发和生产,并在构建时使用正确的设置。您的 CD 管道可以知道您正在为生产构建并使用配置中的正确值。
一般来说,为此使用 Git 分支不是一个好的选择,因为它可能会导致很多冲突并不必要地将设置从一个分支复制到另一个分支,这可能是您不希望的.
在我看来,为此使用 Codepipeline、CodeBuild 和 Cloudformation 可能是一个不错的选择。您没有具体说明您已经在使用什么,所以我提供这个作为示例。
它需要一些 up-tooling 才能工作。要开始使用,您可以查看 CodeStar,它可以在几分钟内为您 set-up 提供示例 - 您可以根据自己的目的进行编辑。它可以轮询 github 存储库以获取特定分支上的更改以启动构建。
在管道中,您可以说 4 个阶段:来源(从 git 拉取源代码)、构建(CodeBuild 以创建构建工件)、Dev/Test 环境和最后的生产。
您可以在 git 存储库中为每个不同的开发和生产配置保留不同参数文件(用于 cloudformation 应用程序堆栈)的 non-sensitive 配置。作为部署阶段的一部分,您将用于开发和生产的不同 (json) 参数文件(例如来自 github 存储库)注入到 cloudformation 堆栈中。其中一些您还可以通过参数覆盖注入(例如,您想要使用 "build tags" 之类的提交 ID 或其他内容时派上用场)。
考虑对 username/password 对等敏感位使用 Secrets Manager(或者可能是所有配置 - 这也是一个选项)。每个环境使用一个 Secrets Manager 密钥。将 Secrets Manager 密钥(dev 或 prod)作为输入参数 (cloudformation) 发送到给定的应用堆栈。从应用程序代码中提取 Secrets Manager key/values(使用 IAM 角色将 Lambda 的权限授予特定 Secrets Manager 密钥)并使用 secret caching.
此外,顺便说一句 - 如果您还没有考虑使用 AWS SAM(本地)。
这样做的目的是:
- 从代码中分离配置
- 自动化构建和部署
- 最大限度地减少人为错误的范围
- 帮助减少或彻底消除部署期间的停机时间
- 回滚的简单方法(git 例如还原)
我目前有一个托管在 AWS S3 存储桶托管上的静态 Web 应用程序。后端 API 在 Lambda/API 网关上 运行ning。我设置了一个持续开发管道,它自动构建(使用 CodeBuild)并将我的代码从 GitHub 存储库部署(使用 CodeDeploy)到 S3。
我现在遇到的问题是无服务器部署的代码与我需要在本地环境中 运行 的代码不同。
例如,我希望我的本地环境从本地主机调用 API,但我希望我的生产环境从 api.example.com 等站点调用 API。还有一些代码为了部署到 Lambda 而不同,如果不还原更改,它不会在本地 运行。
另一个例子:在 Express 服务器上本地 APIs 运行,但在 AWS 上代码需要包装在
exports.handler = async (event, context, callback) => {...}
到 运行 在 Lambda 上无服务器。
我的问题是,如何在我的 Git 存储库中处理本地和无服务器之间的这些差异?
有两种方法可以处理这个问题。其中之一是在构建步骤中设置正确的数据。例如,您可以拥有一个配置文件,该文件是在构建步骤中使用环境设置构建的,如果未设置,则将这些选项默认为开发选项。从环境中读取设置,即使是在构建步骤中,也是实现配置更改的常用方法。
另一种方法是有两个配置文件,开发和生产,并在构建时使用正确的设置。您的 CD 管道可以知道您正在为生产构建并使用配置中的正确值。
一般来说,为此使用 Git 分支不是一个好的选择,因为它可能会导致很多冲突并不必要地将设置从一个分支复制到另一个分支,这可能是您不希望的.
在我看来,为此使用 Codepipeline、CodeBuild 和 Cloudformation 可能是一个不错的选择。您没有具体说明您已经在使用什么,所以我提供这个作为示例。
它需要一些 up-tooling 才能工作。要开始使用,您可以查看 CodeStar,它可以在几分钟内为您 set-up 提供示例 - 您可以根据自己的目的进行编辑。它可以轮询 github 存储库以获取特定分支上的更改以启动构建。
在管道中,您可以说 4 个阶段:来源(从 git 拉取源代码)、构建(CodeBuild 以创建构建工件)、Dev/Test 环境和最后的生产。
您可以在 git 存储库中为每个不同的开发和生产配置保留不同参数文件(用于 cloudformation 应用程序堆栈)的 non-sensitive 配置。作为部署阶段的一部分,您将用于开发和生产的不同 (json) 参数文件(例如来自 github 存储库)注入到 cloudformation 堆栈中。其中一些您还可以通过参数覆盖注入(例如,您想要使用 "build tags" 之类的提交 ID 或其他内容时派上用场)。
考虑对 username/password 对等敏感位使用 Secrets Manager(或者可能是所有配置 - 这也是一个选项)。每个环境使用一个 Secrets Manager 密钥。将 Secrets Manager 密钥(dev 或 prod)作为输入参数 (cloudformation) 发送到给定的应用堆栈。从应用程序代码中提取 Secrets Manager key/values(使用 IAM 角色将 Lambda 的权限授予特定 Secrets Manager 密钥)并使用 secret caching.
此外,顺便说一句 - 如果您还没有考虑使用 AWS SAM(本地)。
这样做的目的是:
- 从代码中分离配置
- 自动化构建和部署
- 最大限度地减少人为错误的范围
- 帮助减少或彻底消除部署期间的停机时间
- 回滚的简单方法(git 例如还原)