Redshift から別アカウントの S3 に UNLOAD しつつ、VPCEポリシーで S3 へのアクセスを制限する - ablog の AssumeRole 版を Amazon Redshift 内の別のアカウントからデータをコピーまたはアンロードする の通り試してみた。クロスアカウント Amazon Redshift データファイルからの S3 Access Denied エラーを回避する のことを考えると、AssumeRole 版のほうが楽そう。
UNLOAD 先 S3 バケットのある AWS アカウント(234567890123)
- [IAMロール]RedshiftCopyUnloadRole
- アクセス権限: RedshiftCopyUnloadPolicy
- 信頼関係
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::123456789012:root" }, "Action": "sts:AssumeRole" } ] }
- [IAMポリシー]RedshiftCopyUnloadPolicy
{ "Version": "2012-10-17", "Statement": [ { "Sid": "Redshift", "Effect": "Allow", "Action": [ "s3:PutObject", "s3:Get*", "s3:List*" ], "Resource": [ "arn:aws:s3:::redshift-copy-unload", "arn:aws:s3:::redshift-copy-unload/*" ] } ] }
Redshift クラスターのある AWS アカウント(123456789012)
- IAMロール "RedshiftCopyUnloadCrossAccountRole" を Redshift クラスターにアタッチ。
- [IAMロール]RedshiftCopyUnloadCrossAccountRole
- アクセス権限: RedshiftCopyUnloadCrossAccountPolicy
- 信頼関係
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "redshift.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }
- [IAMポリシー]RedshiftCopyUnloadCrossAccountPolicy
{ "Version": "2012-10-17", "Statement": [ { "Sid": "RedshiftCopyUnloadCrossAccountPolicy", "Effect": "Allow", "Action": "sts:AssumeRole", "Resource": "arn:aws:iam::234567890123:role/RedshiftCopyUnloadRole" } ] }
クロスアカウントで UNLOAD する
- Redshift クラスターに接続する。
psql "host=redshift-cluster-1.******.ap-northeast-1.redshift.amazonaws.com user=awsuser dbname=dev port=5439"
- Redshift クラスターにテーブルを作成して、データを Copy する。
CREATE TABLE customer ( c_custkey INTEGER NOT NULL, c_name VARCHAR(25) NOT NULL, c_address VARCHAR(25) NOT NULL, c_city VARCHAR(10) NOT NULL, c_nation VARCHAR(15) NOT NULL, c_region VARCHAR(12) NOT NULL, c_phone VARCHAR(15) NOT NULL, c_mktsegment VARCHAR(10) NOT NULL ); copy customer from 's3://awssampledbuswest2/ssbgz/customer' iam_role 'arn:aws:iam::123456789012:role/MyRedshiftRole' gzip compupdate off region 'us-west-2';
- 別アカウントの S3 バケットに UNLOAD する。
unload ('select * from customer') to 's3://redshift-copy-unload/' allowoverwrite iam_role 'arn:aws:iam::123456789012:role/RedshiftCopyUnloadCrossAccountRole,arn:aws:iam::234567890123:role/RedshiftCopyUnloadRole';