跳至內容

如何將資料從 Amazon Redshift 複製或卸載到另一個帳戶中的 Amazon S3 儲存貯體?

3 分的閱讀內容
0

我想將資料從 Amazon Redshift 複製或卸載到另一個 AWS 帳戶中的 Amazon Simple Storage Service (Amazon S3) 儲存貯體。但我無法擔任另一個帳戶中的 AWS Identity and Access Management (IAM) 角色。我需要設定跨帳戶存取權。

簡短說明

若要存取不同帳戶中的 Amazon S3 資源,請完成以下步驟:

  1. 在 Amazon S3 帳戶中建立一個 IAM 角色 (RoleA)。
  2. 在 Amazon Redshift 帳戶中建立一個 IAM 角色 (RoleB),並授予擔任 RoleA 的權限。
  3. 測試 RoleARoleB 之間的跨帳戶存取權。

**注意:**上述步驟適用於 Redshift Serverless 和 Redshift 已佈建資料倉儲,且適用於所有資料格式。不過,對於某些資料格式,您可能需要修改 COPYUNLOAD 命令語法。例如,如果您使用 Parquet 資料格式,則必須使用以下語法:

COPY table_name FROM 's3://awsexamplebucket/crosscopy1.csv' IAM_ROLE 'arn:aws:iam::Amazon_Redshift_Account_ID:role/RoleB,arn:aws:iam::Amazon_S3_Account_ID:role/RoleA FORMAT AS PARQUET;

解決方法

**注意:**以下程序假設 Amazon Redshift 叢集和 S3 儲存貯體位於相同 AWS 區域。如果您的叢集和儲存貯體位於不同區域,則必須將 REGION 參數新增至 COPYUNLOAD 命令。

在使用 Amazon S3 的帳戶中建立 IAM 角色 (RoleA)

請完成以下步驟:

  1. 開啟 IAM console (IAM 主控台)。
  2. 選擇 Policies (政策),然後選擇 Create policy (建立政策)。
  3. 選擇 JSON 索引標籤,然後輸入以下 IAM 政策:
    **注意:**如果 S3 儲存貯體未使用 AWS Key Management Service (KMS) 金鑰加密,則請移除 AWS KMS 權限。
    {  
       "Version": "2012-10-17",  
       "Statement": [  
        {  
          "Sid": "VisualEditor0",  
          "Effect": "Allow",  
          "Action": [  
            "kms:Decrypt",  
            "kms:Encrypt",  
            "kms:GenerateDataKey"  
          ],  
          "Resource": [  
            "<KMS_KEY_ARN_A_Used_for_S3_encryption>"  
          ]  
        },  
        {  
          "Sid": "VisualEditor1",  
          "Effect": "Allow",  
          "Action": [  
            "s3:PutObject",  
            "s3:Get*",  
            "s3:List*"  
          ],  
          "Resource": [  
            "arn:aws:s3:::awsexamplebucket",  
            "arn:aws:s3:::awsexamplebucket/*"  
          ]  
        }  
      ]  
    }
    **注意:**將 awsexamplebucket 替換為 S3 儲存貯體的名稱。如果您使用 AWS KMS key 加密,請將 KMS_KEY_ARN_A_Used_for_S3_encryption 替換為 AWS KMS key 的 ARN。
  4. 選擇 Review policy (檢閱政策)。
  5. 輸入政策的名稱,然後選擇 Create policy (建立政策)。
  6. 在導覽窗格中,選擇 Roles (角色)。
  7. 選擇 Create role (建立角色)。
  8. 選擇 Another AWS account (另一個 AWS 帳戶) 作為受信任實體角色。
  9. 輸入使用 Amazon Redshift 的帳戶 account ID (帳戶 ID)。
  10. 選擇 Next: Permissions (下一步:權限),然後選取政策。
  11. (選用) 選擇 Next: Tags (下一步:標籤),然後新增標籤。
  12. 選擇 Next: Review (下一步:檢閱)。
  13. 輸入角色名稱。
  14. 選擇 Create role (建立角色)。

