Amazon web services ECS Fargate任务未应用角色

Amazon web services ECS Fargate任务未应用角色,amazon-web-services,amazon-ecs,aws-fargate,Amazon Web Services,Amazon Ecs,Aws Fargate,我有一个ECS Fargate任务正在运行,它附带了一个角色。此角色具有S3FullAccess策略(以及与ECS服务的AssumeRole可信伙伴关系) 然而,当我试图将一个对象放入一个bucket中时,会出现拒绝访问错误。我已经尝试过启动一个EC2实例并附加相同的角色,并且可以毫无问题地放入bucket 在我看来,这个角色似乎没有与任务挂钩。我错过了重要的一步吗?我无法SSH到实例中,因为它是Fargate 更新: 我提取了在本地机器上设置并使用的AWS_ACCESS_KEY_ID和AWS_

我有一个ECS Fargate任务正在运行,它附带了一个角色。此角色具有S3FullAccess策略(以及与ECS服务的AssumeRole可信伙伴关系)

然而,当我试图将一个对象放入一个bucket中时,会出现拒绝访问错误。我已经尝试过启动一个EC2实例并附加相同的角色,并且可以毫无问题地放入bucket

在我看来,这个角色似乎没有与任务挂钩。我错过了重要的一步吗?我无法SSH到实例中,因为它是Fargate

更新: 我提取了在本地机器上设置并使用的AWS_ACCESS_KEY_ID和AWS_SECRET_ACCESS_KEY环境变量。我也遇到了访问被拒绝的问题,这意味着(对我来说)我为该角色设置的任何策略都没有应用到该任务中

任何能帮上忙的人都将不胜感激

解决方法: 一个简单的解决方法是创建具有编程访问权限的IAM用户,并在任务定义中设置AWS_access_KEY_ID和AWS_SECRET_access_KEY环境变量


这是可行的,但不能解释根本问题。

我刚刚遇到了一个类似的问题,我认为这可能是因为您的程序无法访问实例元数据服务公开的角色凭据

具体来说,有一个名为
AWS\u CONTAINER\u CREDENTIALS\u RELATIVE\u URI
的环境变量,其值是AWS SDK使用任务角色所需的值。ECS容器代理在任务启动时进行设置,并将其公开给进程ID为1的容器主进程。如果您的程序不是这样运行的,那么它可能没有看到env变量,因此无法解释拒绝访问错误

根据程序的运行方式,将有不同的方式共享env var

我在ssh登录shell中遇到了问题(顺便说一句,您可以通过运行sshd将ssh连接到Fargate任务),因此在我的Docker入口点脚本中插入了以下内容:

#与登录shell共享环境变量
echo“export AWS\u CONTAINER\u CREDENTIALS\u RELATIVE\u URI=$AWS\u CONTAINER\u CREDENTIALS\u RELATIVE\u URI”>>/root/.profile
在其他情况下,可以将以下内容添加到Docker入口点脚本中:

#导出环境变量以供子进程使用
导出AWS\u容器\u凭据\u相对\u URI
参考文献:

  • -解释与角色相关的环境变量的文件
  • -其中有人更详细地解释了这些解决方法

亚马逊ECS容器凭据–如果设置了环境变量AWS\u container\u credentials\u RELATIVE\u URI,则从亚马逊ECS加载

您可以定义要在中使用的,也可以在使用RunTask API操作手动运行任务时使用taskRoleArn覆盖。Amazon ECS代理接收一条有效负载消息,用于启动包含角色凭据的其他字段的任务。Amazon ECS代理将唯一的任务凭据ID设置为标识令牌,并更新其内部凭据缓存,以便任务的标识令牌指向有效负载中接收的角色凭据。Amazon ECS代理使用以下相对URI为属于此任务的所有容器在Env对象(可通过docker inspect CONTAINER\u id命令使用)中填充AWS\u CONTAINER\u CREDENTIALS\u RELATIVE\u URI环境变量:/credential\u provider\u version/CREDENTIALS?id=task\u credential\u id

地形代码:

resource "aws_iam_role" "AmazonS3ServiceForECSTask" {
  assume_role_policy = <<EOF
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Action": "sts:AssumeRole",
      "Principal": {
        "Service": [
          "ecs-tasks.amazonaws.com"
        ]
      },
      "Effect": "Allow",
      "Sid": ""
    }
  ]
}
EOF
}

data "aws_iam_policy_document" "bucket_policy" {
  statement {
    principals {
      type        = "AWS"
      identifiers = [aws_iam_role.AmazonS3ServiceForECSTask.arn]
    }

    actions = [
      "s3:ListBucket",
      "s3:GetBucketLocation",
    ]

    resources = [
      "arn:aws:s3:::${var.bucket_name}",
    ]
  }
  statement {
    principals {
      type        = "AWS"
      identifiers = [aws_iam_role.AmazonS3ServiceForECSTask.arn]
    }

    actions = [
      "s3:GetObject",
      "s3:PutObject",
      "s3:PutObjectAcl",
      "s3:ListMultipartUploadParts",
      "s3:AbortMultipartUpload",
    ]

    resources = [
      "arn:aws:s3:::${var.bucket_name}/*",
    ]
  }
}

resource "aws_ecs_task_definition" "sephora_ba_ecs_task_definition" {
  task_role_arn               = aws_iam_role.AmazonS3ServiceForECSTask.arn
  execution_role_arn          = aws_iam_role.ECS-TaskExecution.arn
  family                      = "${var.family}"
  network_mode                = var.network_mode[var.launch_type]
  requires_compatibilities    = var.requires_compatibilities
  cpu                         = var.task_cpu[terraform.workspace]
  memory                      = var.task_memory[terraform.workspace]
  container_definitions       = module.ecs-container-definition.json
}
资源“aws\u iam\u角色”“AmazonS3ServiceForecStatask”{

假设\u role\u policy=您在任务定义中定义了哪个角色?executionRoleArn-通过执行必要的操作(如从ECR提取图像、将日志写入Cloudwatch)来访问任务以启动容器。taskRoleArn-允许容器调用AWS资源(s3、dynamodb等)@Haran我已将其定义为taskRoleArn。我已为executionRoleArn设置了一个角色,该角色具有正确的拉取和启动任务的权限。我面临的问题与我提取AWS_ACCESS_KEY_ID和AWS_SECRET_ACCESS_KEY环境变量并在本地尝试它们时仍然被拒绝访问的问题完全相同。您是否曾经d这个问题的解决方案?(除了你的解决方案?)同样的问题,但在另一页中还没有人回答我的问题,很高兴看到我不是唯一一个面临这个问题的人。。。。