Amazon Aurora 1.8 从 S3 加载数据 - 无法实例化 S3 客户端

Posted

技术标签:

【中文标题】Amazon Aurora 1.8 从 S3 加载数据 - 无法实例化 S3 客户端【英文标题】:Amazon Aurora 1.8 Load Data From S3 - Cannot Instantiate S3 Client 【发布时间】:2017-03-07 21:56:27 【问题描述】:

在最新的 Aurora 更新 (1.8) 中,引入了命令 LOAD DATA FROM S3。有没有人让这个工作?升级到 1.8 后,我按照设置指南 Here 创建角色以允许从 RDS 访问 S3。

重启服务器并尝试运行命令后

LOAD DATA FROM S3 PREFIX 's3://<bucket_name>/prefix' INTO TABLE table_name

在 SQL Workbench/J 中,出现错误:

Warnings:
S3 API returned error: Missing Credentials: Cannot instantiate S3 Client
S3 API returned error: Failed to instantiate S3 Client
Internal error: Unable to initialize S3Stream

是否需要任何其他步骤?我只能从 SDK 运行它吗?我在文档中的任何地方都没有提到这一点

【问题讨论】:

我也有同样的问题。我已经在 AWS 论坛中讨论过它,而且我显然已经正确设置了它。帮助我的亚马逊人升级了这个问题。如果我得到一个决议,我会通过它。 同样的事情发生在我身上,被升级了。一定是常见问题。 @Ray 我与 Aurora 团队取得了联系,他们很快就会为此推出补丁。 这里有什么更新吗?即使应用了@Ray 的以下所有建议,我也遇到了同样的问题 【参考方案1】:

我有同样的问题。我尝试将 AmazonS3FullAccess 添加到我的 RDS 实例正在使用的 IAM 角色...不高兴。

四处逛逛之后,我进入了 RDS 控制台,进入了集群。选择我的 Aurora 集群并单击管理 IAM 角色。它给了我一个下拉菜单,我选择了 IAM 角色(与各个实例使用的角色相同)。

一旦我这样做了,一切都很好,数据加载又快又好。

因此,(对我们而言)有 5 个步骤/组件:

1) 允许用户上传对象的 S3 存储桶和存储桶策略


    "Version": "2012-10-17",
    "Id": "Policy1453918146601",
    "Statement": [
        
            "Sid": "Stmt1453917898368",
            "Effect": "Allow",
            "Principal": 
                "AWS": "arn:aws:iam::<account id>:<user/group/role>/<IAM User/Group/Role>"
            ,
            "Action": [
                "s3:DeleteObject",
                "s3:GetObject",
                "s3:PutObject"
            ],
            "Resource": "arn:aws:s3:::<bucket name>/*"
        
    ]

“委托人”可以是任何 IAM 用户、组或角色将数据文件上传到存储桶以便 RDS 实例可以导入数据。

