我如何解决在向 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:* 添加到您向用于执行 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>/*"
      ]
    }
  ]
}

相关信息

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

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

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