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_schemaglue_table を、スキーマと AWS Glue テーブルの名前に置き換えます。


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


請求に関するサポートまたは技術サポートが必要ですか?