Terraform Fargate 任务定义请求执行角色
Posted
技术标签:
【中文标题】Terraform Fargate 任务定义请求执行角色【英文标题】:Terraform Fargate task definition requesting execution role 【发布时间】:2019-01-07 19:14:03 【问题描述】:我正在使用 Terraform 在 AWS 中创建一些服务。其中一项服务是 ECS 任务定义。我按照文档进行操作,但不断收到以下错误:
aws_ecs_task_definition.github-backup: ClientException: Fargate requires task definition to have execution role ARN to support ECR images.
status code: 400, request id: 84df70ec-94b4-11e8-b116-97f92c6f483f
首先task_role_arn
是可选的,我可以看到创建了一个新角色。我还尝试自己创建一个具有任务定义所需权限的角色。
这是我所拥有的:
任务定义:
resource "aws_ecs_task_definition" "github-backup"
family = "$var.task_name"
requires_compatibilities = ["FARGATE"]
network_mode = "awsvpc"
cpu = "$var.fargate_cpu"
memory = "$var.fargate_memory"
task_role_arn = "$aws_iam_role.github-role.arn"
container_definitions = <<DEFINITION
[
"cpu": $var.fargate_cpu,
"image": "$var.image",
"memory": $var.fargate_memory,
"name": "github-backup",
"networkMode": "awsvpc"
]
DEFINITION
IAM 政策:
resource "aws_iam_policy" "access_policy"
name = "github_policy"
policy = <<EOF
"Version": "2012-10-17",
"Statement": [
"Sid": "Stmt1532966429082",
"Action": [
"s3:PutObject",
"s3:PutObjectTagging",
"s3:PutObjectVersionTagging"
],
"Effect": "Allow",
"Resource": "arn:aws:s3:::zego-github-backup11"
,
"Sid": "Stmt1532967608746",
"Action": "lambda:*",
"Effect": "Allow",
"Resource": "*"
,
"Effect": "Allow",
"Action": [
"ecr:GetAuthorizationToken",
"ecr:BatchCheckLayerAvailability",
"ecr:GetDownloadUrlForLayer",
"ecr:BatchGetImage",
"logs:CreateLogStream",
"logs:PutLogEvents"
],
"Resource": "*"
]
EOF
IAM 角色:
resource "aws_iam_role" "github-role"
name = "github-backup"
assume_role_policy = <<EOF
"Version": "2012-10-17",
"Statement": [
"Action": "sts:AssumeRole",
"Principal":
"Service": [
"s3.amazonaws.com",
"lambda.amazonaws.com",
"ecs.amazonaws.com"
]
,
"Effect": "Allow",
"Sid": ""
]
EOF
IAM 政策附件:
resource "aws_iam_role_policy_attachment" "test-attach"
role = "$aws_iam_role.github-role.name"
policy_arn = "$aws_iam_policy.access_policy.arn"
Terraform 计划没有显示任何错误。只有在运行 Terraform apply 时,我才会收到此错误。我正在提供一个具有任务定义所需权限的角色,但我仍然得到这个。这有什么问题?
【问题讨论】:
【参考方案1】:正如AWS ECS User Guide Fargate 任务中所述,需要将执行角色指定为任务定义的一部分。
EC2 启动类型的任务不需要这样做,因为 EC2 实例本身应该有一个 IAM 角色,允许它们拉取容器映像并可选择将日志推送到 Cloudwatch。
因为这对于 EC2 启动类型是可选的,所以 Terraform 需要将其设为可选,否则会破坏这些。严格来说,Terraform 没有办法在计划时进行跨字段验证,因此它无法在计划中告诉您,因为您有一个 Fargate 启动类型的任务,所以您需要指定 execution_role_arn
。使用提供程序源中的CustomizeDiff
可以解决此问题,但它非常糟糕,目前仅在几个地方使用。
请注意,执行角色是启动任务所需的角色,而不是任务所具有的允许任务执行操作的角色。
因此,您应该从 IAM 策略中删除与 ECS 相关的权限,因为该任务根本不应该与 S3 交互。相反,只需添加一个具有适当权限的角色作为执行角色。
要使用 AWS 托管 ECS 任务执行角色,您需要执行以下操作:
data "aws_iam_role" "ecs_task_execution_role"
name = "ecsTaskExecutionRole"
resource "aws_ecs_task_definition" "github-backup"
family = "$var.task_name"
requires_compatibilities = ["FARGATE"]
network_mode = "awsvpc"
cpu = "$var.fargate_cpu"
memory = "$var.fargate_memory"
task_role_arn = "$aws_iam_role.github-role.arn"
execution_role_arn = "$data.aws_iam_role.ecs_task_execution_role.arn"
container_definitions = <<DEFINITION
[
"cpu": $var.fargate_cpu,
"image": "$var.image",
"memory": $var.fargate_memory,
"name": "github-backup",
"networkMode": "awsvpc"
]
DEFINITION
【讨论】:
如果您查看我的帖子,您会发现我在任务定义中指定了execution_role_arn
。另外,感谢格式化。
您在问题中的任务定义不包括execution_role_arn
。你错过了添加它吗?我已经编辑了我的答案以准确显示它应该如何使用并解释execution_role_arn
和task_role_arn
之间的区别。
好吧,我现在有点尴尬。这个问题是因为我一直误读 execution_role_arn 和 task_role_arn 并认为它们是一样的。我将 task_role 更改为 execution_role_arn,它现在工作正常。感谢您帮助我注意到这一点。
这是两个不同的东西。 execution_role_arn
是 Fargate 启动任务所必需的,task_role_arn
是 ECS 任务应该被赋予的角色,以便应用程序可以与 AWS 服务(例如 S3)进行交互。以上是关于Terraform Fargate 任务定义请求执行角色的主要内容,如果未能解决你的问题,请参考以下文章