AWS Glue と Amazon S3 に対する Amazon Redshift Spectrum のクロスアカウントアクセス権限を作成する方法を教えてください。

所要時間3分
0

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.    「信頼できるエンティティのタイプを選択」から、「AWS サービス」を選択します。

4.    **[Redshift]**を選択します。

5.    [ユースケースの選択] で **[Redshift - カスタマイズ可能]**を選択します。

6.    [次へ: 許可][次へ: タグ]、それに続いて **[次へ: 確認]**を選択します。ポリシーやタグを追加する必要はありません。

7.    [ロール名] を入力して、**[ロールの作成]**を選択します。以下の例では、このロールを redshift_role1と呼びます。

8.    edshift_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.    **[ポリシーの確認]**を選択します。

5.    ポリシーの名前を入力し、**[ポリシーの作成]**を選択します。

6.    ナビゲーションペインで [ロール]、**[ロールを作成]**を選択します。

7.    [信頼されたエンティティの種類を選択] では、[別の AWS アカウント] を選択します。

8.    [アカウント ID] では、Amazon Redshift を使用しているアカウントの ID を入力します。詳細については、「AWS アカウント ID の検出結果」を参照してください。

9.    **[次へ: 許可]**を選択します。

10.    ポリシーの一覧で、作成したポリシーの名前の隣りにあるチェックボックスをオンにします。

11.    [次へ: タグ]、**[次へ: 確認]**を選択します。タグを追加する必要はありません。

12.    [ロール名] を入力して、**[ロールの作成]**を選択します。次の例では、これを glue_s3_role2と呼びます。

13.    ナビゲーションペインで、**[ロール]**を選択します。

14.    作成したロールの名前を選択し、[信頼関係] タブをクリックします。

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.    **[信頼ポリシーの更新]**を選択します。

アカウント 1: Amazon Redshift で作成したロールの権限を編集する

1.    IAM コンソールを開きます。

2.    ナビゲーションペインから [ロール] を選択し、先に作成した最初のロール (redshift\ _role1) の名前を選択します。

3.    [許可] セクションで、[インラインポリシーを追加] を選択します。

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.    **[ポリシーの確認]**を選択します。

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 テーブルの名前に置き換えます。

関連情報

Amazon Redshift における IAM ロールの連鎖

Amazon Redshift Spectrum 用の IAM ポリシー

AWS公式
AWS公式更新しました 2年前
コメントはありません