AWS CDK - 多个堆栈 - 找不到 Lambda 代码位置的参数

Posted

技术标签:

【中文标题】AWS CDK - 多个堆栈 - 找不到 Lambda 代码位置的参数【英文标题】:AWS CDK - Multiple Stacks - Parameters for the location of Lambda Code is not found 【发布时间】:2021-02-02 13:55:51 【问题描述】:

我正在使用 CDK 设置 CI/CD 管道。我目前有一个从 git 构建到管道中的代码。然后有两个构建 - 一个为 lambda 提取代码并为其构建一个工件,另一个发出 cdk 合成器以构建 lambda 框架(包括嵌套桶和发电机)。

然后它进入部署阶段,但由于找不到 lambda 代码位置的参数而失败

我一直在使用这个例子:https://docs.aws.amazon.com/cdk/latest/guide/codepipeline_example.html

与此示例的唯一区别是我对所有这些都使用 python,并且由于已知的未来需求,lamdba 位于堆栈代码的并行目录中

|-Lambdas
|--Lambda1
|---Lambda1Code
|--Lambda2
|---Lambda2Code
|-CDKStacks
|--LambdaCreationStack
|--PipelineCreationStack
|--app.py

一切都运行,直到部署失败并出现错误“以下 CloudFormation 参数缺少值:”,然后列出 BucketName 和 ObjectKey

我根据上面的链接将它们指定为覆盖:

                                    admin_permissions=True,
                                    parameter_overrides=dict(
                                        lambda_code.assign(
                                            bucket_name=lambda_location.bucket_name,
                                            object_key=lambda_location.object_key,
                                            object_version=lambda_location.object_version
                                        )
                                    ),

作为管道操作 CloudFormationCreateUpdateStackAction 的一部分,并像示例中一样将代码从 lambda 堆栈传递到管道堆栈。但是每次 lambda 堆栈尝试部署代码的位置的参数'不存在'

我尝试过覆盖参数,但在管道中并动态创建我犹豫是否要进一步跟进(而且我的尝试无论如何都没有奏效)。我尝试了一堆不同的堆栈/嵌套堆栈/单堆栈配置,但还没有成功。

想法?

【问题讨论】:

更多信息:参数覆盖位于 PipelineStack 但不在 LambdaDeploymentStack - 我可以看到 Pipeline 堆栈的构建规范适当的 s3 存储桶和密钥作为替代。如何从 PipelineStack 到 LambdaStack? 嗨。这有什么好运气吗?我正在处理非常相似的事情 是和否(因为我刚刚在处理类似问题时再次发现这一点)将在 cloudformation 合成阶段使用来自源的输出工件确定正在传递的代码位置 - 工件成为输入对于下一阶段,云形成模板会自动更新 codeuri 以附加 s3 url。因此,使用 'code=aws_lambda.AssetCode(os.path.join(base_directory, code)' 会将其指向本地位置,但会在传入管道时附加 s3 工件 【参考方案1】:

这基本上归结为 Cloudformation 模板中的 CodeUri 如果您的 CodeUri 以 ./ 开头,将自动附加 s3 存储桶

所以你有两个选择。

    在您的管道中正常输出您的工件,只需执行从代码构建到代码部署的整个 repo。您的代码 deoploy 可以自然地获取工件并自动将 S3 url 附加到该工件

但是,如果您使用的是 Python,则必须注意,从树中更深的 lambda 目录开始意味着 python Imports 期望该目录是根目录 - 这意味着如果您在 Lambdas/Lambda1 中并且想要要导入 Lambda1 目录中存在的文件,为了使其在 AWS Lambda 上运行,您需要将导入的文件名设为文件名,而忽略路径的其余部分。

这意味着编码可能很困难,运行单元测试也可能很困难。您需要将所有单独的 lambda 文件夹(及其路径)从根目录添加到 codebuild 实例的 PYTHONPATH 环境变量,以便单元测试知道在哪里执行此操作(并将 .env 文件添加到您的 IDE 以及处理这个在你当地)

    您使用 CDK 并 cdk 合成您想要部署的堆栈。这将创建一个 cdk.out 文件夹,其中包含一堆资产 zip 以及堆栈模板(一个 json)。您在 codebuild 中调整工件输出以输出 cdk.out 文件夹,并且资产 zip 会自动(感谢 cdk)嵌入到同样自动合成的模板中的 codeUri 位置。一旦您知道模板名称是什么,就可以轻松设置 CodeDeploy 以查找该模板名称,它会为每个 lambda 单独查找资产压缩包。

【讨论】:

以上是关于AWS CDK - 多个堆栈 - 找不到 Lambda 代码位置的参数的主要内容,如果未能解决你的问题,请参考以下文章

解决 AWS CDK CloudFormation 堆栈之间的循环依赖关系

AWS CDK:如何在同一应用程序中引用跨堆栈资源?

无法解析要使用的 AWS 账户。它必须在定义 CDK 堆栈时进行配置,或者通过环境进行配置

AWS CDK 将 API Gateway URL 传递到同一堆栈中的静态站点

AWS - 找不到 Cloudfront 堆栈

使用来自共享资源的 api-gatewayv2 时未绑定 aws cdk lambda