我正在运行一个ECS Fargate任务,该任务已附加一个角色。该角色具有S3FullAccess策略(以及与ECS服务建立AssumeRole信任的伙伴关系)。
但是,当尝试将对象放入存储桶时,出现“拒绝访问”错误。我尝试过启动EC2实例并附加相同的角色,并且可以毫无问题地放入存储桶中。
在我看来,似乎角色没有附加到任务上。我缺少重要的一步吗?我无法通过SSH进入实例,因为它是Fargate。
更新: 我提取了在我的本地计算机上设置并使用的AWS_ACCESS_KEY_ID和AWS_SECRET_ACCESS_KEY环境变量。我也遇到了“访问被拒绝”问题,对我来说,这意味着我没有为该角色设置任何策略。
任何可以提供帮助的人都会受到赞赏!
解决方法: 一个简单的解决方法是创建具有编程访问权限的IAM用户,并在任务定义中设置AWS_ACCESS_KEY_ID和AWS_SECRET_ACCESS_KEY环境变量。
这可行,但不能解释根本问题。
答案 0 :(得分:1)
我刚刚遇到了类似的问题,我认为这可能是由于您的程序无法访问实例元数据服务公开的角色凭据。
具体来说,有一个名为AWS_CONTAINER_CREDENTIALS_RELATIVE_URI
的环境变量,其值是AWS开发工具包使用任务角色所需的值。 ECS容器代理会在您的任务启动时进行设置,并且会暴露给具有进程ID 1的容器主进程。如果您的程序未按原样运行,则可能看不到env var,因此解释了拒绝访问的原因错误。
根据程序的运行方式,有不同的共享环境变量的方法。
我在ssh登录外壳中遇到问题(顺便说一句,您可以通过运行sshd来将ssh登录到Fargate任务中),因此我在Docker入口点脚本中插入了以下位置:
# To share the env var with login shells
echo "export AWS_CONTAINER_CREDENTIALS_RELATIVE_URI=$AWS_CONTAINER_CREDENTIALS_RELATIVE_URI" >> /root/.profile
在其他情况下,将其添加到Docker入口点脚本中可能会起作用:
# To export the env var for use by child processes
export AWS_CONTAINER_CREDENTIALS_RELATIVE_URI
参考:
答案 1 :(得分:0)
Amazon ECS容器凭据 –如果设置了环境变量AWS_CONTAINER_CREDENTIALS_RELATIVE_URI,则从Amazon ECS加载。
您可以在{strong> IAM role 中定义要使用的task definitions,或者在通过RunTask手动运行任务时可以使用 taskRoleArn 覆盖API操作。 Amazon ECS代理会收到一条有效负载消息,用于通过包含角色凭证的其他字段来启动任务。 Amazon ECS代理将唯一的任务凭证ID设置为标识令牌,并更新其内部凭证缓存,以便任务的标识令牌指向有效负载中接收的角色凭证。对于属于该任务的所有容器,Amazon ECS代理使用以下相对URI:/ credential_provider_version / credentials?id = task_credential_id为该任务的所有容器填充Env对象(可通过docker inspect container_id命令使用)的Env对象中的AWS_CONTAINER_CREDENTIALS_RELATIVE_URI环境变量。
Terraform代码:
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
}