⛑️

GlueジョブからS3バケットへクロスアカウントデータ読み取り

2024/07/17に公開

issue

アカウントAのバケットに対して、アカウントBのGlueからデータを取得したい。
※以降は特定環境下での一例になります。

S3バケットポリシーの設定(アカウントA)

  1. S3バケットポリシーの設定: アカウントAにあるS3バケットにポリシーを設定して、アカウントBのIAMロールがそのバケットへのアクセス権を持つようにします。このポリシーは、アカウントBのIAMロールのARNを指定し、必要なアクション(s3:GetObjectなど)を許可するものです。

    例えば、次のようなポリシーが考えられます:

   {
     "Version": "yyyy-MM-dd",
     "Statement": [
       {
         "Effect": "Allow",
         "Principal": {
           "AWS": "arn:aws:iam::<アカウントBのID>:role/<GlueのIAMロール名>"
         },
         "Action": [
           "s3:GetObject",
           "s3:ListBucket"
         ],
         "Resource": [
           "arn:aws:s3:::<バケット名>/*",
           "arn:aws:s3:::<バケット名>"
         ]
       }
     ]
   }

IAMロールの設定(アカウントB)

  1. IAMロールの作成: アカウントBでAWS Glueジョブを実行するためのIAMロールを作成します。このロールには、アカウントAのS3バケットへのアクセス権を与えるポリシーがアタッチされている必要があります。
{
  "Version": "yyyy-MM-dd",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:GetObject",
        "s3:ListBucket"
      ],
      "Resource": [
        "arn:aws:s3:::<アカウントAのバケット名>",
        "arn:aws:s3:::<アカウントAのバケット名>/*"
      ]
    },
    {
      "Effect": "Allow",
      "Action": [
        "glue:*"
      ],
      "Resource": "*"
    },
    {
      "Effect": "Allow",
      "Action": [
        "logs:CreateLogGroup",
        "logs:CreateLogStream",
        "logs:PutLogEvents"
      ],
      "Resource": "arn:aws:logs:*:*:*"
    }
  ]
}
  1. 信頼関係の設定: アカウントBのIAMロールに、アカウントAのS3バケットからアクセスを受け入れるための信頼ポリシーを設定します。これは、Glueサービスがそのロールを使用できるようにするためです。

    例えば、次のような信頼ポリシーが考えられます:

   {
     "Version": "yyyy-MM-dd",
     "Statement": [
       {
         "Effect": "Allow",
         "Principal": {
           "Service": "glue.amazonaws.com"
         },
         "Action": "sts:AssumeRole"
       }
     ]
   }

AWS Glueジョブの設定(アカウントB)

  1. AWS Glueジョブの設定: アカウントBでAWS Glueジョブを作成または更新し、ステップ2で作成したIAMロールを指定します。このロールを使用して、ジョブはアカウントAのS3バケットへのアクセス権を持ちます。

テストと確認

  1. アクセスのテスト: 設定が完了したら、アカウントBからAWS Glueジョブを実行して、アカウントAのS3バケットへのアクセスが正しく機能するかテストします。

Discussion