如何排查您的文件网关的 CloudWatch 运行状况日志中的 S3AccessDenied 错误?

上次更新时间:2020 年 9 月 25 日

我尝试访问 AWS Storage Gateway 上的网络文件系统 (NFS) 或服务器消息块 (SMB) 文件共享。但我的文件网关的 Amazon CloudWatch 运行状况日志显示一个 S3AccessDenied 错误。我应该如何排查此问题?

解决方法

要解决 S3AccessDenied 错误,您必须查看与您的文件共享关联的权限策略。然后,您必须添加缺少的任何所需权限。根据您收到“访问被拒绝”错误的时间确定必须审查的权限:

创建文件共享,文件共享卡在“正在创建”或“不可用”状态 将文件写入文件共享 从文件共享读取文件

创建文件共享,文件共享卡在“正在创建”或“不可用”状态

如果您在创建文件共享时收到“拒绝被访问”错误,并且文件共享卡在“正在创建”或“不可用”状态,则 CloudWatch 日志类似于以下内容:

{
"severity": "ERROR",
"bucket": "AWSDOC-EXAMPLE-BUCKET",
"prefix": "",
"roleArn": "arn:aws:iam::123456789:role/service-role/StorageGatewayBucketAccessRolec6914add-b232-40dc-abef-4a9eeaaed8",
"source": "share-ABCD1234",
"type": "S3AccessDenied",
"operation": "s3:ListObjects",
"gateway": "sgw-ABCD1234",
"timestamp": "1597486809991"
}

查看以下权限设置:

1.检查与您的文件共享关联的 AWS Identity and Access Management (IAM) 角色,以确认该角色对关联的 Amazon Simple Storage Service (Amazon S3) 存储桶具有以下权限:

s3:GetBucketLocation s3:ListBucket

2.查看关联存储桶的存储桶策略,以确认没有显式 deny 语句 ("Effect": "Deny") 阻止以下权限所需的访问权:

s3:GetBucketLocation s3:ListBucket

3.如果文件网关所处的 Amazon Virtual Private Cloud (Amazon VPC) 将 VPC 终端节点用于 Amazon S3,则查看 VPC 终端节点策略。确认策略允许您的文件网关访问 S3 存储桶和对象。

将文件写入文件共享

如果您在将文件写入文件共享时收到“访问被拒绝”错误,则 CloudWatch 日志类似于以下内容:

{
"severity": "ERROR",
"bucket": "AWSDOC-EXAMPLE-BUCKET",
"prefix": "/test1",
"roleArn": "arn:aws:iam::123456789:role/service-role/StorageGatewayBucketAccessRole0617b6ee-4809-48bc-b646-8dda9e9c32",
"source": "share-ABCD1234",
"type": "S3AccessDenied",
"operation": "S3Upload",
"gateway": "sgw-ABCD1234",
"timestamp": "1597493322178"
}

查看以下权限设置:

1.检查与您的文件共享关联的 IAM 角色,以确认该角色对关联的 Amazon S3 存储桶具有以下权限:

s3:PutObject s3:PutObjectAcl

2.查看关联存储桶的存储桶策略,以确认没有显式 deny 语句 ("Effect": "Deny") 阻止您的以下权限所需的访问权:

s3:PutObject s3:PutObjectAcl

3.如果文件网关所处的 Amazon VPC 将 VPC 终端节点用于 Amazon S3,则查看 VPC 终端节点策略。确认策略允许您的文件网关访问 S3 存储桶和对象。

4.如果关联的 S3 存储桶已使用 AWS Key Management Service (AWS KMS) 加密,请查看加密密钥的策略。密钥策略必须向与您的文件共享关联的 IAM 角色授予以下权限:

kms:Decrypt kms:Encrypt kms:ReEncrypt kms:GenerateDataKey kms:DescribeKey*

如果您的文件共享的 IAM 角色和 AWS KMS 密钥属于不同的 AWS 账户,则必须同时在密钥策略和 IAM 角色的策略中设置这些权限。

从文件共享读取文件

如果从文件共享读取文件时收到“访问被拒绝”错误,则 CloudWatch 日志类似于以下内容:

{
"severity": "ERROR",
"bucket": "AWSDOC-EXAMPLE-BUCKET",
"prefix": "/test1",
"roleArn": "arn:aws:iam::123456789:role/service-role/StorageGatewayBucketAccessRole0617b6ee-4809-48bc-b646-8dda9e9c32",
"source": "share-ABCD1234",
"type": "S3AccessDenied",
"operation": "s3:HeadObject",
"gateway": "sgw-ABCD12347",
"timestamp": "1597488260202"
}

查看以下权限设置:

1.检查与您的文件共享关联的 IAM 角色,以确认该角色对关联的 Amazon S3 存储桶具有以下权限:

s3:GetObject s3:GetObjectAcl

2.查看关联存储桶的存储桶策略,以确认没有显式 deny 语句 ("Effect": "Deny") 阻止您的以下权限所需的访问权:

s3:GetObject s3:GetObjectAcl

3.如果文件网关所处的 Amazon VPC 将 VPC 终端节点用于 Amazon S3,则查看 VPC 终端节点策略。确认策略允许您的文件网关访问 S3 存储桶和对象。

4.如果关联的 S3 存储桶已使用 AWS KMS 加密,请查看加密密钥的策略。密钥策略必须向与您的文件共享关联的 IAM 角色授予以下权限:

kms:Decrypt kms:Encrypt kms:ReEncrypt kms:GenerateDataKey kms:DescribeKey*

如果您的文件共享的 IAM 角色和 AWS KMS 密钥属于不同的 AWS 账户,则必须同时在密钥策略和 IAM 角色的策略中设置这些权限。

注意:以下示例 IAM 策略向您的文件共享授予列出存储桶以及从存储桶上传、下载和删除对象所需的权限 (AWSDOC-EXAMPLE-BUCKET):

{
"Version": "2012-10-17",
"Statement": ,
"Resource": "arn:aws:s3:::AWSDOC-EXAMPLE-BUCKET",
"Effect": "Allow"
},
{
"Action": ,
"Resource": "arn:aws:s3:::AWSDOC-EXAMPLE-BUCKET/*",
"Effect": "Allow"
}
]
}