我的 Amazon S3 儲存貯體具有的資料檔案,是使用另一個帳戶中 Amazon Redshift 叢集的 UNLOAD 命令所建立。為什麼我無法存取那些檔案?

2 分的閱讀內容
0

我的 Amazon Simple Storage Service (Amazon S3) 儲存貯體具有的資料檔案,是使用另一個 AWS 帳戶中 Amazon Redshift 叢集的 UNLOAD 命令所建立。但是,當我嘗試使用自己的帳戶存取那些檔案時,出現 403 存取遭拒錯誤。我該如何解決這個問題?

簡短描述

預設情況下,S3 物件由上傳該物件的 AWS 帳戶擁有。即使儲存貯體由另一個帳戶擁有,也是如此。因此,當其他帳戶將 Amazon Redshift 資料檔案放入儲存貯體時,您不具備那些檔案的預設權限。

若要存取資料檔案,具有跨帳戶權限的 AWS Identity and Access Management (IAM) 角色必須再次執行 UNLOAD 命令。請按照下列步驟,設定具有跨帳戶儲存貯體權限的 Amazon Redshift 叢集:

1.    從 S3 儲存貯體的帳戶,建立具有儲存貯體權限的 IAM 角色。這是儲存貯體角色。

2.    從 Amazon Redshift 叢集的帳戶中,建立另一個具有擔任該儲存貯體角色許可的 IAM 角色。這是叢集角色。

3.    更新儲存貯體角色以授予儲存貯體存取權,然後建立與該叢集角色的信任關係。

4.    從 Amazon Redshift 叢集中,使用叢集角色和儲存貯體角色執行 UNLOAD 命令。

重要: 此解決方法不適用於將伺服器端加密與 AWS Key Management Service (AWS KMS) 搭配使用的 Amazon Redshift 叢集或 S3 儲存貯體。

解決方案

建立儲存貯體角色

從 S3 儲存貯體的帳戶,建立具有儲存貯體權限的 IAM 角色:

1.    從 S3 儲存貯體的帳戶中,開啟 IAM 主控台

2.    建立 IAM 角色。建立此角色時,請選取下列項目:

選取受信任實體的類型中,選擇 AWS 服務

選擇將使用此角色的服務中,選擇 Redshift

選取使用案例中,選擇 Redshift - Customizable (Redshift - 可自訂)。

3.    建立 IAM 角色後,附加授予儲存貯體權限的政策。您可以使用類似下列範例的政策:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "Stmt1234537676482",
      "Action": [
        "s3:ListBucket",
        "s3:PutObject"
      ],
      "Effect": "Allow",
      "Resource": [
        "arn:aws:s3:::awsexamplebucket/*",
        "arn:aws:s3:::awsexamplebucket"
      ]
    }
  ]
}

4.取得儲存貯體角色的 Amazon Resource Name (ARN)。稍後的步驟需要該角色的 ARN。

建立叢集角色

從 Amazon Redshift 叢集的帳戶中,建立另一個具有擔任該儲存貯體角色權限的 IAM 角色:

1.    從 Amazon Redshift 叢集的帳戶中,開啟 IAM 主控台

2.    建立 IAM 角色。建立此角色時,請選取下列項目:

選取受信任實體的類型中,選擇 AWS 服務

選擇將使用此角色的服務中,選擇 Redshift

選取使用案例中,選擇 Redshift - Customizable (Redshift - 可自訂)。

3.    建立 IAM 角色後,將下列政策附加到該角色:

重要:arn:aws:iam::123456789012:role/Bucket_Role 取代為您建立的儲存貯體角色 ARN。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "Stmt1234537501110",
      "Action": [
        "sts:AssumeRole"
      ],
      "Effect": "Allow",
      "Resource": "arn:aws:iam::123456789012:role/Bucket_Role"
    }
  ]
}

4.     取得叢集角色的 ARN。稍後的步驟需要該角色的 ARN。

更新儲存貯體角色以建立與叢集角色的信任關係

1.    從 S3 儲存貯體的帳戶中,開啟 IAM 主控台

2.    在導覽窗格中,選擇 角色

3.    從角色清單中,開啟您建立的儲存貯體角色。

4.    選擇 Trust relationships (信任關係) 索引標籤。

5.    選擇 Edit trust relationship (編輯信任關係)。

6.    在政策文件中,將現有的政策取代為以下內容:

重要:arn:aws:iam::012345678901:role/Cluster_Role 取代為您建立的叢集角色 ARN。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::012345678901:role/Cluster_Role"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

7.    選擇 Update Trust Policy (更新信任政策)。

從 Amazon Redshift 叢集中,使用叢集角色和儲存貯體角色執行上傳操作。

1.    連接到 Amazon Redshift 叢集

2.    使用您建立的兩個 IAM 角色執行 UNLOAD 命令,與以下類似:

重要:arn:aws:iam::012345678901:role/Cluster_Role 取代為叢集角色的 ARN。接著,將 arn:aws:iam::123456789012:role/Bucket_Role 取代為儲存貯體角色的 ARN。

unload ('select * from TABLE_NAME')
to 's3://awsexamplebucket'
iam_role 'arn:aws:iam::012345678901:role/Cluster_Role,arn:aws:iam::123456789012:role/Bucket_Role';

執行 UNLOAD 命令之後,資料檔案的擁有者與這些檔案存放所在的儲存貯體屬於相同帳戶。


相關資訊

UNLOAD 範例

AWS 官方
AWS 官方已更新 1 年前