AWS Glue と Amazon S3 に対する Amazon Redshift Spectrum のアカウント間アクセスを作成するにはどうすればよいですか?
最終更新日: 2022 年 5 月 24 日
Amazon Redshift Spectrum を使用して、同じ AWS リージョン内で別の AWS アカウントに属す AWS Glue と Amazon Simple Storage Service (Amazon S3) にアクセスしたいと考えています。どうすればよいですか?
簡単な説明
Amazon Redshift Spectrum とは別のアカウントにある AWS リソースにアクセスするには、以下の手順を実行します。
1. アカウント 1 で、Amazon Redshift との信頼関係を持つ AWS Identity and Access Management (IAM) ロールを作成します。このロールは Amazon Redshift クラスターにアタッチする必要があります。
2. アカウント 2 で、AWS Glue と Amazon S3 の両方にアクセスできる別のロールを作成します。このロールは信頼関係を編集し、Amazon Redshift アカウントがこのロールを引き受けられるようにします。
3. アカウント 1 で、AWS Glue および Amazon S3 アカウントで作成されたロールを引き受けられるように、既存のロールの許可を編集します。
解決方法
アカウント 1: Amazon Redshift との信頼関係を持つ AWS Identity and Access Management (IAM) ロールを作成する
1. IAM コンソールを開きます。
2. ナビゲーションペインから [ロール] を選択し、[ロールの作成] を選択します。
3. [Select type of trusted entity] (信頼されたエンティティのタイプの選択) で、[AWS サービス] を選択します。
4. [Redshift] を選択します。
5. [ユースケースの選択] で [Redshift - Customizable] (Redshift - カスタマイズ可能) を選択します。
6. [Next: Permissions] (次へ: 許可)、[Next: Tags] (次へ: タグ)、それに続いて [Next: Review] (次へ: 確認) を選択します。ポリシーまたはタグを追加する必要はありません。
7. [Role name (ロール名)] を入力して、[Create role (ロールの作成)] をクリックします。以下の例では、このロールを「redshift_role1」と呼びます。
8. redshift_role1 を Amazon Redshift クラスターに関連付けます。この関連付けにより、クラスターは新しく作成したロールを引き受け、Amazon S3、Amazon Athena、および AWS Glue にアクセスできます。
アカウント 2: AWS Glue および Amazon S3 へのアクセス権を持つ別のロールを作成する
1. IAM コンソールを開きます。
2. [ポリシー] を選択し、[ポリシーの作成] を選択します。
3. [JSON] タブをクリックして、以下のような IAM ポリシーを入力します。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": [
"glue:BatchCreatePartition",
"glue:UpdateDatabase",
"glue:CreateTable",
"glue:DeleteDatabase",
"glue:GetTables",
"glue:GetPartitions",
"glue:BatchDeletePartition",
"glue:UpdateTable",
"glue:BatchGetPartition",
"glue:DeleteTable",
"glue:GetDatabases",
"glue:GetTable",
"glue:GetDatabase",
"glue:GetPartition",
"glue:CreateDatabase",
"glue:BatchDeleteTable",
"glue:CreatePartition",
"glue:DeletePartition",
"glue:UpdatePartition"
],
"Resource": "*"
},
{
"Sid": "VisualEditor1",
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:ListBucketMultipartUploads",
"s3:ListBucket",
"s3:GetBucketLocation",
"s3:ListMultipartUploadParts"
],
"Resource": [
"arn:aws:s3:::your_bucket",
"arn:aws:s3:::your_bucket/*"
]
},
{
"Sid": "VisualEditor2",
"Effect": "Allow",
"Action": [
"kms:Decrypt"
],
"Resource": [
"<KMS_KEY_ARN>"
]
}
]
}
your_bucket を、Amazon Redshift Spectrum でアクセスする S3 バケットの名前に置き換えます。KMS_KEY_ARN を、S3 バケットを暗号化する KMS キーの ARN に置き換えます。
注: S3 バケット内のファイルが暗号化されている場合は、Amazon Redshift に適切な許可を付与してください。
4. [Review policy] (ポリシーの確認) をクリックします。
5. ポリシーの名前を入力し、[ポリシーの作成] を選択します。
6. ナビゲーションペインで、[Roles]、[Create role] の順にクリックします。
7. [Select type of trusted entity] (信頼されたエンティティの種類を選択) で、[別の AWS アカウント] を選択します。
8. [Account ID] に、Amazon Redshift を使用しているアカウントの ID を入力します。詳細については、「AWS アカウント ID の確認方法」をご参照ください。
9. [Next: Permissions] (次: アクセス許可) を選択します。
10. ポリシーの一覧で、作成したポリシーの名前の隣りにあるチェックボックスをオンにします。
11. [Next: Tags] (次: タグ)、それに続いて [Next: Review] (次: レビュー) を選択します。タグを追加する必要はありません。
12. [Role name (ロール名)] を入力して、[Create role (ロールの作成)] をクリックします。次の例では、これを glue_s3_role2 と呼びます。
13. ナビゲーションペインで、[ロール] を選択します。
14. 作成したロール名を選択し、[Trust Relationships] タブをクリックします。
15. [信頼関係の編集] を選択します。
16. 既存のポリシーを削除し、次のようなポリシーで置き換えます。redshift_account1 を、Amazon Redshift を使用しているアカウントの ID に置き換えます。redshift_role1 を、作成した最初のロールの名前に置き換えます。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::redshift_account1:role/redshift_role1"
},
"Action": "sts:AssumeRole"
}
]
}
17. [Update Trust Policy] (信頼ポリシーの更新) を選択します。
アカウント 1: Amazon Redshift で作成したロールの許可を編集する
1. IAM コンソールを開きます。
2. ナビゲーションペインから [Roles] をクリックし、先に作成した最初のロール (redshift_role1) の名前を選択します。
3. [Permissions] (許可) セクションで、[Add inline policy] (インラインポリシーを追加) を選択します。
4. [JSON] タブを選択します。既存のポリシーを削除し、次のような IAM ポリシーを入力します。glue_s3_account2 を、AWS Glue および Amazon S3 を使用しているアカウントの ID に置き換えます。glue_s3_role2 を、作成した 2 番目のロールの名前に置き換えます。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Stmt1487639602000",
"Effect": "Allow",
"Action": [
"sts:AssumeRole"
],
"Resource": "arn:aws:iam::glue_s3_account2:role/glue_s3_role2"
}
]
}<br>
5. [Review policy] を選択します。
6. ポリシーの名前を入力し、[ポリシーの作成] を選択します。
7. Amazon Redshift クラスターに接続します。
8. 次の例に示すように、両方のアカウントで作成したロールを使用して、外部スキーマを作成します。
create external schema spectrum_schema
from data catalog
database 'your_db'
iam_role 'arn:aws:iam::redshift_account1:role/redshift_role1,arn:aws:iam::glue_s3_account2:role/glue_s3_role2'
次の値を置き換えます。
your_db: AWS Glue のデータベース名。
redshift_account1: Amazon Redshift アカウントの ID。
redshift_role1: Amazon Redshift アカウントで作成したロールの名前。
glue_s3_account2: AWS Glue と Amazon S3 アカウントの ID。
glue_s3_role2: AWS Glue と Amazon S3 のアカウントで作成したロールの名前。
これで、すべてのリソースが同じリージョンにある限り、redshift_account1 の Amazon Redshift クラスターから Amazon Redshift Spectrum を使用して、glue_s3_account2 の AWS Glue テーブルに対してクエリを実行できるようになりました。Redshift Spectrum は既存の AWS Glue テーブルにアクセスできるため、外部テーブルを再作成する必要はありません。
次の例のクエリは、外部スキーマで作成した AWS Glue テーブルの行数を返します。
select count(*) from spectrum_schema.glue_table;
注: spectrum_schema と glue_table を、スキーマと AWS Glue テーブルの名前に置き換えます。