📣
TiDB Cloud Premium 开放公测中。为企业级工作负载提供无限扩展、即时弹性伸缩和高级安全保障。此页面由 AI 自动翻译,英文原文请见此处。

排查从 Amazon S3 导入数据时的访问被拒绝错误



本文介绍如何排查从 Amazon S3 导入数据到 TiDB Cloud 时可能出现的访问被拒绝错误。

在 TiDB Cloud 控制台的数据导入页面上点击下一步并确认导入过程后,TiDB Cloud 开始验证是否可以访问你指定的存储桶 URI 中的数据。如果你看到包含关键字 AccessDenied 的错误消息,则表示发生了访问被拒绝错误。

要排查访问被拒绝错误,请在 AWS 管理控制台中执行以下检查。

无法承担提供的角色

本节介绍如何排查 TiDB Cloud 无法承担提供的角色来访问指定存储桶的问题。

检查信任实体

TiDB Cloud 账户 ID 和 TiDB Cloud 外部 ID 与环境相关,并且因集群而异,因此请勿直接复制本文档中的字面值。请改为从 TiDB Cloud 控制台获取这些值:

  1. TiDB Cloud 控制台中,转到目标集群,然后在左侧导航栏中点击 Data > Import
  2. 点击 Import data from Cloud Storage
  3. Import Data from Cloud Storage 页面上,选择 Amazon S3 作为云服务提供商。
  4. Credentials 部分,点击 Click here to create new one with AWS CloudFormation 以打开 Add New Role ARN 对话框,然后展开 Having trouble? Create Role ARN manually 以显示此集群的 TiDB Cloud Account IDTiDB Cloud External ID

然后验证 IAM 角色上的信任实体:

  1. 在 AWS 管理控制台中,转到 IAM > 访问管理 > 角色
  2. 在角色列表中,找到并点击你为目标 TiDB 集群创建的角色。此时会显示角色摘要页面。
  3. 在角色摘要页面上,点击信任关系标签页以查看受信任的实体。

信任实体应类似于以下示例,其中 <TiDB-Cloud-Account-ID><TiDB-Cloud-External-ID> 替换为你从控制台获取的值:

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::<TiDB-Cloud-Account-ID>:root" }, "Action": "sts:AssumeRole", "Condition": { "StringEquals": { "sts:ExternalId": "<TiDB-Cloud-External-ID>" } } } ] }

确保 Principal.AWS 字段与控制台中显示的 TiDB Cloud Account ID 一致,并且 sts:ExternalId 条件与控制台中显示的 TiDB Cloud External ID 一致。

检查 IAM 角色是否存在

如果 IAM 角色不存在,请按照配置 Amazon S3 访问中的说明创建角色。

检查外部 ID 是否正确设置

无法承担提供的角色 {role_arn}。检查角色上的信任关系设置。例如,检查信任实体是否已设置为 TiDB Cloud 账户 ID,以及信任条件中是否正确设置了 TiDB Cloud 外部 ID。请参见检查信任实体

访问被拒绝

本节介绍如何排查访问问题。

检查 IAM 用户的策略

当你使用 IAM 用户的 AWS 访问密钥访问 Amazon S3 存储桶时,可能会遇到以下错误:

  • "使用访问密钥 ID '{access_key_id}' 和密钥 '{secret_access_key}' 访问源 '{bucket_uri}' 被拒绝"

这表明 TiDB Cloud 由于权限不足而无法访问 Amazon S3 存储桶。你需要以下权限才能访问 Amazon S3 存储桶:

  • s3:GetObject
  • s3:ListBucket
  • s3:GetBucketLocation

要检查 IAM 用户的策略,请执行以下步骤:

  1. 在 AWS 管理控制台中,转到 IAM > 访问管理 > 用户
  2. 在用户列表中,找到并点击你用于向 TiDB Cloud 导入数据的用户。此时会显示用户摘要页面。
  3. 在用户摘要页面的权限策略区域中,会显示策略列表。对每个策略执行以下步骤:
    1. 点击策略进入策略摘要页面。
    2. 在策略摘要页面上,点击 {}JSON 标签页以检查权限策略。确保策略中的 Resource 字段配置正确。

