gpt4 book ai didi

amazon-web-services - 如何在 CloudFormation YAML 中为 AWS ECS Fargate 容器指定 `logs:CreateLogGroup` 权限

转载 作者:行者123 更新时间:2023-12-03 07:17:51 25 4
gpt4 key购买 nike

我正在尝试使用 CloudFormation 复制单个容器的极其基本的手动配置的 AWS ECS Fargate 部署。看来我快到了;生成的堆栈会旋转一个我可以访问的容器。但没有日志。

我比较了我的手动任务(通过 UI 创建)和 CloudFormation 任务,并向容器定义添加了相同的日志配置,但只需将日志组从 /ecs/foo 更改为 /ecs/bar:

LogConfiguration:
LogDriver: awslogs
Options:
awslogs-create-group: true
awslogs-group: '/ecs/bar'
awslogs-region: !Ref AWS::Region
awslogs-stream-prefix: 'ecs'

但是现在任务无法启动容器。它给出这样的错误:

Resourceinitializationerror: failed to validate logger args: create stream has been retried 1 times: failed to create Cloudwatch log group: AccessDeniedException: User: arn:aws:sts::…:assumed-role/ecsTaskExecutionRole/… is not authorized to perform: logs:CreateLogGroup on resource: arn:aws:logs:us-east-1:…:log-group:/ecs/bar:log-stream: because no identity-based policy allows the logs:CreateLogGroup action status code: 400, request id: … : exit status 1

一个documentation page提到此 logs:CreateLogGroup 权限,并表示:

To use the awslogs-create-group option, add logs:CreateLogGroup as an inline IAM policy.

但我不明白的是我的 CloudFormation 模板与通过 UI 手动创建的堆栈有何不同。通过查看为手动创建的堆栈生成的模板,两个任务定义似乎都指示了 ecsTaskExecutionRole。我的 CloudFormation 模板任务定义如下:

ExecutionRoleArn: 'arn:aws:iam::…:role/ecsTaskExecutionRole'

手动创建的堆栈如何能够创建日志组,但我的独立的从头开始的 CloudFormation 模板却不能?我应该在哪里指示 logs:CreateLogGroup 权限?手动创建的堆栈似乎没有指示任何内联策略。 (诚​​然,由于某种原因,手动创建的任务定义似乎没有使用 CloudFormation 堆栈,所以它可能有一些我在 UI 中没有看到的隐藏设置。)

最佳答案

如果我希望任务使用 awslogs-create-group 自动创建日志组,正确的方法似乎是拥有包含 logs:CreateLogGroup 的 IAM 策略 权限,如 Using the awslogs log driver 中所述。 (我仍然不明白在 UI 中手动创建任务定义如何导致创建日志组。)与 ECS resource initialization errors 相关的另一个页面。说我需要“添加 logs:CreateLogGroup 作为内联 IAM 策略”,但没有人能够提供如何在 CloudFormation 中执行此操作的示例。我确信我能弄清楚......

但是,在我看来,声明和配置 AWS::Logs::LogGroup 比让服务动态创建日志组更好。 CloudFormation 模板本身中的资源。 (感谢 AWS CloudFormation - Beginner to Advanced (Hands-On Guide) Udemy 类(class)启发了这种方法。)因此,我会在 CloudFormation 中声明如下日志组:

BarLogGroup:
Type: AWS::Logs::LogGroup
DeletionPolicy: Retain
Properties:
LogGroupName: '/ecs/bar'

然后为了避免重复,在日志配置中引用日志组:

LogConfiguration:
LogDriver: awslogs
Options:
awslogs-group: !Ref BarLogGroup
awslogs-region: !Ref AWS::Region
awslogs-stream-prefix: 'ecs'

这完全解决了运行时权限和动态创建的问题。日志组也是一种资源,由于任务依赖于它,我们不妨与其他资源一起以声明方式描述它。这种方式日志组的创建取决于创建堆栈的角色的权限,而不是任务本身,这似乎更合适。

(我添加了删除策略,假设您希望保留日志,即使您删除/重新创建堆栈也是如此。)

进行上述更改后,我的 CloudFormation EC Fargate 堆栈现在可以像手动创建的堆栈一样运行并生成日志,因此这种方法是成功的。

关于amazon-web-services - 如何在 CloudFormation YAML 中为 AWS ECS Fargate 容器指定 `logs:CreateLogGroup` 权限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75455047/

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