Complete a 3 Question Survey and Earn a re:Post Badge
Help improve AWS Support Official channel in re:Post and share your experience - complete a quick three-question survey to earn a re:Post badge!
如何解决在 Amazon Aurora 和 Amazon S3 之间加载数据时出现的错误?
我想修复在 Amazon Aurora 和 Amazon Simple Storage Service (Amazon S3) 之间加载数据时出现的错误。
简短描述
要在 Amazon Aurora 和 Amazon S3 之间以文本文件形式加载数据,请使用 SELECT INTO OUTFILE S3 命令或 LOAD DATA FROM S3 命令。当运行任一命令时,您可能会收到如下错误:
- 错误代码: 1871。缺少凭证
- 命令不正确:缺少文件/前缀/清单关键字
- 错误代码: 1045。“访问被拒绝”错误
- 错误代码: 1815。内部错误: 无法初始化
- 错误代码: 1871。S3 API 返回错误: 访问被拒绝
解决方法
运行 SELECT INTO OUTFILE S3 或 LOAD DATA FROM S3 命令
完成以下步骤:
-
创建 S3 存储桶并复制 ARN。
-
创建具有 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>/*" ] } ] }
-
为 Amazon Relational Database Service (Amazon RDS) 服务创建 IAM 角色。然后,附加您创建的 IAM 策略。信任关系将类似于以下:
{ "Version": "2012-10-17", "Statement": [ { "Sid": "", "Effect": "Allow", "Principal": { "Service": "rds.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }
-
为 Amazon Aurora 创建自定义数据库集群参数组。对于 Amazon Aurora MySQL 兼容版 1 或 2,请将 aurora_select_into_s3_role 或 aws_default_s3_role 编辑为 IAM 角色 ARN 的值。对于 Aurora MySQL 兼容版 3,请将 aws_default_s3_role 编辑为 IAM 角色 ARN 的值。
-
将 IAM 角色附加到您创建的数据库集群。有关详细信息,请参阅将 IAM 角色与 Amazon Aurora MySQL 数据库集群关联。
-
要创建新用户,请运行以下命令:
CREATE USER 'testsaveload'@'%' IDENTIFIED BY 'somepassword';show grants for 'testsaveload'@'%';
-
要向用户授予权限,请运行以下命令:
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 中加载数据。 运行 SELECT INTO OUTFILE S3 或 LOAD 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。内部错误: 无法初始化
如果您收到此错误,请完成以下步骤:
- 确认该文件存在于您的 S3 存储桶中,然后确认您在脚本中指定的名称与文件名相匹配。确认 S3 存储桶、文件夹和对象名称与加载命令相匹配。
- 查看“运行 SELECT INTO OUTFILE S3 或 LOAD DATA FROM S3 命令”部分中的步骤 2,以确保设置了正确的权限。
- 如果 LOAD 脚本中存在语法错误,请检查您的 LOAD 脚本,然后重新运行该命令。
- 如果 S3 存储桶和数据库集群位于不同的区域,且 S3 存储桶的路径缺少区域值,请参阅 Amazon Simple Storage Service 端点和配额以了解详细信息。
- 如果读取器和写入器实例的网络配置不同,请参阅 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 和存储桶名称正确。