0
0

More than 1 year has passed since last update.

DatabricksにおけるクロスアカウントS3アクセス(実践編)

Posted at

こちらを昨年書きましたが、より詳細な手順にまとめます。

全体像

以下では、AWSアカウントIDが<deployment-acct-id>であるDatabricksをデプロイしたAWSアカウントAと、AWSアカウントIDが<bucket-owner-acct-id>であるアクセス先のS3バケットがあるAWSアカウントBを考えます。

Screenshot 2023-01-19 at 15.09.17.png

この作業では、以下のロールARN、インスタンスプロファイルのARNを使用します。

  • arn:aws:iam::<deployment-acct-id>:role/deployment-acct-cross-account-s3-role
  • arn:aws:iam::<deployment-acct-id>:instance-profile/deployment-acct-cross-account-s3-role
  • arn:aws:iam::<bucket-owner-acct-id>:role/bucket-owner-acct-s3-access-role

DatabricksがデプロイされているAWSアカウントでの作業(1回目)

アクセス先S3があるAWSアカウントにアクセスするIAMロールの作成

  1. DatabricksがデプロイされているAWSアカウントでAWSマネジメントコンソールにログインします。
  2. IAM > ロールに移動し、ロールを作成をクリックします。
  3. 信頼されたエンティティタイプではAWSのサービス一般的なユースケースEC2を選択し、次へをクリックします。
    Screenshot 2023-01-19 at 13.45.08.png
  4. ポリシーはあとで設定するので、ロール名を付けてロールを作成します。ここではdeployment-acct-cross-account-s3-roleというロールとしています。
    Screenshot 2023-01-19 at 13.58.34.png
  5. ロールdeployment-acct-cross-account-s3-roleのARNをメモしておきます。

アクセス先S3があるAWSアカウントでの作業

S3バケットの作成

  1. アクセス先S3があるAWSアカウントでAWSマネジメントコンソールにログインします。
  2. S3バケットが存在しない場合には作成します。ここではty-databricks-cross-account-bucketというバケットを作成します。

S3にアクセスするロールの作成

  1. IAM > ロールに移動し、ロールを作成をクリックします。

  2. 信頼されたエンティティタイプではAWSのサービス一般的なユースケースEC2を選択し、次へをクリックします。

  3. ポリシーはあとで設定するので、ロール名を付けてロールを作成します。ここではbucket-owner-acct-s3-access-roleというロールとしています。
    Screenshot 2023-01-19 at 14.02.38.jpeg

  4. 作成したbucket-owner-acct-s3-access-roleロールにアクセスし、信頼関係を開き、信頼ポリシーを編集をクリックします。
    Screenshot 2023-01-19 at 14.03.41.jpeg

  5. 以下の信頼ポリシーを入力します。これによって、DatabricksをデプロイしたAWSアカウントAのロールdeployment-acct-cross-account-s3-roleがこのロールに対してAssumeRoleアクションを実行できるようになります。

    JSON
    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Principal": {
                    "AWS": "arn:aws:iam::<deployment-acct-id>:role/deployment-acct-cross-account-s3-role"
                },
                "Action": "sts:AssumeRole"
            }
        ]
    }
    

S3のバケットポリシーの設定

上のロールによるS3へのアクセスを許可します。

  1. S3バケットty-databricks-cross-account-bucketにアクセスし、アクセス許可を開きます。

  2. バケットポリシーを編集します。

  3. 以下の内容を入力して保存します。これによって、ロールbucket-owner-acct-s3-access-roleがこのS3バケットを操作できるようになります。

    JSON
    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Principal": {
                    "AWS": "arn:aws:iam::<bucket-owner-acct-id>:role/bucket-owner-acct-s3-access-role"
                },
                "Action": [
                    "s3:GetBucketLocation",
                    "s3:ListBucket"
                ],
                "Resource": "arn:aws:s3:::ty-databricks-cross-account-bucket"
            },
            {
                "Effect": "Allow",
                "Principal": {
                    "AWS": "arn:aws:iam::<bucket-owner-acct-id>:role/bucket-owner-acct-s3-access-role"
                },
                "Action": [
                    "s3:PutObject",
                    "s3:PutObjectAcl",
                    "s3:GetObject",
                    "s3:DeleteObject"
                ],
                "Resource": "arn:aws:s3:::ty-databricks-cross-account-bucket/*"
            }
        ]
    }
    

DatabricksがデプロイされているAWSアカウントでの作業(2回目)

