Terraform 定义的任务角色对于 ECS 计划任务无法正常工作
Posted
技术标签:
【中文标题】Terraform 定义的任务角色对于 ECS 计划任务无法正常工作【英文标题】:Task role defined by Terraform not working correctly for ECS scheduled task 【发布时间】:2021-05-16 21:00:04 【问题描述】:我们的团队有一堆 cron 作业作为 ECS 计划任务运行。最近我添加了一个需要使用 dynamodb 的新作业,所以我在我们的 terraform 文件中添加了权限,但不断出现权限失败:
com.amazonaws.services.dynamodbv2.model.AmazonDynamoDBException:
User: arn:aws:sts::87********23:assumed-role/tcoe-tableau/74a408106bf543ee95dbe4841d00b0f7 is not authorized to perform: dynamodb:GetItem on resource: arn:aws:dynamodb:us-east-1:87********23:table/tcoe-candyjar-metrics (Service: AmazonDynamoDBv2;
Status Code: 400; Error Code: AccessDeniedException; Request ID: H52U8GCS1JAB74OJ6VSSEFLCQNVV4KQNSO5AEMVJF66Q9ASUAAJG; Proxy: null)
我的相关terraform如下:
首先,这里是 ecs 集群和任务定义:
resource "aws_ecs_cluster" "ecs-cluster"
name = "$var.stack_id"
tags
StackId = "$var.stack_id"
lifecycle
ignore_changes = [
"tags"
]
resource "aws_ecs_task_definition" "task-definition"
family = "$var.stack_id"
network_mode = "awsvpc"
requires_compatibilities = [
"FARGATE"
]
cpu = "$var.cpu"
memory = "$var.task_memory"
task_role_arn = "$aws_iam_role.task_role.arn"
execution_role_arn = "$aws_iam_role.ecs_task_execution_role.arn"
container_definitions = <<EOF
[
"logConfiguration":
"logDriver": "awslogs",
"options":
"awslogs-group": "$var.log_group",
"awslogs-region": "us-east-1",
"awslogs-stream-prefix": "$var.stack_id"
,
"ulimits": [
"name": "nofile",
"softLimit": 4096,
"hardLimit": 8192
],
"image": "$var.ecr_account.dkr.ecr.us-east-1.amazonaws.com/$var.ecr_namespace/$var.stack_id:latest",
"environment": [
"name": "ENV", "value": "$var.environment"
],
"essential": true,
"privileged": false,
"name": "$var.stack_id",
"memory": $var.memory
]
EOF
tags
StackId = "$var.stack_id"
那么这里是任务定义的任务角色:
resource "aws_iam_role" "task_role"
name = "$var.stack_id"
assume_role_policy = <<EOF
"Version": "2012-10-17",
"Statement": [
"Sid": "",
"Effect": "Allow",
"Principal":
$data.aws_caller_identity.current.account_id == var.dev_account ? "\"AWS\": [\"arn:aws:iam::61********19:role/$var.dev_role_name\"]," : ""
"Service": ["ecs-tasks.amazonaws.com"]
,
"Action": "sts:AssumeRole"
]
EOF
resource "aws_iam_instance_profile" "task_role_profile"
name = "$var.stack_id"
role = "$aws_iam_role.task_role.name"
最后在这里我将与 dynamodb 相关的策略添加到任务角色中:
resource "aws_iam_role_policy" "main"
name = "$var.stack_id-extra-policy"
role = "$aws_iam_role.task_role.id"
policy = <<EOF
"Version": "2012-10-17",
"Statement": [
"Effect": "Allow",
"Action": [
"dynamodb:Scan",
"dynamodb:Query",
"dynamodb:List*",
"dynamodb:Get*",
"dynamodb:Describe*",
"dynamodb:DeleteItem",
"dynamodb:Put*",
"dynamodb:UpdateItem",
"dynamodb:BatchWriteItem"
],
"Resource": [
"arn:aws:dynamodb:us-east-1:87********23:table/tcoe-candyjar-metrics",
"arn:aws:dynamodb:us-east-1:87********23:table/tcoe-candyjar-metrics/index/*"
]
]
EOF
我在这里做错了什么还是遗漏了什么?
【问题讨论】:
tcoe-tableau
是什么角色?是您的 ecs 任务角色吗?
是的,我认为这是任务角色。既然您指出了这一点,我突然想到,也许我应该使用 role = "$aws_iam_role.task_role.name" 而不是 role = "$aws_iam_role.task_role.name",现在让我测试一下。我使用 task_role.id 是因为我看到了一些使用 id 的示例,我想知道什么时候使用 id vs name?
registry.terraform.io/providers/hashicorp/aws/latest/docs/… 中的示例确实说它应该是 role = aws_iam_role.test_role.id,而不是 role = aws_iam_role.test_role.name。我上面的猜测可能是错误的
aws_iam_role.task_role.id
很好。该错误表明tcoe-tableau
没有权限。您必须确认这是您的实际任务角色。
应该是,这里:resource "aws_iam_role" "task_role" name = "$var.stack_id" assume_role_policy =
【参考方案1】:
我以为我的失败是由于使用了role.id而不是role.name,我想弄清楚id和name之间的区别,所以我发布了这个问题aws iam role id vs role name in terraform, when to use which?,然后答案/评论表明完全相同,这促使我回去仔细检查我的提交历史和构建历史,我意识到 role.id 不起作用的原因是由于我犯了一些人为错误。我的新代码有效不是因为我使用了 role.name,而是因为我在不知不觉中同时修复了另一个错误。
总而言之,role.id 和 role.name 是完全一样的。
【讨论】:
等等,那有什么解决办法呢?我有这个问题。一切正常,我添加了一个新的环境变量需要很长时间才能反映出来。但是现在我得到“无权执行:dynamodb:GetItem”,尽管我的任务角色显然有这个动作。我什至没有改变那方面的任何东西。 另一个烦人的事情是,Cloudwatch 似乎需要很长时间才能向我显示任何日志。你也是这样吗? @Sigex 已经有一段时间了,我不记得我到底做错了什么,如果你还没有弄清楚你的问题,我明天可以看看。至于cloudwatch,遗憾的是,我们是一样的,确实需要一些时间,我认为就是这样:(以上是关于Terraform 定义的任务角色对于 ECS 计划任务无法正常工作的主要内容,如果未能解决你的问题,请参考以下文章
EFS 卷绑定在 ECS 任务定义的每个“terraform apply”上自动分离/重新附加
如何通过 terraform 在 ecs 任务定义中指定环境变量?