⛑️
GlueジョブからS3バケットへクロスアカウントデータ読み取り
issue
アカウントAのバケットに対して、アカウントBのGlueからデータを取得したい。
※以降は特定環境下での一例になります。
S3バケットポリシーの設定(アカウントA)
-
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)
- 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:*:*:*"
}
]
}
-
信頼関係の設定: アカウントBのIAMロールに、アカウントAのS3バケットからアクセスを受け入れるための信頼ポリシーを設定します。これは、Glueサービスがそのロールを使用できるようにするためです。
例えば、次のような信頼ポリシーが考えられます:
{
"Version": "yyyy-MM-dd",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "glue.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
AWS Glueジョブの設定(アカウントB)
- AWS Glueジョブの設定: アカウントBでAWS Glueジョブを作成または更新し、ステップ2で作成したIAMロールを指定します。このロールを使用して、ジョブはアカウントAのS3バケットへのアクセス権を持ちます。
テストと確認
- アクセスのテスト: 設定が完了したら、アカウントBからAWS Glueジョブを実行して、アカウントAのS3バケットへのアクセスが正しく機能するかテストします。
Discussion