アクセス先S3があるAWSアカウントにアクセスするIAMロールのポリシーの更新

  1. DatabricksがデプロイされているAWSアカウントでAWSマネジメントコンソールにログインします。

  2. IAM > ロールに移動し、ロールdeployment-acct-cross-account-s3-roleにアクセスします。

  3. 許可を追加インラインポリシーを作成をクリックします。
    Screenshot 2023-01-19 at 14.20.07.png

  4. JSONを開き、以下の内容を入力します。

    JSON
    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Sid": "Stmt1487884001000",
          "Effect": "Allow",
          "Action": [
            "sts:AssumeRole"
          ],
          "Resource": [
            "arn:aws:iam::<bucket-owner-acct-id>:role/bucket-owner-acct-s3-access-role"
          ]
        }
      ]
    }
    
  5. 名前をつけてポリシーを作成します。ここでは、deployment-acct-cross-account-s3-policyというポリシーにしています。これによって、ロールdeployment-acct-cross-account-s3-roleがS3のあるAWSアカウントのロールbucket-owner-acct-s3-access-roleに対して、AssumeRoleアクションを実行できるようになります。

クロスアカウントIAMポリシーの更新

最後に、Databricksサービスからロールdeployment-acct-cross-account-s3-roleを利用できるようにします。

  1. Databricksデプロイ時に作成したクロスアカウントIAMロールにアクセスします。

  2. ポリシーを編集します。以下のブロックをポリシーに追加します。これによって、Databricksからロールdeployment-acct-cross-account-s3-roleにアクセスできるようになります。

    JSON
    {
        "Effect": "Allow",
        "Action": "iam:PassRole",
        "Resource": "arn:aws:iam::<deployment-acct-id>:role/deployment-acct-cross-account-s3-role"
     }
    

インスタンスプロファイルARNの取得

ロールdeployment-acct-cross-account-s3-roleにアクセスして、インスタンスプロファイルの ARNをメモしておきます。

Databricksでの作業

インスタンスプロファイルの作成

  1. Databricksワークスペースにログインし、管理コンソールにアクセスします。

  2. Instance Profilesにアクセスし、+インスタンスプロファイルを追加をクリックします。
    Screenshot 2023-01-19 at 14.33.29.png

  3. インスタンスプロファイルARNに、ロールdeployment-acct-cross-account-s3-roleのインスタンスプロファイルARNを入力して、追加をクリックします。
    Screenshot 2023-01-19 at 14.34.58.png

    注意
    インスタンスプロファイルを追加する際にエラーが発生する場合、上述のIAMの設定が適切に行われていない可能性があります。IAMのポリシーを確認してください。

  4. インスタンスプロファイルが追加されました。
    Screenshot 2023-01-19 at 14.36.44.png

クラスターの設定

上のステップで追加したインスタンスプロファイルとSpark設定を行います。

  1. クラスターにアクセスし、編集をクリックします。

  2. インスタンスプロファイルで上のステップで追加したインスタンスプロファイルを選択します。
    Screenshot 2023-01-19 at 14.39.17.png

  3. 高度なオプションを展開して、Sparkにアクセスします。

  4. 以下の行を追加します。

    fs.s3a.assumed.role.arn arn:aws:iam::<bucket-owner-acct-id>:role/bucket-owner-acct-s3-access-role
    fs.s3a.aws.credentials.provider org.apache.hadoop.fs.s3a.auth.AssumedRoleCredentialProvider
    
  5. 確認をクリックして編集を終了します。

  6. クラスターを起動します。

動作確認

一旦ここで接続を確認します。

  1. アクセス先のS3バケットが空の場合は、適当なファイルをアップロードしておきます。

  2. 上で設定したクラスターにノートブックをアタッチします。

  3. 以下のセルを実行します。

    Python
    display(dbutils.fs.ls("s3a://ty-databricks-cross-account-bucket"))
    
  4. 以下のようにファイル一覧が表示されれば成功です。
    Screenshot 2023-01-19 at 14.50.05.png

マウントポイントの作成

上の通り、直パスでもアクセスは可能ですが、マウントポイントを作成することも可能です。

Python
# S3バケットのURL
bucket_url = "s3a://ty-databricks-cross-account-bucket"
# マウントポイント名
mount_point_name = "cross-account-bucket"
# S3バケットのAWSアカウントにあるS3アクセス用IAMロールのARN
s3_access_arn = "arn:aws:iam::<bucket-owner-acct-id>:role/bucket-owner-acct-s3-access-role"
Python
dbutils.fs.mount(bucket_url, f"/mnt/{mount_point_name}",
  extra_configs = {
    "fs.s3a.credentialsType": "AssumeRole",
    "fs.s3a.stsAssumeRole.arn": s3_access_arn,
    "fs.s3a.canned.acl": "BucketOwnerFullControl",
    "fs.s3a.acl.default": "BucketOwnerFullControl"
  }
)

これで、/mnt/cross-account-bucket/というマウントポイント経由でクロスアカウントのS3バケットにアクセスすることができるようになります。このマウントポイントは明示的にアンマウントしない限り永続化されます。

Python
display(dbutils.fs.ls("/mnt/cross-account-bucket/"))

Screenshot 2023-01-19 at 14.53.38.png

参考資料

Databricks 無料トライアル

Databricks 無料トライアル

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0