如何解決在將資料從 Amazon Aurora 上傳或下載至 Amazon S3 時收到的錯誤?

4 分的閱讀內容
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 命令時,您可能會收到的一些常見錯誤,其中包括:

  • Error Code: 1871.Missing Credentials
  • Incorrect Command: missing file/prefix/manifest keyword
  • Error code: 1045.Access denied error
  • Error code: 1815.Internal error: Unable to initialize
  • Error Code: 1871.S3 API returned error: Access Denied

解決方法

執行 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;

Error Code: 1871.Missing Credentials

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 以解決此問題。

Incorrect Command: missing file/prefix/manifest keyword

如果您收到 "Incorrect Command: missing file/prefix/manifest keyword" 錯誤訊息,表示您尚未輸入正確的關鍵字來讓命令成功執行。若要修正此錯誤,請為命令輸入關鍵字。

Error code: 1045.Access denied error

如果輸入的命令不正確,您可能會收到錯誤訊息,例如 "1045: Access denied for user ''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';

Error code: 1815.Internal error: Unable to initialize

LOAD DATA FROM S3 's3://tests3saveloadaurora/testfile1prefix.part_00000' INTO TABLE test3000;
Error Code: 1815. Internal error: Unable to initialize S3Stream

有幾種原因導致您可能會收到 "Error code: 1815.Internal error: Unable to initialize" 錯誤訊息。

  • 您的檔案不存在。請確認檔案存在於 S3 儲存貯體中,且您在指令碼中指定的名稱與檔案名稱相符。請務必區分大小寫。確認 S3 儲存貯體名稱、資料夾名稱和物件名稱與載入命令中指定的名稱完全相符。
  • 您缺少檔案、資料夾或儲存貯體層級的適當許可。請檢閱步驟 2,確定您已設定正確的許可。
  • 您的 LOAD 指令碼中可能出現語法錯誤。請檢閱您的 LOAD 指令碼,然後重新執行命令。
  • S3 儲存貯體和資料庫叢集位於不同區域,而 S3 儲存貯體的路徑遺失區域值。如需 AWS 區域的詳細資訊,請參閱 Amazon S3 端點和配額
  • 讀取器和寫入器執行個體的網路組態不同。如需詳細資訊,請參閱使用讀取器端點

Error Code: 1871.S3 API returned error: Access Denied

如果您的 S3 儲存貯體加密,就會收到 "Error Code: 1871.S3 API returned error: Access Denied" 錯誤訊息。或者如果您的 S3 儲存貯體內有加密檔案,就可能會收到此錯誤訊息。如果 ServerSideEncryptionConfigurationExists 不是 false,請在您連接至 IAM 角色 (用於執行 LOAD 操作) 的政策中加入 kms:*。例如,如果您未使用 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 年前