在 Amazon Redshift 帳戶中建立 IAM 角色 (RoleB),並授予擔任 RoleA 的權限

請完成以下步驟:

  1. 開啟 IAM console (IAM 主控台)。
  2. 選擇 Policies (政策),然後選擇 Create policy (建立政策)。
  3. 選擇 JSON 索引標籤,然後輸入以下 IAM 政策:
    {  
      "Version": "2012-10-17",  
      "Statement": [  
        {  
          "Sid": "CrossAccountPolicy",  
          "Effect": "Allow",  
          "Action": "sts:AssumeRole",  
          "Resource": "AmazonS3AccountRoleARN"  
        }  
      ]  
    }
    **注意:**將 AmazonS3AccountRoleARN 替換為 RoleA (arn:aws:iam::Amazon_S3_Account_ID:role/RoleA) 的 ARN。
  4. 選擇 Review policy (檢閱政策)。
  5. 輸入政策的名稱,然後選擇 Create policy (建立政策)。
  6. 在導覽窗格中,選擇 Roles (角色)。
  7. 選擇 Create role (建立角色)。
  8. 選擇 AWS service (AWS 服務) 作為您的受信任實體類型。
  9. 選擇 Redshift
  10. 選擇 Redshift - Customizable (Redshift - 可自訂)。
  11. 選擇 Next: Permissions (下一步:權限),然後選取政策。
  12. (選用) 選擇 Next: Tags (下一步:標籤),然後新增標籤。
  13. 選擇 Next: Review (下一步:檢閱)。
  14. 輸入角色名稱。
  15. 選擇 Create role (建立角色)。
  16. RoleB 連接至您的 Amazon Redshift 叢集:
    對於已佈建 Redshift 叢集,請參閱將 IAM 角色與您的叢集建立關聯
    -或-
    對於 Redshift Serverless,請參閱授予 Amazon Redshift Serverless 權限

**注意:**當您在 Amazon Redshift 中鏈結 IAM 角色時,Amazon Redshift 叢集會擔任 RoleB,然後 RoleB 會擔任 RoleA

測試您的 S3 儲存貯體與 Amazon Redshift 之間的跨帳戶存取權

請完成以下步驟:

  1. 執行 COPY 命令,將資料從您的 S3 儲存貯體匯入 Amazon Redshift:

    COPY table_name FROM 's3://awsexamplebucket/crosscopy1.csv' IAM_ROLE 'arn:aws:iam::Amazon_Redshift_Account_ID:role/RoleB,arn:aws:iam::Amazon_S3_Account_ID:role/RoleA' DELIMITER ',' REMOVEQUOTES;
  2. 若要確認已授予跨帳戶存取權,請執行 UNLOAD 命令,將資料從 Amazon Redshift 卸載至您的 S3 儲存貯體:

    UNLOAD ('SELECT * FROM table_name') TO 's3://awsexamplebucket/folder/table_name_' IAM_ROLE 'arn:aws:iam::Amazon_Redshift_Account_ID:role/RoleB,arn:aws:iam::Amazon_S3_Account_ID:role/RoleA' KMS_KEY_ID 'ARN_KMS_KEY_ID' ENCRYPTED;

**注意:**在上述命令中,替換以下值:

  • **table_name:**您要將 Amazon S3 資料複製到其中的 Amazon Redshift 資料表
  • **s3://awsexamplebucket/crosscopy1.csv:**您要從中複製資料的 S3 檔案路徑
  • Amazon_Redshift_Account_ID: Amazon Redshift 帳戶的帳戶 ID
  • Amazon_S3_Account_ID: Amazon S3 帳戶的帳戶 ID
  • (選用) **ARN_KMS_KEY_ID:**您用來加密 S3 儲存貯體的 KMS key ID 的 ARN

相關資訊

如何提供跨帳戶存取權,以存取 Amazon S3 儲存貯體中的物件?

如何從另一個 AWS 帳戶複製 S3 物件?

COPY、UNLOAD 和 CREATE LIBRARY 的 IAM 權限

AWS 官方已更新 2 年前