ablog

不器用で落着きのない技術者のメモ

Redshift から別アカウントの S3 バケットに AssumeRole で UNLOAD する

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 する

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';
unload ('select * from customer')
to 's3://redshift-copy-unload/'
allowoverwrite
iam_role 'arn:aws:iam::123456789012:role/RedshiftCopyUnloadCrossAccountRole,arn:aws:iam::234567890123:role/RedshiftCopyUnloadRole';