0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

DatabricksでAssumeRoleポリシーを用いてクロスアカウントS3バケットをマウントする

Last updated at Posted at 2022-02-03

2023/1/19追記 より詳細な記事を書きました。

DatabricksがデプロイされているAWSアカウントと、データが格納されているS3のAWSアカウントが異なるケースというのはあり得る話です。

クロスアカウントバケットポリシーでアクセスを許可することも可能ですが、最近AWS GuardDutyのアラートポリシーが追加され、アラートを回避するにはAssumeRoleを用いたマウントポイントの作成をお勧めしています。

AWS GuardDutyのアラート及び対応策に関して

AssumeRoleポリシーを用いたクロスアカウントアクセスに関して

本書では、実際にAssumeRoleを用いてどのようにクロスアカウントのマウントポイントを作成するのかを説明します。

全体像

Screen Shot 2022-02-03 at 13.10.06.png

  • AWSアカウントA: Databricks環境をデプロイしているAWSアカウント
  • AWSアカウントB: S3が存在しているAWSアカウント
  • IAMロール(1): AWSアカウントAで作成するIAMロール。Databricksにアタッチするインスタンスプロファイルとなります。
  • IAMロール(2): AWSアカウントBで作成するIAMロール。S3にアクセスする権限を付与します。

Databricks環境のAWSアカウントAWSアカウントAでの設定:S3にアクセスするロールIAMロール(1)の作成

  1. IAMに移動し、ロールを作成します。
  2. 信頼されたエンティティの種類を選択ではAWSサービスユースケースの選択ではEC2を選択します。
  3. ポリシーは後で追加するので、一旦ロール名をつけて**IAMロール(1)**を作成します。

S3のAWSアカウントAWSアカウントBでの設定:S3にアクセスするロールIAMロール(2)の作成

データを格納しているS3のAWSアカウントでAWSコンソールにログインします。

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

  2. 信頼されたエンティティの種類を選択ではAWSサービスユースケースの選択ではEC2を選択します。

  3. ポリシーの作成でJSONを開き、以下を貼り付けます。

    JSON

{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:ListBucket",
"s3:PutObject",
"s3:GetObject",
"s3:DeleteObject",
"s3:PutObjectAcl"
],
"Resource": [
"arn:aws:s3:::",
"arn:aws:s3:::/*"
]
}
]
}
```

  1. **IAMロール(2)**を作成します。

  2. IAMロール(2)の信頼関係を開き、**IAMロール(1)**への信頼関係を設定します。

    JSON

{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam:::role/"
},
"Action": "sts:AssumeRole",
"Condition": {}
}
]
}
```

以下のようになっていることを確認します。

Screen Shot 2022-02-03 at 13.35.33.JPG

Databricks環境のAWSアカウントAWSアカウントAでの設定:S3にアクセスするロールIAMロール(1)の設定

IAMロール(1)のアクセス権を開き、以下のポリシーを追加します。これで、**IAMロール(1)IAMロール(2)**のロールを担うことができるようになります。

JSON
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Stmt1487884001000",
            "Effect": "Allow",
            "Action": [
                "sts:AssumeRole"
            ],
            "Resource": [
                "arn:aws:iam::<AWSアカウントB>:role/<IAMロール(2)>"
            ]
        }
    ]
}

**IAMロール(1)**のインスタンスプロファイルARNをコピーしておきます。
Screen Shot 2022-02-03 at 13.26.40.png

IAMロール(1)を用いてインスタンスプロファイルを作成する

  1. DatabricksのAdmin Consoleにアクセスします。
  2. Instance Profileタブを開きます。
  3. Add Instance Profileをクリックします。ダイアログが表示されます。
  4. 上でコピーしたインスタンスプロファイルARNを貼り付けます。
  5. Addをクリックします。

マウントポイントを作成する

上で作成したインスタンスプロファイルをアタッチしてクラスターを作成・起動します。
Screen Shot 2022-02-03 at 13.30.31.png

以下のコマンドを実行してマウントポイントを作成します。

Python
dbutils.fs.mount("s3a://<S3バケット名>", "/mnt/<マウントポイント名>",
extraConfigs = Map(
  "fs.s3a.credentialsType" -> "AssumeRole",
  "fs.s3a.stsAssumeRole.arn" -> "arn:aws:iam::<AWSアカウントB>:role/<IAMロール(2)>",
  "fs.s3a.acl.default" -> "BucketOwnerFullControl"
)
)

アクセスできることを確認します。

Python
dbutils.fs.ls("/mnt/<マウントポイント>")

Screen Shot 2022-02-03 at 13.33.19.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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?