Amazon S3 バケットに、別のアカウントの Amazon Redshift クラスターから UNLOAD コマンドを使用して作成されたデータファイルがあります。それらのファイルにアクセスできない理由は何ですか?

所要時間2分
0

Amazon Simple Storage Service (Amazon S3) バケットに、別の AWS アカウントで Amazon Redshift クラスターから UNLOAD コマンドを使用して作成されたデータファイルがあります。しかし、自分のアカウントからこれらのファイルにアクセスしようとすると、403 Access Denied エラーが出ます。どうすれば解決できますか?

簡単な説明

デフォルトでは、S3 オブジェクトの所有者はそれをアップロードした AWS アカウントになります。これは、バケット所有者が別のアカウントである場合にも当てはまります。そのため、Amazon Redshift データファイルが別のアカウントによってバケットに入れられた場合、それらのファイルに対するデフォルトのアクセス権限はありません。

データファイルへのアクセスを取得するには、クロスアカウントのアクセス許可付きの AWS Identity and Access Management (IAM) ロールで UNLOAD コマンドを再度実行する必要があります。以下の手順を実行し、バケットへのクロスアカウントアクセス許可のある Amazon Redshift クラスターを設定します。

1.    S3 バケットのアカウントからバケットへのアクセス許可のある IAM ロールを作成するこれがバケットロールです。

2.    Amazon Redshift クラスターのアカウントから、バケットロールを引き受けるアクセス許可付きのもう 1 つの IAM ロールを作成します。これはクラスターロールです。

3.    バケットロールを更新してバケットアクセス許可を付与し、クラスターロールとの信頼関係を作成します。

4.    Amazon Redshift クラスターから、クラスターロールとバケットロールを使用して UNLOAD コマンドを実行します。

重要: この解決方法は、Amazon Redshift クラスターまたは AWS Key Management Service (AWS KMS) でサーバー側の暗号化を使用する S3 バケットには適用されません。

解決方法

バケットロールを作成する

S3 バケットのアカウントから、バケットへの許可を持つ IAM ロールを作成します。

1.    S3 バケットのアカウントから、IAM コンソールを開きます。

2.    IAM ロールを作成します。ロールを作成するときに、次の内容を選択します。

[信頼できるエンティティの種類の選択] では、[AWS のサービス] を選択します。

[Choose the service that will use this role] で、[Redshift] を選択します。

[Select your use case] で [Redshift - Customizable] を選択します。

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 リソースネーム (ARN) を取得します。後のステップでロールの ARN が必要になります。

クラスターロールを作成する

Amazon Redshift クラスターのアカウントから、バケットロールを引き受ける許可があるもう 1 つの IAM ロールを作成します。

1.    Amazon Redshift クラスターのアカウントから、IAM コンソールを開きます。

2.    IAM ロールを作成します。ロールを作成するときに、次の内容を選択します。

[信頼できるエンティティの種類の選択] では、[AWS のサービス] を選択します。

[Choose the service that will use this role] で、[Redshift] を選択します。

[Select your use case] で [Redshift - Customizable] を選択します。

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.    ナビゲーションペインで [Roles] を選択します。

3.    ロールのリストから、作成したバケットロールを開きます。

4.    [Trust relationships] タブを選択します。

5.    信頼関係の編集を選択します。

6.    [Policy Document] で、既存のポリシーを以下と置き換えます。

重要: 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年前