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 个选择。
- 在您的管道中正常输出您的工件,只需执行从代码构建到代码部署的整个回购。您的代码 deoploy 可以自然地拾取工件并将自动将 S3 url 附加到那个
但是,如果您正在使用 Python,您必须知道从树中较深的 lambda 目录开始将意味着 python 导入期望该目录是根目录 -这意味着如果您在 Lambdas/Lambda1 中并且想要导入存在于 Lambda1 目录中的文件,为了使其在 AWS Lambda 上运行,您需要只导入文件名,忽略其余部分路径。
这意味着编码可能很困难,运行 单元测试也可能很困难。您需要将所有单独的 lambda 文件夹(及其路径)从根目录添加到代码构建实例的 PYTHONPATH env 变量,以便单元测试知道在哪里执行此操作(并将 .env 文件添加到您的 IDE以及在您当地处理这个)
- 您使用 CDK 并且 cdk 合成了您要部署的堆栈。这将创建一个 cdk.out 文件夹,其中包含一堆资产 zip 以及堆栈模板(json)。您在 codebuild 中调整工件输出以输出 cdk.out 文件夹,资产 zip 会自动(感谢 cdk)代入同样自动合成的模板中的 codeUri 位置。一旦知道模板名称是什么,就可以轻松设置 CodeDeploy 以查找该模板名称,它会为每个 lambda 单独找到资产 zip。
我正在使用 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 个选择。
- 在您的管道中正常输出您的工件,只需执行从代码构建到代码部署的整个回购。您的代码 deoploy 可以自然地拾取工件并将自动将 S3 url 附加到那个
但是,如果您正在使用 Python,您必须知道从树中较深的 lambda 目录开始将意味着 python 导入期望该目录是根目录 -这意味着如果您在 Lambdas/Lambda1 中并且想要导入存在于 Lambda1 目录中的文件,为了使其在 AWS Lambda 上运行,您需要只导入文件名,忽略其余部分路径。
这意味着编码可能很困难,运行 单元测试也可能很困难。您需要将所有单独的 lambda 文件夹(及其路径)从根目录添加到代码构建实例的 PYTHONPATH env 变量,以便单元测试知道在哪里执行此操作(并将 .env 文件添加到您的 IDE以及在您当地处理这个)
- 您使用 CDK 并且 cdk 合成了您要部署的堆栈。这将创建一个 cdk.out 文件夹,其中包含一堆资产 zip 以及堆栈模板(json)。您在 codebuild 中调整工件输出以输出 cdk.out 文件夹,资产 zip 会自动(感谢 cdk)代入同样自动合成的模板中的 codeUri 位置。一旦知道模板名称是什么,就可以轻松设置 CodeDeploy 以查找该模板名称,它会为每个 lambda 单独找到资产 zip。