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

最終更新日: 2019 年 07 月 29 日

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

簡単な説明

デフォルトでは、S3 オブジェクトの所有者はそれをアップロードした AWS アカウントです。これは、バケット所有者が別のアカウントである場合にも当てはまります。UNLOAD コマンドからの 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 クラスターのアカウントから、バケットロールを引き受けるアクセス許可のある別の 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 の例」 

この記事はお役に立ちましたか?

改善できることはありますか?


さらにサポートが必要な場合