跳至内容

如何解决从 DynamoDB 导出到 Amazon S3 时出现的访问遭拒问题?

2 分钟阅读
0

当我将 Amazon DynamoDB 表数据导出到 Amazon Simple Storage Solution (Amazon S3) 时,收到了“访问遭拒”错误。

简短描述

如果您在导出时遇到 AccessDenied 错误,则您的 AWS Identity and Access Management (IAM) 实体可能没有正确的权限。要从时间点故障恢复 (PITR) 窗口中的某个点导出 DynamoDB 表数据,请使用 DynamoDB export to S3。您可以将此功能用于使用以下任一数据保护方法的 AWS 账户:

  • 高级加密标准 (AES)
  • AWS Key Management Service (AWS KMS) 客户自主管理型密钥

解决方法

**注意:**从 DynamoDB 表所在的账户运行所有 AWS 命令行界面 (AWS CLI) 命令。如果在运行 AWS CLI 命令时收到错误消息,请参阅 AWS CLI 错误故障排除。此外,请确保您使用的是最新版本的 AWS CLI

先决条件:

AES

要将 DynamoDB 表数据导出到同一账户中的 Amazon S3 存储桶,请运行以下命令:

aws dynamodb export-table-to-point-in-time \
  --table-arn <Table ARN> \
  --s3-bucket <S3 bucket name> \
  --export-format <Export format> \
  --s3-sse-algorithm AES256

要将 DynamoDB 表数据导出到其他账户中的 Amazon S3 存储桶,请运行以下命令:

aws dynamodb export-table-to-point-in-time \
  --table-arn <Table ARN> \
  --s3-bucket <Cross account S3 bucket name> \
  --s3-bucket-owner <Cross account ID> \
  --export-format <Export format> \
  --s3-sse-algorithm AES256

AWS KMS 客户自主管理型密钥

对于使用 AWS KMS 客户自主管理型密钥的账户,请更新 AWS KMS 客户自主管理型密钥策略。密钥策略必须允许 IAM 实体访问 AWS KMS 密钥。
策略示例:

{
   "Version": "2012-10-17",
   "Id": "key-consolepolicy-3",
   "Statement": [
      {
         "Sid": "Enable IAM User Permissions",
         "Effect": "Allow",
         "Principal": {
               "AWS": "arn:aws:iam::<Account ID>:root"
         },
         "Action": "kms:*",
         "Resource": "*"
      }
   ]
}

此外,IAM 实体必须有权访问用于执行导出的 AWS KMS 密钥。

AWS KMS 密钥权限示例:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "VisualEditor0",
      "Effect": "Allow",
      "Action": [
        "kms:Decrypt",
        "kms:GenerateDataKey"
      ],
      "Resource": "<Provide KMS key ARN>"
    }
  ]
}

要使用 AWS KMS 客户自主管理型密钥导出到同一账户内的 S3 存储桶,请运行以下命令:

aws dynamodb export-table-to-point-in-time \
  --table-arn <Table ARN> \
  --s3-bucket <S3 bucket name> \
  --export-format <Export format> \
  --s3-sse-algorithm KMS \
  --s3-sse-kms-key-id <KMS key ARN>

要使用 AWS KMS 客户自主管理型密钥导出到其他账户中的 S3 存储桶,请运行以下命令:

aws dynamodb export-table-to-point-in-time \
  --table-arn <Table ARN> \
  --s3-bucket <Cross account S3 bucket name> \
  --s3-bucket-owner <Cross account ID> \
  --export-format <Export format> \
  --s3-sse-algorithm KMS \
  --s3-sse-kms-key-id <KMS key ARN>

要访问不同账户中用户的已导出表数据,请更新 DynamoDB 源账户中的 AWS KMS 密钥策略。要访问导出的对象,AWS KMS 密钥策略必须向用户授予使用 kms:Decrypt 命令的权限。

AWS KMS 密钥策略示例:

{
  "Sid": "Enable cross account IAM User Permissions",
  "Effect": "Allow",
  "Principal": {
    "AWS": "<Provide ARN of destination account user>"
  },
  "Action": "kms:",
  "Resource": "*"
}

其他故障排除

验证所有权限后,如果您仍然收到 AccessDenied 错误消息,请检查您的组织是否有服务控制策略 (SCP)。如果您的组织有 SCP,请分离更新该策略。

相关信息

在 DynamoDB 中请求导出表

如何提供对 Amazon S3 存储桶中对象的跨账户访问权限?

使用 Amazon DynamoDB 进行跨账户复制

为什么跨账户用户在尝试访问我使用 AWS KMS 客户自主管理型密钥加密的 S3 对象时会收到“访问遭拒”错误?

AWS JSON 策略元素: 主体

AWS 官方已更新 1 年前