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

AWS CDK - Multiple Stacks - Parameters for the location of Lambda Code is not found

我正在使用 CDK 设置 CI/CD 管道。我目前有一个从 git 构建到管道中的代码。然后有两个构建 - 一个为 lambda 提取代码并为其构建工件,第二个发布 cdk synth 以构建 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

我根据上述 link:

将它们分配为覆盖
                                    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 堆栈都试图为代码的位置部署参数 'do not exist'

我已经尝试覆盖参数,但在管道中并动态创建时,我犹豫是否要进一步跟进(我的尝试无论如何都没有奏效)。我尝试了很多不同的 stack/nested stack/single 堆栈配置,但还没有成功。

想法?

这基本上归结为如果您的 CodeUri 以 ./

开头,Cloudformation 模板中的 CodeUri 将自动附加 s3 存储桶

所以你有 2 个选择。

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

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

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

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