如何解决在 Amazon Aurora 和 Amazon S3 之间加载数据时出现的错误?

3 分钟阅读
0

我想修复在 Amazon Aurora 和 Amazon Simple Storage Service (Amazon S3) 之间加载数据时出现的错误。

简短描述

要在 Amazon Aurora 和 Amazon S3 之间以文本文件形式加载数据,请使用 SELECT INTO OUTFILE S3 命令或 LOAD DATA FROM S3 命令。当运行任一命令时,您可能会收到如下错误:

  1. 错误代码: 1871。缺少凭证
  2. 命令不正确:缺少文件/前缀/清单关键字
  3. 错误代码: 1045。“访问被拒绝”错误
  4. 错误代码: 1815。内部错误: 无法初始化
  5. 错误代码: 1871。S3 API 返回错误: 访问被拒绝

解决方法

运行 SELECT INTO OUTFILE S3 或 LOAD 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. 为 Amazon Aurora 创建自定义数据库集群参数组。对于 Amazon 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'@'%';
  9. 对于 Aurora MySQL 版本 1 或 2,使用以下语句:

    GRANT SELECT INTO S3 ON *.* TO 'testsaveload'@'%';GRANT LOAD FROM S3 ON *.* TO 'testsaveload'@'%';
  10. 对于 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 中加载数据。 运行 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。缺少凭证

如果 IAM 角色未附加到数据库集群,请参阅“运行 SELECT INTO OUTFILE S3 或 LOAD DATA FROM S3 命令”部分中的步骤 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。内部错误: 无法初始化

如果您收到此错误,请完成以下步骤:

  1. 确认该文件存在于您的 S3 存储桶中,然后确认您在脚本中指定的名称与文件名相匹配。确认 S3 存储桶、文件夹和对象名称与加载命令相匹配。
  2. 查看“运行 SELECT INTO OUTFILE S3 或 LOAD DATA FROM S3 命令”部分中的步骤 2,以确保设置了正确的权限。
  3. 如果 LOAD 脚本中存在语法错误,请检查您的 LOAD 脚本,然后重新运行该命令。
  4. 如果 S3 存储桶和数据库集群位于不同的区域,且 S3 存储桶的路径缺少区域值,请参阅 Amazon Simple Storage Service 端点和配额以了解详细信息。
  5. 如果读取器和写入器实例的网络配置不同,请参阅 Amazon Aurora 端点连接以了解详细信息。

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

如果您对 S3 存储桶进行了加密,或者 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>/*"
      ]
    }
  ]
}

错误: S3 API 返回错误: 未找到资源: 没有响应正文。

要解决此错误,请确保 ARN 和存储桶名称正确。

相关信息

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

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

AWS 官方
AWS 官方已更新 4 个月前