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

3 分钟阅读
0

我想从 Amazon Simple Storage Service(Amazon S3)将数据上传到 Amazon Aurora。或者我想从 Amazon Aurora 下载数据并将其上传到 Amazon S3。

简短描述

使用以下命令之一将数据作为文本文件在 Amazon Aurora 和 Amazon S3 之间加载:

  • SELECT INTO OUTFILE S3 - 将数据从 Amazon Aurora 加载到 Amazon S3 中
  • LOAD DATA FROM S3 - 将数据从 Amazon S3 加载到 Amazon Aurora 中

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

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

解决方法

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

使用 Amazon Aurora 运行 SELECT INTO OUTFILE S3LOAD DATA FROM S3 命令:

1.    创建 S3 桶并复制 ARN。

2.    为 S3 桶创建 AWS Identity and Access Management(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>/*"
      ]
    }
  ]
}

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.    为 Aurora 创建自定义数据库集群参数组。

对于 Aurora MySQL 版本 1 或 2:

aurora_select_into_s3_roleaws_default_s3_role 中的某个角色编辑为 IAM 角色 ARN 的值。

对于 Aurora MySQL 版本 3:

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'@'%';

对于 Aurora MySQL 版本 1 或 2,使用以下语句:

GRANT SELECT INTO S3 ON *.* TO 'testsaveload'@'%';
GRANT LOAD FROM S3 ON *.* TO 'testsaveload'@'%';

对于 Aurora MySQL 版本 3,使用以下语句:

GRANT AWS_SELECT_S3_ACCESS TO 'testsaveload'@'%'
GRANT AWS_LOAD_S3_ACCESS TO 'testsaveload'@'%';

**注意:**在 Aurora MySQL 版本 3 中,可以使用数据库集群参数启用 activate_all_roles_on_login。这会在用户连接到数据库实例时自动激活所有角色。有关详细信息,请参阅授予在 Amazon Aurora MySQL 中加载数据的权限

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;

错误代码: 1871。缺少证书

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

在以下情况下,您可能会收到此错误:

  • IAM 角色未附加到数据库集群。请参阅上一部分中的步骤 5 以修复此问题。
  • 未指定角色 ARN,参数组中仅列出角色名称。请参阅上一部分中的步骤 2 以解决此问题。

命令不正确:缺少文件/前缀/清单关键字

如果您收到“命令不正确:缺少文件/前缀/清单关键字”错误,则说明您没有输入正确的关键字,命令无法成功运行。要修复此错误,请输入命令的关键字。

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

如果您输入的命令不正确,则可能会收到错误,例如“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

由于很多原因,您可能会收到“错误代码: 1815。内部错误: 无法初始化”错误。

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

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

如果您在 S3 桶上进行了加密,则会收到“错误代码: 1871。S3 API 返回了错误: 访问被拒绝”错误。或者,如果您的 S3 桶中有加密文件,则可能会收到此错误。如果 ServerSideEncryptionConfigurationExists 不为 false,请将 kms:* 添加到您向 IAM 角色附加的策略,此角色用于执行 LOAD 操作。例如,如果您没有使用 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>/*"
      ]
    }
  ]
}

相关信息

将 Amazon Aurora MySQL 数据库集群中的数据保存到 Amazon S3 存储桶中的文本文件

将数据从 Amazon S3 桶中的文本文件加载到 Amazon Aurora MySQL 数据库集群

AWS 官方
AWS 官方已更新 1 年前