如何解决在将数据上传到 Amazon Aurora 或从 Amazon Aurora 下载到 Amazon S3 时出现的错误?

上次更新时间:2020 年 12 月 14 日

我想从 Amazon Simple Storage Service (Amazon S3) 将数据上传到 Amazon Aurora

-或者-

我想从 Amazon Aurora 下载数据并将其上传到 Amazon S3。

如何解决在将数据上传或从 Amazon Aurora 上传或下载到 Amazon S3 时收到的错误?

简短描述

要将数据作为文本文件从 Amazon Aurora 加载到 Amazon S3 中,请在 Amazon Aurora 中执行 SELECT INT OUTFILE S3

要将数据作为文本从 Amazon S3 加载到 Amazon Aurora,请在 Amazon Aurora 中执行 LOAD DATA FROM S3 命令。

运行 SELECT INTO OUTFILE S3 或 LOAD DATA FROM S3 命令时可能会收到的一些常见错误包括:

  • 错误代码:1871。缺少凭证
  • 错误命令:缺少文件/前缀/清单关键字
  • 错误代码:1045。访问被拒绝错误
  • 错误代码:1815。内部错误:无法初始化
  • 错误代码:1871。S3 API 返回错误:访问被拒绝

首先,使用 Amazon Aurora 按照以下步骤运行 SELECT INTO OUTFILE S3 或 LOAD DATA FROM S3 命令。如果您收到错误,请对收到的错误代码使用故障排除步骤。

解决方案

运行 SELECT INTO OUTFILE S3 或 LOAD DATA FROM S3 命令

要使用 Amazon Aurora 运行 SELECT INTO OUTFILE S3 LOAD DATA FROM S3 命令,请执行以下步骤:

1.创建 S3 存储桶并复制 ARN。

2. 为具有权限的 S3 存储桶创建 IAM 策略。指定存储桶 ARN,然后授予存储桶中的对象权限(存储桶 ARN*)。

如果您没有使用 FullS3Access 策略,请运行类似于以下策略的自定义策略:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": "s3:*",
            "Resource": [
                "arn:aws:s3:::<your_bucket_name>",
                "arn:aws:s3:::<your_bucket_name>/*"
            ]
        }
    ]
}</your_bucket_name></your_bucket_name>

3.为 Amazon Relational Database Service (Amazon RDS) 服务创建 IAM 角色,然后将您创建的 IAM 策略附加到该服务。

信任关系如下所示:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "",
      "Effect": "Allow",
      "Principal": {
        "Service": "rds.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

4.为 Arurora 创建自定义数据库集群参数组。然后,将 aurora_select_into_s3_role aws_default_s3_role/aurora_load_from_s3_role 或 aws_default_s3_role 编辑为 IAM 角色 ARN 的值。

5.将 IAM 角色附加到您创建的数据库集群。有关更多信息,请参阅将 IAM 角色与 Amazon Aurora MySQL 数据库集群关联

6.登录到您的 Amazon Aurora 数据库集群

7.通过运行以下命令创建一个新用户:

CREATE USER 'testsaveload'@'%' IDENTIFIED BY 'somepassword’;
show grants for 'testsaveload'@'%’;

8.通过运行以下命令授予用户权限:

GRANT SELECT, CREATE, INSERT, DROP ON *.* TO 'testsaveload'@'%’;
GRANT SELECT INTO S3 ON *.* TO 'testsaveload'@'%’;
GRANT LOAD FROM S3 ON *.* TO 'testsaveload'@'%’;

9.运行 SELECT INTO OUTFILE S3LOAD DATA INTO S3 命令:

SELECT * from test1.test2034 INTO OUTFILE S3 's3://tests3saveloadaurora/testfile1prefix.part_00000';
LOAD DATA FROM S3 PREFIX 's3-us-east-1://tests3saveloadaurora/testfile1prefix.part_00000' INTO TABLE test3001;
LOAD DATA FROM S3 's3-us-east-1://tests3saveloadaurora/prefix3.part_00000' INTO TABLE test3000;

如果您在运行 SELECT INTO OUTFILE S3LOAD DATA INTO S3 命令时遇到任何错误,请按照以下步骤操作。

错误代码:1871。缺少凭证

您将收到以下错误信息,如果:

  • 数据库集群的 IAM 角色附件缺失失。请参阅上面的步骤 5 来解决此问题。
  • 未指定角色 ARN,参数组中只列出角色名称。请参阅上面的步骤 2 来解决此问题。
SELECT * from test1.test2034 INTO OUTFILE S3 '"s3://tests3saveloadaurora/testfile1prefix.part_00000';
Error Code: 1871. S3 API returned error: Missing Credentials: Cannot instantiate S3 Client

错误命令:缺少文件/前缀/清单关键字

如果您收到错误“Incorrect Command: missing file/prefix/manifest keyword”(错误命令:缺少文件/前缀/清单关键字),这意味着您没有输入成功执行该命令所需的正确关键字。要修复此错误,请输入命令的关键字。

错误代码:1045。访问被拒绝错误

如果输入错误的命令,可能会收到类似“1045: Access denied for user ''testsaveload'@'%';”(1045:用户访问被拒绝''testsaveload'@'%';)的错误。例如,以下命令数学不正确:

SELECT * from test1.test2034 INTO OUTFILE 's3://tests3saveloadaurora/testfile1prefix.part_00000';

确保在查询中输入了关键字 S3。下面的命令书写正确:

SELECT * from test1.test2034 INTO OUTFILE S3 's3://tests3saveloadaurora/testfile1prefix.part_00000';

错误代码:1815。内部错误:无法初始化

LOAD DATA FROM S3 's3://tests3saveloadaurora/testfile1prefix.part_00000' INTO TABLE test3000;
Error Code: 1815. Internal error: Unable to initialize S3Stream

您会收到“Error code: 1815.Internal error: Unable (to initialize”(错误代码:1815。内部错误:无法初始化)错误,包括以下内容:

  • 您的文件不存在。确认该文件存在于 S3 存储桶中,并且您在脚本中指定的名称与文件名称匹配。区分大小写很重要。确认 S3 存储桶名称、文件夹名称和对象名称与加载命令中指定的完全匹配。
  • 您缺少文件、文件夹或存储桶级别的适当权限。查看步骤 2,确保已设置正确的权限。
  • LOAD 脚本中可能有语法错误。查看 LOAD 脚本,然后重新运行该命令。
  • S3 存储桶和数据库集群位于不同的区域中,S3 存储桶的路径缺少区域值。有关 AWS 区域的更多信息,请参阅 Amazon S3 终端节点
  • 读取器和写入器实例的网络配置不同。有关更多信息,请参阅 Amazon Aurora 连接管理

错误代码:1871。S3 API 返回错误:访问被拒绝

如果您对 S3 存储桶进行了加密,或者 S3 存储桶中有加密文件,则会收到“Error Code: 1871.S3 API returned error: Access Denied”(错误代码:1871。S3 API 返回错误:访问被拒绝)错误。如果 ServerSideEncryptionConfigurationExists 不是假的,请kms:* 添加到用于执行 LOAD 操作的已附加到 IAM 角色的策略。 例如,如果您没有使用 Fulls3Access 策略,请使用下面的示例自定义策略:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": ["s3:*","kms:*"],
            "Resource": [
                "arn:aws:s3:::<your_bucket_name>",
                "arn:aws:s3:::<your_bucket_name>/*"
            ]
        }
    ]
}</your_bucket_name></your_bucket_name>