以下是策略示例:

{ "Version": "2012-10-17", "Statement": [ { "Sid": "VisualEditor0", "Effect": "Allow", "Action": [ "s3:GetObject" ], "Resource": "arn:aws:s3:::tidb-cloud-source-data/mydata/*" }, { "Sid": "VisualEditor1", "Effect": "Allow", "Action": [ "s3:ListBucket", "s3:GetBucketLocation" ], "Resource": "arn:aws:s3:::tidb-cloud-source-data" }, }

有关如何授予用户权限并测试权限的更多信息,请参见使用用户策略控制对存储桶的访问

检查 IAM 角色的策略

  1. 在 AWS 管理控制台中,转到 IAM > 访问管理 > 角色
  2. 在角色列表中,找到并点击你为目标 TiDB Cloud 资源创建的角色。此时会显示角色摘要页面。
  3. 在角色摘要页面的权限策略区域中,会显示策略列表。对每个策略执行以下步骤:
    1. 点击策略进入策略摘要页面。
    2. 在策略摘要页面上,点击 {}JSON 标签页以检查权限策略。确保策略中的 Resource 字段配置正确。

以下是策略示例:

{ "Version": "2012-10-17", "Statement": [ { "Sid": "VisualEditor0", "Effect": "Allow", "Action": [ "s3:GetObject", "s3:GetObjectVersion" ], "Resource": "arn:aws:s3:::tidb-cloud-source-data/mydata/*" }, { "Sid": "VisualEditor1", "Effect": "Allow", "Action": [ "s3:ListBucket", "s3:GetBucketLocation" ], "Resource": "arn:aws:s3:::tidb-cloud-source-data" }, { "Sid": "AllowKMSkey", "Effect": "Allow", "Action": [ "kms:Decrypt" ], "Resource": "arn:aws:kms:ap-northeast-1:105880447796:key/c3046e91-fdfc-4f3a-acff-00597dd3801f" } ] }

在此示例策略中,请注意以下几点:

  • "arn:aws:s3:::tidb-cloud-source-data/mydata/*" 中,"arn:aws:s3:::tidb-cloud-source-data" 是示例 S3 存储桶 ARN,/mydata/* 是你可以在 S3 存储桶根级别自定义的用于数据存储的目录。目录需要以 /* 结尾,例如 "<你的 S3 存储桶 ARN>/<源数据目录>/*"。如果未添加 /*,则会出现 AccessDenied 错误。

  • 如果你已启用带有客户管理密钥加密的 AWS Key Management Service 密钥(SSE-KMS),请确保策略中包含以下配置。"arn:aws:kms:ap-northeast-1:105880447796:key/c3046e91-fdfc-4f3a-acff-00597dd3801f" 是存储桶的示例 KMS 密钥。

    { "Sid": "AllowKMSkey", "Effect": "Allow", "Action": [ "kms:Decrypt" ], "Resource": "arn:aws:kms:ap-northeast-1:105880447796:key/c3046e91-fdfc-4f3a-acff-00597dd3801f" }

    如果你的存储桶中的对象是从另一个加密的存储桶复制的,则 KMS 密钥值需要包含两个存储桶的密钥。例如,"Resource": ["arn:aws:kms:ap-northeast-1:105880447796:key/c3046e91-fdfc-4f3a-acff-00597dd3801f","arn:aws:kms:ap-northeast-1:495580073302:key/0d7926a7-6ecc-4bf7-a9c1-a38f0faec0cd"]

如果你的策略未按照上述示例正确配置,请更正策略中的 Resource 字段,然后重试导入数据。

提示:

如果你多次更新权限策略后在数据导入期间仍然收到 AccessDenied 错误,可以尝试撤销活动会话。转到 IAM > 访问管理 > 角色,点击目标角色进入角色摘要页面。在角色摘要页面上,找到撤销活动会话并点击按钮以撤销活动会话。然后,重试数据导入。

请注意,这可能会影响你的其他应用程序。

检查存储桶策略

  1. 在 AWS 管理控制台中,打开 Amazon S3 控制台,然后转到存储桶页面。此时会显示存储桶列表。
  2. 在列表中,找到并点击目标存储桶。此时会显示存储桶信息页面。
  3. 点击权限标签页,然后向下滚动到存储桶策略区域。默认情况下,此区域没有策略值。如果在此区域显示任何拒绝策略,则在数据导入期间可能会出现 AccessDenied 错误。

如果你看到拒绝策略,请检查该策略是否与当前数据导入相关。如果是,请从该区域删除它,然后重试数据导入。

检查对象所有权

  1. 在 AWS 管理控制台中,打开 Amazon S3 控制台,然后转到存储桶页面。此时会显示存储桶列表。

  2. 在存储桶列表中,找到并点击目标存储桶。此时会显示存储桶信息页面。

  3. 在存储桶信息页面上,点击权限标签页,然后向下滚动到对象所有权区域。确保"对象所有权"配置为"强制执行存储桶所有者"。

    如果配置不是"强制执行存储桶所有者",则会出现 AccessDenied 错误,因为你的账户对此存储桶中的所有对象没有足够的权限。

要处理此错误,请点击对象所有权区域右上角的编辑,并将所有权更改为"强制执行存储桶所有者"。请注意,这可能会影响正在使用此存储桶的其他应用程序。

检查存储桶加密类型

加密 S3 存储桶的方式不止一种。当你尝试访问存储桶中的对象时,你创建的角色必须具有访问加密密钥以进行数据解密的权限。否则,会出现 AccessDenied 错误。

要检查存储桶的加密类型,请执行以下步骤:

  1. 在 AWS 管理控制台中,打开 Amazon S3 控制台,然后转到存储桶页面。此时会显示存储桶列表。
  2. 在存储桶列表中,找到并点击目标存储桶。此时会显示存储桶信息页面。
  3. 在存储桶信息页面上,点击属性标签页,向下滚动到默认加密区域,然后检查此区域中的配置。

有两种类型的服务器端加密:Amazon S3 托管密钥(SSE-S3)和 AWS Key Management Service(SSE-KMS)。对于 SSE-S3,不需要进一步检查,因为此加密类型不会导致访问被拒绝错误。对于 SSE-KMS,你需要检查以下内容:

  • 如果区域中的 AWS KMS 密钥 ARN 以黑色显示且没有下划线,则 AWS KMS 密钥是 AWS 托管密钥(aws/s3)。
  • 如果区域中的 AWS KMS 密钥 ARN 以蓝色显示并带有链接,请点击密钥 ARN 以打开密钥信息页面。检查左侧导航栏以查看具体的加密类型。它可能是 AWS 托管密钥(aws/s3)或客户托管密钥。
对于 SSE-KMS 中的 AWS 托管密钥(aws/s3)

在这种情况下,如果出现 AccessDenied 错误,原因可能是密钥是只读的,并且不允许跨账户权限授予。有关详细信息,请参见 AWS 文章为什么跨账户用户在尝试访问由自定义 AWS KMS 密钥加密的 S3 对象时会收到访问被拒绝错误

要解决访问被拒绝错误,请点击默认加密区域右上角的编辑,并将 AWS KMS 密钥更改为"从你的 AWS KMS 密钥中选择"或"输入 AWS KMS 密钥 ARN",或将服务器端加密类型更改为"AWS S3 托管密钥(SSE-S3)"。除了此方法外,你还可以创建新的存储桶并使用自定义托管密钥或 SSE-S3 加密方法。

对于 SSE-KMS 中的客户托管密钥

要解决这种情况下的 AccessDenied 错误,请点击密钥 ARN 或手动在 KMS 中找到密钥。此时会显示密钥用户页面。点击区域右上角的添加以添加你用于向 TiDB Cloud 导入数据的角色。然后,重试导入数据。

查看 AWS 文章获取说明

如果你已执行上述所有检查但仍收到 AccessDenied 错误,可以查看 AWS 文章如何排查来自 Amazon S3 的 403 访问被拒绝错误以获取更多说明。

文档内容是否有帮助?