gpt4 book ai didi

amazon-web-services - 在 FargateTaskDefinition 中的容器上添加日志记录配置会导致 AWS CDK 中出现循环引用

转载 作者:行者123 更新时间:2023-12-03 07:33:21 31 4
gpt4 key购买 nike

我在 CDK 中遇到循环引用问题。以下是我正在开发的 CDK 应用程序的一些背景信息:

  • 我正在构建一个可重用的高级 CDK 构造库,可用于部署名为 django-cdk 的 Web 应用程序
  • 这主要用于演示和学习目的
  • 我使用 Terraform 模块做了类似的事情 terraform-aws-django 我正在尝试使用 CDK 构建完全相同的功能
  • 在我的 django-cdk 的上一次迭代中项目中,我将所有资源分组到一个堆栈中
  • 我现在正在尝试将资源拆分到可以独立部署的不同堆栈中
  • 首先,我简单地将单个堆栈分成两个堆栈:a base堆栈和 app堆栈
  • base堆栈适用于长期存在的资源(例如 VPC、RDS、IAM 角色、负载均衡器、安全组等)
  • app堆栈主要用于 ECS 资源(ECS 集群、服务、任务以及负载均衡器的目标组和监听器规则)
  • base堆栈将多个值传递给 app堆栈 app堆栈需求(如 VPC、角色、SG、RDS 等)

当我尝试运行 cdk synth 时在基础堆栈上,我收到如下错误:

Error: 'TestBaseStack' depends on 'TestAppStack' (TestBaseStack -> TestAppStack/App/ApiService/TaskDefinition/api/LogGroup/Resource.Arn) Adding this dependency (TestAppStack -> TestBaseStack/Base/RdsInstance/RdsInstance/Resource.Endpoint.Address) would create a cyclic reference.

如果我删除 logging我的FargateTaskDefinition中容器的配置(正如我所做的那样 here ,我能够正确地合成 base 堆栈。

我不知道为什么 LogGroupapp堆栈使得base堆栈依赖于app堆。 base堆栈不应依赖 app堆栈自 app堆栈构建在 base 之上堆栈。

最佳答案

TL;DR 将 ECS 任务执行角色放在与日志记录设置相同的堆栈中

AppStack 中的 AwsLogDriver(具体来说,bind 调用中的 grantWrite)想要修改 BaseStack ECS执行角色的默认策略,但不能不引入循环依赖。 CDK source: :

export class AwsLogDriver extends LogDriver {
// ...
public bind(scope: Construct, containerDefinition: ContainerDefinition): LogDriverConfig {
// ...
this.logGroup.grantWrite(containerDefinition.taskDefinition.obtainExecutionRole()); // <- this is causing your problem
// ...
}
}

grantWrite 的成功或失败取决于授予者构造(日志组)是否可以在受让人(任务执行角色)堆栈中添加内联策略:

  • ❌如果授予者所在的堆栈*取决于*受授予者(您的情况)
  • ✅ 如果授予者所在的堆栈*不依赖*受让人的堆栈(不适合您)
  • ✅ 如果授予者与受让人位于“同一堆栈”(为您工作)

如果您不想将 ECS 角色放在 AppStack 中,可以采用一种解决方法来欺骗 CDK 将策略添加到 AppStack 而不是 基础堆栈

  • ✅ 如果受助者是从应用外部导入的,则该政策将添加到受助者堆栈中
// AdhocApp constructor
// pass to WebService after modifying its props to accept IRole instead of Role
const roleDisguisedAsImport: IRole = Role.fromRoleArn(this, 'DisguisedFromRoleArn', props.executionRole.roleArn);

请注意,此行为适用于 CDK 的 grant一般模式(即 bucket.grantWrite),而不是特定于 ECS 或日志组的任何内容。

关于amazon-web-services - 在 FargateTaskDefinition 中的容器上添加日志记录配置会导致 AWS CDK 中出现循环引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74009410/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com