CDK:单独部署微服务端点 (lambda)

CDK: Deploy microservice endpoints (lambdas) individually

我正在使用 CDK 为将使用 APIGateway 的 RestAPI 的微服务编写 IAAC。

我有一个包含所有 lambda 和 restApi 的堆栈,我可以很好地部署所有内容。

现在的问题是,当两个人在不同的端点上工作时,我希望他们能够只部署他们正在处理的端点 (lambda)。目前,当他们部署时,CDK 从他们的 repo 部署所有端点,覆盖某人可能从他们的分支部署的更改。

我很乐意分享一些代码,但我不确定要分享什么。我想我可以使用一些帮助来构建堆栈中的代码来实现我需要的。

您有一个 api 网关在来自两个不同存储库的两个不同端点之间共享。

我可以想到以下几种方法:

选项 1:我们需要 4 个堆栈。

  • 网关堆栈:Api 网关和根端点。
  • 端点 1 堆栈:Lambda 和必要的路由。
  • Endpoint2 堆栈:Lambda 和必要的路由。
  • 网关部署堆栈:部署阶段。

每次更改 lambda 函数时,部署它自己的堆栈和部署堆栈。

选项 2:我们只需要 1 个堆栈,但单独部署 lambda。

  • 部署所有内容的单个 CDK 项目。唯一要记住的是,应该从 S3 存储桶位置获取 lambda 函数的工件。
  • 在每个 lambda 的单独管道中,将工件复制到 cdk 中 lambda 引用的相同 S3 位置,并使用 aws cli 触发对 lambda 的更新 update-function-configuration 就像使用时间戳或环境变量的更新描述一样简单, 只是为了触发新的部署。
  • 这样我们可以无缝部署 CDK 管道或单独的 lambda 管道

您有 2 个选项可以轻松解决此问题。

第一个是使用代码来识别谁在部署堆栈。如果开发人员 1 正在部署堆栈,则为堆栈设置一些环境变量或参数。基于该值,CDK 代码应仅编译端点存储库中的 1 个。

第二个选项是不将存储库构建为 (CDK) 部署的一部分。使用单独构建回购代码的持续交付(或其他任何方式),CDK 仅部署它们。

根据您项目的背景,任何一种策略都应该适合您。或者,如果直到现在还没有涉及,请分享更多上下文。

感谢您的意见。我采取了以下对我有用的方法:

const testLambda = new TestLambda(app, "dev-test-lambda", {
  ...backendProps.dev,
  dynamoDbTable: docStoreDev.store,
});

const restApiDev = new RestApiStack(app, "dev-RestApi", {
  ...backendProps.dev,
  hostedZone: hostedZones.test,
  testFunction: testLambda.endpointFunction,
});

现在,如果开发人员只想部署他们的 lambda,他们将只部署 lambda 的堆栈,而不会部署任何其他内容。由于 restApiStack 需要 lambda 作为依赖项,因此部署它也会同时部署所有其他 lambda。