GlueのPython ShellでクロスアカウントのS3ファイルコピーをしてみた

2019.06.05

Glueで別アカウントのS3ファイルって触れる?

こんにちは。DI部の大高です。

先日、Glueで別アカウントのS3ファイルを触れるのかどうかという話が開発チーム内であり、気になったので実際に試してみました。

やりたいこと

AWSのアカウントAのGlueから、アカウントBのS3バケット内のファイルを取得して、アカウントAのS3バケットにコピーしたいと思います。

想定では、単純にアカウントAのGlueジョブが利用しているロールからのアクセスを、アカウントBのS3バケットのバケットポリシーで許可してあげればよい想定です。

試してみる

まずは以下の記事を参考に、アカウントAの環境でGlue用のIAMロールやPython Shellのジョブをササっと作成します。

AWS Glue 実践入門 環境準備編(1):IAM権限周りの設定について

AWS Glue の新しいジョブタイプ『Python Shell』を実際に試してみました

Glue用のIAMロールには以下のようにポリシーを設定し、ロール名はAWSGlueServiceRole-cm-ootaka.daisukeとしました。

このIAMロールをアタッチしたGlueのPython Shellのジョブを以下のようなコードで作成します。単純にサンプルファイルをコピーするだけのものです。

import boto3

source_bucket = 'account-b-bucket'
source_key = 'glue/Sample.csv.gz'
dist_bucket = 'account-a-bucket'
dist_key = 'glue/Sample.csv.gz'

s3 = boto3.client('s3')
s3.copy_object(Bucket=dist_bucket, Key=dist_key, CopySource={'Bucket': source_bucket, 'Key': source_key})

次に、アカウントBのS3バケットのバケットポリシーの設定です。以下のようにバケットポリシーを設定します。アカウントAのGlueのロールに対して、アカウントBのS3バケットに対するアクションの許可を与えています。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::999999999999:role/AWSGlueServiceRole-cm-ootaka.daisuke"
            },
            "Action": [
                "s3:GetObject",
                "s3:PutObject",
                "s3:PutObjectAcl"
            ],
            "Resource": [
                "arn:aws:s3:::account-b-bucket/*"
            ]
        }
    ]
}

設定が終わったら、早速Glueのジョブを実行してみます。実行すると、特に問題なくジョブが成功し、コピー先のS3バケットにもファイルがコピーされました! 想定通り問題なくアカウントBのS3バケットにアクセスできていますね。

まとめ

以上、GlueのPython ShellでクロスアカウントのS3ファイルコピーでした。

どなたかのお役に立てれば幸いです。それでは!