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

Amazon Aurora 1.8 Load Data From S3 - Cannot Instantiate S3 Client

在最新的 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 运行 这个吗?我在文档中的任何地方都没有看到这一点

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

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

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

我遇到了同样的问题。我尝试将 AmazonS3FullAccess 添加到我的 RDS 实例正在使用的 IAM 角色中......不开心。

在四处寻找之后,我进入了 RDS 控制台,进入了 Clusters。选择我的 Aurora 集群并单击管理 IAM 角色。它给了我一个 drop-down,我选择了 IAM 角色(与各个实例使用的角色相同)。

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

所以,有(对我们来说)5 steps/components:

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>/*"
        }
    ]
}

"Principal" 将是任何 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) 配置一个参数组,您的 cluster/instances 将使用该参数组将 aws_default_s3_role 值设置为上面 #3 中角色的 ARN。

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

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

希望对您有所帮助!

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

对我来说,我错过了将创建的 RDS 角色添加到我的 S3 存储桶的步骤。一旦我添加它,它立即起作用。

我曾多次遇到此错误。

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

  2. 立即抛出错误(0.2s)。之前从S3上加载数据是成功的,但是突然在S3url上发生了变化,又出现了这个错误。我使用了错误的 S3 URL。因为我想使用 S3 前缀而不是文件。检查 'Load' 语法以使您的 sql 正确。

2019 年 3 月:

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

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

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

The path includes the following values:

  • region (optional) – The AWS Region that contains the Amazon S3 bucket to load from. This value is optional. If you don't specify a region value, then Aurora loads your file from Amazon S3 in the same region as your DB cluster.
  • bucket-name – The name of the Amazon S3 bucket that contains the data to load. Object prefixes that identify a virtual folder path are supported.
  • file-name-or-prefix – The name of the Amazon S3 text file or XML file, or a prefix that identifies one or more text or XML files to load. You can also specify a manifest file that identifies one or more text files to load.

通过执行步骤 2 到 5 并为 S3 访问创建 VPC 端点,它对我有用。

我在尝试使用 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(请参阅上面 link 的副标题“让 Aurora 访问 Amazon S3”下的说明列表。

为我解决的问题:

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

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