如何在CloudFormation YAML中为AWS ECS Fargate容器指定`logs:CreateLogGroup`权限。
如何在CloudFormation YAML中为AWS ECS Fargate容器指定`logs:CreateLogGroup`权限。
我正在尝试使用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
一个文档页面提到了这个logs:CreateLogGroup
权限,并说:
要使用
awslogs-create-group
选项,请将logs:CreateLogGroup
添加为内联IAM策略。
但我不明白的是,我的CloudFormation模板与通过UI手动创建的堆栈有何不同。通过查看手动创建的堆栈的生成模板,似乎两个任务定义都指示了ecsTaskExecutionRole
。我的CloudFormation模板任务定义如下:
ExecutionRoleArn:'arn:aws:iam::...:role/ecsTaskExecutionRole'
手动创建的堆栈是如何能够创建日志组的,而我从头开始的独立CloudFormation模板却不能呢?我应该在哪里指定logs:CreateLogGroup
权限?手动创建的堆栈似乎没有指定任何内联策略。(诚然,由于某种原因,手动创建的任务定义似乎没有使用CloudFormation堆栈,所以可能在UI中有一些隐藏的设置我没有看到。)
问题的原因:在AWS ECS Fargate容器中,如果想要任务自动创建日志组,需要在IAM策略中包含logs:CreateLogGroup权限。然而,某些页面提到需要在CloudFormation中以内联的方式添加logs:CreateLogGroup权限,但是没有提供具体的示例。
解决方法:相较于动态创建日志组,更好的做法是在CloudFormation模板中声明和配置AWS::Logs::LogGroup资源。因此,可以在CloudFormation中声明日志组,并在日志配置中引用该日志组,避免了运行时权限和动态创建的问题。通过这种方式,日志组的创建依赖于创建堆栈的角色的权限,而不是任务本身,这似乎更加合适。在进行上述更改后,CloudFormation EC Fargate堆栈能够正常运行并生成日志,因此该方法是成功的。