S3 存储桶策略 IAM 角色显示为 API 键

S3 bucket policy IAM role showing up as API key

我有一个 S3 存储桶,我正尝试通过 CloudFormation 在其上应用存储桶策略。我想允许两个 IAM 角色访问存储桶,这是通过在 CloudFormation 模板的存储桶策略中指定角色的 ARN 来实现的。 以下是 CloudFormation 模板:

LandingBucketPolicy:
    Type: AWS::S3::BucketPolicy
    Properties:
      Bucket: !Ref LandingBucket
      PolicyDocument:
        Version: "2012-10-17"
        Statement:
          # yamllint disable-line rule:line-length
          - Sid: "Allow s3 permission"
            Action:
              - s3:PutObject
              - s3:GetObject
              - s3:ListBucket
            Effect: "Allow"
            Resource:
              - !GetAtt LandingBucket.Arn
              - !Sub "${LandingBucket.Arn}/*"
            Principal:
              AWS:
                - !Ref IamRoleArn1
                - !Ref IamRoleArn2

参数为:IamRoleArn1: arn:aws:iam::1234:role/xyz, IamRoleArn2: arn:aws:iam::1234:role/abc

控制台的最终策略如下所示

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "file drop permission",
            "Effect": "Allow",
            "Principal": {
                "AWS": [
                    "arn:aws:iam::1234:role/xyz",
                    "AROxxIECxx"
                ]
            },
            "Action": [
                "s3:PutObject",
                "s3:GetObject",
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::bucket-name",
                "arn:aws:s3:::bucket-name/*"
            ]
        }
    ]
}

第一个 Principal 是一个 IAM 角色,然而,第二个看起来像一个 API 键,尽管在 CloudFormation 模板中我提到了第二个 IAM 角色 ARN,就像第一个 IAM 角色一样。

为什么第二个角色 ARN 没有出现在存储桶策略中?

那是该特定资源的 unique identifier。在这种情况下,它称为 RoleId 并且 ARN 只是其可读格式。两种表示都指向 AWS 中的相同资源。 尝试 运行

 aws iam get-role --role-name "<you role here>"

此命令的输出将包含一个名为 RoleId 的字段,应该可以为您解决问题。

AROA开头的唯一标识符代表它是一个角色相关的资源。