2) IAM 政策:


    "Version": "2012-10-17",
    "Statement": [
        
            "Sid": "Stmt1486490368000",
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:GetObjectVersion",
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::<bucket name>/*"
            ]
        
    ]

使用策略生成器非常简单。

3) 创建 IAM 角色:

应为该角色分配上述 IAM 政策。如果您不打算将此策略用于其他角色,您也可以执行内联策略,但我喜欢有一个已定义的策略的想法,如果我有需要,我可以在以后参考。

4) 配置一个参数组,您的集群/实例将使用该参数组将 aws_default_s3_role 值设置为上述 #3 中角色的 ARN。

5) 通过转到集群、选择您的集群、选择管理 IAM 角色并为您的数据库集群设置 IAM 角色来配置 Aurora 集群

至少对我来说,这些步骤很有效。

希望有帮助!

【讨论】:

将此标记为答案。虽然最初问题是由于 Aurora 版本本身的问题,但该问题已得到解决,现在遇到该问题的大多数人都可以按照以下步骤解决。 在我克隆 RDS 实例之前它仍然无法工作。 我已经安装了 VPC 端点,试图弄清楚为什么会出现权限问题。按照上面的清单为我解决了这个问题。谢谢一百万! 隐藏选项 + 对参数组来说似乎是多余的 尝试了所有这些都没有运气,然后我意识到在权限组角色中,我正在输入角色名称,它实际上需要角色的 ARN。我知道现在这听起来很傻,但是……无论如何,一旦我这样做了,直到我重新启动数据库,它仍然无法正常工作。然后这一切都走到了一起。谢谢你的这篇文章。【参考方案2】:

如果唯一的错误是 Internal error: Unable to initialize S3Stream 并且它立即抛出此错误,可能的罪魁祸首是:

存储桶或对象名称中的错字 在与数据库不同的区域创建的存储桶 未根据the syntax for specifying a path to files stored on an Amazon S3 bucket 指定存储桶或对象名称:s3-region://bucket-name/file-name-or-prefix

路径包含以下值:

region(可选)– 包含要从中加载的 Amazon S3 存储桶的 AWS 区域。该值是可选的。如果您未指定区域值,则 Aurora 会从与您的数据库集群相同的区域中的 Amazon S3 加载您的文件。 bucket-name – 包含要加载的数据的 Amazon S3 存储桶的名称。支持标识虚拟文件夹路径的对象前缀。 file-name-or-prefix – Amazon S3 文本文件或 XML 文件的名称,或标识要加载的一个或多个文本或 XML 文件的前缀。您还可以指定一个清单文件来标识要加载的一个或多个文本文件。

【讨论】:

如果您无意中在与数据库不同的区域中创建了存储桶,则指定该区域可以解决问题。【参考方案3】:

根据上述所有建议,作为最后一步,我必须向 S3 添加一个 VPC 端点。之后,一切都开始工作了。

【讨论】:

【参考方案4】:

2019 年 3 月:

RDS 控制台不再提供更改角色的选项。对我有用的是通过 CLI 添加角色,然后重新启动编写器实例。

aws rds add-role-to-db-cluster --db-cluster-identifier my-cluster --role-arn arn:aws:iam::123456789012:role/AllowAuroraS3Role

【讨论】:

伙计,这很奇怪,我去年 11 月刚刚使用控制台为另一个帐户配置了这个,现在该选项从控制台中消失了。这是一团糟。 它现在在“连接和安全”标签下。【参考方案5】:

对我来说,我错过了将创建的 RDS 角色添加到我的 S3 存储桶的步骤。添加后,它立即生效。

【讨论】:

【参考方案6】:

您需要将 AmazonS3ReadOnlyAccess 或 AmazonS3FullAccess 策略附加到您在 IAM 中设置的角色。此步骤未包含在设置指南中。

在 AWS 控制台中转到 IAM -> 角色,选择您正在使用的角色,单击“附加策略”,然后向下滚动到 S3 策略并选择一个。

【讨论】:

我在设置过程中这样做了。亚马逊上报了我的支持票。 嗯...这就是为我解决的问题。这是一个非常新的功能 - 我想我们的先驱者必须受一点苦,这样后来者才能更轻松。【参考方案7】:

我联系了 Amazon Aurora 团队,他们确认某些服务器存在此问题的边缘情况。他们正在推出一个补丁来很快解决这个问题,但同时手动将补丁应用到我的集群。

【讨论】:

嗨 aarbor, 看起来我也遇到了同样的问题。你能告诉我补丁是什么以及你是如何应用它的吗?谢谢亚当 检查控制台以获取最新的维护补丁并应用它们,这应该可以解决问题【参考方案8】:

我曾多次遇到此错误。

    运行 'LOAD' sql 一段时间(大约 220 秒)后抛出错误,这是一个可疑的超时情况。最后我发现我的 RDS 的子网组只有一个出站,不包括到 S3 的一个。通过添加出站规则可以解决这个问题。

    立即抛出错误(0.2 秒)。我之前是成功从 S3 加载数据的,但是突然随着 S3 url 的改变,这个错误又出现了。我使用了错误的 S3 URL。因为我想使用 S3 前缀而不是文件。检查“加载”语法以使您的 sql 正确。

【讨论】:

【参考方案9】:

按照步骤 2 到 5 并为 S3 访问创建 VPC 端点,它对我有用。

【讨论】:

【参考方案10】:

我在尝试使用 mysql Workbench LOAD DATA FROM S3 时遇到了同样的错误。我已经能够成功地CREATE DATABASECREATE TABLE,所以我知道我的连接正常。

我严格遵循Loading data into an Amazon Aurora MySQL DB cluster from text files in an Amazon S3 bucket 的所有 AWS 文档说明。

在我的情况下,我没有正确遵循说明步骤 3 和 4(请参阅上面链接中“让 Aurora 访问 Amazon S3”的子标题下的说明列表。

为我解决了什么问题:

    从 Amazon RDS,我在导航中选择了“参数组” 左侧窗格。 然后我点击了我新创建的自定义数据库集群参数 组(上面链接中的第 3 步)。 在我的自定义组中,我搜索了 aurora_load_from_s3_role 然后在“值”输入框中,我 复制/粘贴我刚刚在步骤 2 中创建的角色的 ARN 将说明放入此框中,然后单击“保存”(上面链接中的第 4 步)。

我回到 MySQL Workbench 并重新运行了我的 LOAD DATA FROM S3 命令,它成功了!

【讨论】:

以上是关于Amazon Aurora 1.8 从 S3 加载数据 - 无法实例化 S3 客户端的主要内容,如果未能解决你的问题,请参考以下文章

是否可以从 Amazon Aurora 迁移回 Amazon RDS 中的原生 MySQL?

使用引号将数据从 S3 加载到 Amazon Redshift

如何更改 Amazon Aurora DB 中的 character_set_server?

Amazon S3 HTTPS 未在 Linux 上使用 Chrome 和 wget 加载

Amazon Data Pipeline“将 S3 数据加载到 RDS MySQL”查询格式?

从多个进程访问 Amazon S3 文件