Amazon Redshift から別の AWS アカウントにある Amazon Simple Storage Service (Amazon S3) バケットへの、データのコピーまたはアンロードを行いたいです。しかし、他のアカウントで AWS Identity and Access Management (IAM) ロールを引き受けることができません。クロスアカウントアクセスを設定する必要があります。
簡単な説明
別のアカウントにある Amazon S3 リソースにアクセスするには、次の手順を実行します。
- Amazon S3 アカウント (RoleA) に IAM ロールを作成します。
- Amazon Redshift アカウントに、RoleA を引き受けるためのアクセス許可を持つ IAM ロール (RoleB) を作成します。
- RoleA と RoleB の間のクロスアカウントアクセスをテストします。
注: 上記のステップは、Redshift Serverless および Redshift がプロビジョニングしたデータウェアハウスに適用され、すべてのデータ形式で機能します。ただし、特定のデータ形式では、COPY コマンドと UNLOAD コマンドの構文を変更する必要がある場合があります。たとえば、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 リージョンにあることを前提としています。クラスターとバケットが別々のリージョンにある場合は、COPY または UNLOAD コマンドに REGION パラメータを追加する必要があります。
Amazon S3 (RoleA) を使用するアカウントに IAM ロールを作成します。
次の手順を実行します。
- IAM コンソールを開きます。
- [ポリシー] を選択し、**[ポリシーの作成]**を選択します。
- [JSON] タブを選択し、以下のカスタムポリシーを入力します。
注: S3 バケットが AWS Key Management Service (AWS 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 キー暗号化を使用する場合は、KMS_KEY_ARN_A_Used_for_S3_encryption を AWS KMS キーの ARN に置き換えます。
- **[ポリシーの確認]**を選択します。
- ポリシーの名前を入力し、**[ポリシーの作成]**を選択します。
- ナビゲーションペインで、[ロール] を選択します。
- [ロールの作成] を選択します。
- 信頼されたエンティティロールには、[別の AWS アカウント] を選択します。
- Amazon Redshift を使用するアカウントのアカウント ID を入力します。
- [次へ: アクセス許可] を選択し、ポリシーを選択します。
- (オプション)[次へ: タグ] を選択し、タグを追加します。
- [次へ: レビュー] を選択します。
- ロール名を入力します。
- [ロールの作成] を選択します。
Amazon Redshift アカウントに、RoleA を引き受けるアクセス許可を持つ IAM ロール (RoleB) を作成します
次の手順を実行します。
- IAM コンソールを開きます。
- [ポリシー] を選択し、**[ポリシーの作成]**を選択します。
- [JSON] タブを選択し、以下のカスタムポリシーを入力します。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "CrossAccountPolicy",
"Effect": "Allow",
"Action": "sts:AssumeRole",
"Resource": "AmazonS3AccountRoleARN"
}
]
}
注: AmazonS3AccountRoleARN は RoleA の ARN (arn:aws:iam::Amazon_S3_Account_ID:role/RoleA) に置き換えます。
- **[ポリシーの確認]**を選択します。
- ポリシーの名前を入力し、**[ポリシーの作成]**を選択します。
- ナビゲーションペインで、[ロール] を選択します。
- [ロールの作成] を選択します。
- 信頼できるエンティティタイプには、[AWS サービス] を選択します。
- **[Redshift]**を選択します。
- [Redshift - カスタマイズ可能] を選択します。
- [次へ: アクセス許可] を選択し、ポリシーを選択します。
- (オプション)[次へ: タグ] を選択し、タグを追加します。
- [次へ: レビュー] を選択します。
- ロール名を入力します。
- [ロールの作成] を選択します。
- RoleB を Amazon Redshift クラスターにアタッチします。
プロビジョニングされた Redshift クラスターの場合は、「IAM ロールをクラスターに関連付ける」を参照してください。
または、
Redshift Serverless の場合は、「Amazon Redshift Serverless にアクセス許可を付与する」を参照してください。
注: Amazon Redshift で IAM ロールをチェーンすると、Amazon Redshift クラスターが RoleB を引き受けた後に、RoleB が RoleA を引き受けます。
S3 バケットと Amazon Redshift 間のクロスアカウントアクセスをテストする
次の手順を実行します。
-
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;
-
クロスアカウントアクセスが許可されていることを確認するには、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 キー ID の ARN
関連情報
Amazon S3 バケットにあるオブジェクトに対するクロスアカウントアクセスを付与する方法を教えてください
別の AWS アカウントから S3 オブジェクトをコピーする方法を教えてください
COPY、UNLOAD、CREATE LIBRARY 用の IAM アクセス許可