为什么无法生成 Amazon S3 清单报告?

3 分钟阅读
0

我配置了 Amazon Simple Storage Service (Amazon S3) 清单报告,但该报告未送达,并且我收到了“Access Denied”(拒绝访问)错误。

简短描述

您会收到以下错误消息:

“拒绝访问 2021-02-19 的清单导出失败,因为 S3 无权访问目标存储桶或 KMS 密钥。请让目标存储桶或 KMS 密钥的所有者授予必要的访问权限,然后重试。”

要生成 Amazon S3 清单报告并防止出现上述错误消息,您必须满足以下要求:

  • 允许源存储桶将 Amazon S3 清单报告上传到目标存储桶。
  • 将目标存储桶和源存储桶保存在设置了 Amazon S3 清单的同一 AWS 区域中。
  • 向 Amazon S3 授予对用于加密清单报告文件的 AWS Key Management Service (AWS KMS) 密钥的访问权限。

**注意:**Amazon S3 最多可能需要 48 小时才能送达第一份清单报告。

解决方法

允许源存储桶将 Amazon S3 清单报告上传到目标存储桶

确认您的存储桶策略允许源存储桶上传到目标存储桶。

包含 PutObject 操作的存储桶策略示例:

{
    "Version": "2012-10-17",
    "Id": "S3PolicyId",
    "Statement": [
        {
            "Sid": "InventoryAndAnalyticsExamplePolicy",
            "Effect": "Allow",
            "Principal": {
                "Service": "s3.amazonaws.com"
            },
            "Action": "s3:PutObject",
            "Resource": [
                "arn:aws:s3:::destinationbucket/*"
            ],
            "Condition": {
                "ArnLike": {
                    "aws:SourceArn": "arn:aws:s3:::sourcebucket"
                },
                "StringEquals": {
                    "aws:SourceAccount": "123456789012",
                    "s3:x-amz-acl": "bucket-owner-full-control"
                }
            }
        }
    ]
}

从可能影响 PutObject 操作的每条拒绝语句中排除 s3.amazonaws.com。显式拒绝语句优先于允许语句。

以下示例存储桶策略拒绝访问 s3.amazonaws.com,且仅允许访问指定的 IP 地址范围:

{
    "Version": "2012-10-17",
    "Id": "S3PolicyId",
    "Statement": [
        {
            "Sid": "IPAllow",
            "Effect": "Deny",
            "Principal": "*",
            "Action": "s3:*",
            "Resource": [
                "arn:aws:s3:::destinationbucket",
                "arn:aws:s3:::destinationbucket/*"
            ],
            "Condition": {
                "NotIpAddress": {
                    "aws:SourceIp": "54.240.143.0/24"
                }
            }
        }
    ]
}

以下是上述存储桶策略的更新版本,该版本允许访问 s3.amazonaws.com

{
    "Version": "2012-10-17",
    "Id": "S3PolicyId",
    "Statement": [
        {
            "Sid": "IPAllow",
            "Action": "s3:*",
            "Effect": "Deny",
            "Resource": [
                "arn:aws:s3:::destinationbucket",
                "arn:aws:s3:::destinationbucket/*"
            ],
            "Condition": {
                "NotIpAddress": {
                    "aws:SourceIp": "54.240.143.0/24"
                },
                "ArnNotLike": {
                    "aws:SourceArn": "arn:aws:s3:::sourcebucket"
                }
            },
            "Principal": "*"
        },
        {
            "Sid": "InventoryAndAnalyticsExamplePolicy",
            "Action": [
                "s3:PutObject"
            ],
            "Effect": "Allow",
            "Resource": [
                "arn:aws:s3:::destinationbucket/*"
            ],
            "Condition": {
                "ArnLike": {
                    "aws:SourceArn": "arn:aws:s3:::sourcebucket"
                },
                "StringEquals": {
                    "aws:SourceAccount": "123456789012",
                    "s3:x-amz-acl": "bucket-owner-full-control"
                }
            },
            "Principal": {
                "AWS": [
                    "s3.amazonaws.com"
                ]
            }
        }
    ]
}

确认目标存储桶与源存储桶位于同一区域

打开 Amazon S3 控制台。导航到您的存储桶列表,然后检查“区域”列以确定目标存储桶和源存储桶是否在同一区域。

如果源存储桶和目标存储桶位于不同的区域,请创建或选择新存储桶。

**注意:**属于存储桶的对象将保留在您创建存储桶的区域中,除非您转移对象。有关详细信息,请参阅存储桶概述

授予对用于加密清单报告文件的 AWS KMS 密钥的访问权限

如果您使用 AWS KMS 密钥加密 Amazon S3 存储桶,请向 Amazon S3 授予对 AWS KMS 密钥的访问权限。

完成以下步骤:

  1. 打开 AWS KMS 控制台
    **注意:**请使用拥有 AWS KMS 密钥的 AWS 账户登录。

  2. 在导航窗格中,选择 Customer managed keys(客户自主管理型密钥)。

  3. Customer managed keys(客户自主管理型密钥)下,选择要用于加密清单报告文件的 AWS KMS 密钥。

  4. Key policy(密钥策略)下,选择 Switch to policy view(切换到策略视图)。

  5. 选择 Edit(编辑)。

  6. Edit key policy(编辑密钥策略)下,将以下密钥策略添加到现有密钥策略:

    {
        "Sid": "Allow Amazon S3 use of the KMS key",
        "Effect": "Allow",
        "Principal": {
            "Service": "s3.amazonaws.com"
        },
        "Action": [
            "kms:GenerateDataKey"
        ],
        "Resource": "*",
        "Condition": {
            "StringEquals": {
                "aws:SourceAccount": "source-account-id"
            },
            "ArnLike": {
                "aws:SourceARN": "arn:aws:s3:::source-bucket-name"
            }
        }
    }
  7. 选择 Save changes(保存更改)。

**注意:**在 Amazon S3 控制台中,请检查 Inventory configurations(清单配置)下方的 Last export(上次导出)列。Last export(上次导出)列为空可能表示 Amazon S3 未送达清单报告。如果 Amazon S3 送达了清单报告,则您可以在目标存储桶的指定路径中找到该清单报告。

查看服务器访问日志和 CloudTrail 历史记录

检查您的服务器访问日志,以确定是否对您的存储桶策略进行了更改以停止传送。有关日志格式的示例,请参阅 Amazon S3 服务器访问日志格式

以下是显示已对存储桶策略进行了更改的日志条目示例:

REST.PUT.BUCKETPOLICY

您还可以在 AWS CloudTrail 事件历史记录中搜索 PutBucketPolicy API 操作。如果 PutBucketPolicy 操作是在 90 天前执行的,则您必须在 Amazon S3 中查询 CloudTrail 日志。有关信息,请参阅 AWS Docs GitHub 网站上的 Amazon S3 information in CloudTrail

检查清单范围的前缀筛选条件

如果您配置了前缀筛选条件,但清单报告在 48 小时后仍未送达,请检查您的前缀配置。确保该前缀筛选条件与已在清单中列出的存储桶中的现有前缀相匹配。删除空格、拼写错误和前导正斜杠。

相关信息

为 S3 存储桶和对象启用 CloudTrail 事件日志记录

管理 S3 清单、S3 分析和 S3 清单报告的权限

AWS 官方
AWS 官方已更新 5 个月前