用于根据实例标签或实例 ID 限制少数实例连接到 S3 存储桶的角色的 AWS S3 IAM 策略

Sre*_*ath 2 amazon-s3 amazon-web-services

我有一个 AWS S3 已经与所有实例相关联,以获得对所有 S3 存储桶的读取权限。现在我需要为写入权限(Put 对象)的角色添加一个策略,以便其中一些实例可以对 S3 中的某些文件夹具有写入权限。有没有办法通过实例标签(对我来说更好的选择)或实例 ID 来实现它。

我尝试添加 IAM 策略,但是当我设置条件时,我的实例没有获得所需的权限。

我使用的 IAM 策略是:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "Stmt1456567757624",
      "Effect": "Allow",
      "Action": [
        "s3:PutObject"
      ],
      "Resource": "arn:aws:s3:::testbucket/testfolder1/*",
      "Condition": {
        "ArnEquals": {
          "aws:SourceArn": "arn:aws:ec2:eu-west-1:<accountno>:instance/<instanceid1>"
        }
      }
    },
    {
      "Sid": "Stmt1456567757625",
      "Effect": "Allow",
      "Action": [
        "s3:PutObject"
      ],
      "Resource": "arn:aws:s3:::testbucket/testfolder2/*",
      "Condition": {
        "ArnEquals": {
          "aws:SourceArn": "arn:aws:ec2:eu-west-1:<accountno>:instance/<instanceid2>"
        }
      }
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

Joh*_*ein 5

这是一种替代方法,基于根据角色名称授予对 S3 资源的访问权限中给出的提示...

而不是使用aws:SourceArn,使用aws:userid

您可以用于策略变量文档的请求信息有一个表格,aws:userid其中显示了各种值,包括:

对于分配给 Amazon EC2 实例的 Role,它设置为role-id:ec2-instance-id

因此,您可以使用用于启动 Amazon EC2 实例的角色的Role ID来允许访问或Instance ID

例如,这个是基于Role ID 的

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "SID123",
            "Effect": "Allow",
            "Action": [
                "s3:*"
            ],
            "Resource": [
                "*"
            ],
            "Condition": {
                "StringLike": {
                    "aws:userid": [
                        "AROAIIPEUJOUGITIU5BB6*"
                    ]
                }
            }
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

当然,如果您要根据角色 ID 分配权限,那么您也可以轻松地在角色本身内授予权限。

这是基于Instance ID 的

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "SID123",
            "Effect": "Allow",
            "Action": [
                "s3:*"
            ],
            "Resource": [
                "*"
            ],
            "Condition": {
                "StringLike": {
                    "aws:userid": [
                        "*:i-03c9a5f3fae4b630a"
                    ]
                }
            }
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

实例 ID 将保留在实例中,但如果启动了新实例,即使是来自同一个 Amazon 系统映像 (AMI),也会分配一个新实例。