Databricks構築時におけるクレディンシャル設定とS3バケット設定の作成手順(AWS編)

こちらの記事で言及している、Databricks環境構築手順時に必要となる以下の情報の作成手順をカバーする記事です。

https://qiita.com/taka_yayoi/items/1ca54463469df05dd3ee#%E4%BA%8B%E5%89%8D%E6%BA%96%E5%82%99

こちらの記事でもカバーしていますが、画面構成が変化しているので改めてウォークスルーしました。

https://qiita.com/taka_yayoi/items/f63cc77afe4eef58d4e0

# クレディンシャル設定の作成

クレディンシャル設定(credential configuration)では、DatabricksがあなたのAWSアカウントでクラスターを起動するのに必要なアクセス権を持つ**クロスアカウントIAMロール**を作成し、それらの情報を入力します。

1. [アカウントコンソール](https://accounts.cloud.databricks.com/
)にアカウントオーナーとしてログインします。アカウントオーナーを作成していない場合には、[こちら](https://qiita.com/taka_yayoi/items/c5b8704bbf1d0e16651c)の[アカウントコンソールへのアクセス]([https://qiita.com/taka_yayoi/items/c5b8704bbf1d0e16651c#%E3%82%A2%E3%82%AB%E3%82%A6%E3%83%B3%E3%83%88%E3%82%B3%E3%83%B3%E3%82%BD%E3%83%BC%E3%83%AB%E3%81%B8%E3%81%AE%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9)までの作業を進めてアカウントオーナーを作成してください。

1. サイドメニューの**Cloud Resources**をクリックします。
![Screen Shot 2022-05-20 at 8.07.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/d09ce20f-4d92-8c7e-4bfb-a31e63cccde2.png)
1. **Credential configuration**タブが選択されていることを確認して、**Add credential configuration**ボタンをクリックします。
1. ダイアログが表示されます。ここで**External ID**の値をコピーしておきます。
![Screen Shot 2022-05-20 at 8.08.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/551921c5-4a09-8ee5-1367-3e0435f07848.png)

## AWSマネジメントコンソールでの作業

1. [AWSのマネジメントコンソール](https://aws.amazon.com/jp/console/)に移動し、DatabricksをデプロイするAWSアカウントでログインします。
1. **IAM**に移動し、**ロール**にアクセスします。
1. **ロールの作成**をクリックします。
1. 信頼されたエンティティとして**別のAWSアカウント**を選択し、アカウントIDにDatabricks固有のID`414351767826`を入れます。外部IDにはAdd Credential Configurationダイアログでコピーした**External ID**を外部IDとして入力します。
![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f313136383838322f35656530633163652d333733382d616566392d613231382d6339396239316433336364392e706e67.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/203d893c-bf9a-b152-d60b-2bb215c858ed.png)
1. **次のステップ**をクリックします。
![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f313136383838322f31333934313161332d306137312d653063622d386535382d3236393461616361653332332e706e67.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/518a8eea-cb61-3679-508b-d77ed0c4abab.png)
1. **次のステップ**をクリックします。
![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f313136383838322f62333264393631312d316566632d336133312d663330652d6433646537346337613633362e706e67.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/4e9e69c3-1939-83d5-de38-0d5ce8d3854b.png)
1. **次のステップ**をクリックします。
![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f313136383838322f32336333653166392d363261382d316364382d353735352d3138643236386163653234332e706e67.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/b548f059-8560-31c6-7230-b7cd30d4f8e8.png)
1. ロール名を入力します。英数字のみが許可されます。
![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f313136383838322f31666235646663372d303339382d316135362d643835322d3334376236663264393030662e706e67.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/57fe21fb-55dd-70fc-5c2d-df52435b65fa.png)
1. ロールが作成されたことを確認します。
1. 作成したロールをクリックし、右下の **+インラインポリシーの追加** をクリックします。
![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f313136383838322f31386661303361622d363232612d636562642d306634612d3035653338353031373333352e706e67.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/d2a09839-2d82-e520-6b8c-1ede22d4cfdf.png)
1. ポリシーのJSONタグをクリックし、[Create a cross-account IAM role(英語)](https://docs.databricks.com/administration-guide/account-api/iam-role.html)にある下記の適切な **ポリシー(JSON)** を選択して貼り付けます。
![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f313136383838322f63613636313865312d626563312d626431372d616433352d3533393232326137343265612e706e67.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/6933fd72-c48c-3e17-80ba-59478af1d7c2.png)

    | デプロイ | ポリシー |
    |:--|:--|
    |デフォルトのポリシー制限がある顧客管理のVPC：[独自のVPC](https://qiita.com/taka_yayoi/items/f23bd799e1960e2eccbe)でDatabricksワークスペースを起動します。   |[Your VPC, default]   |
    |カスタムポリシー制限付きの顧客管理VPC：アカウントID、VPC ID、リージョン、およびセキュリティグループによるポリシー制限付きの[独自のVPC](https://qiita.com/taka_yayoi/items/f23bd799e1960e2eccbe)でDatabricksワークスペースを起動します。   |[Your VPC, custom]   |
    |Databricksが管理するVPC：Databricksが管理するVPCでDatabricksワークスペースを起動します。   |[Databricks VPC]   |

    ここでは、顧客管理VPCのポリシー`[Your VPC, default]`を設定します。

    ```json:JSON
    {
    "Version": "2012-10-17",
    "Statement": [{
          "Sid": "Stmt1403287045000",
          "Effect": "Allow",
          "Action": [
              "ec2:AssociateIamInstanceProfile",
              "ec2:AttachVolume",
              "ec2:AuthorizeSecurityGroupEgress",
              "ec2:AuthorizeSecurityGroupIngress",
              "ec2:CancelSpotInstanceRequests",
              "ec2:CreateTags",
              "ec2:CreateVolume",
              "ec2:DeleteTags",
              "ec2:DeleteVolume",
              "ec2:DescribeAvailabilityZones",
              "ec2:DescribeIamInstanceProfileAssociations",
              "ec2:DescribeInstanceStatus",
              "ec2:DescribeInstances",
              "ec2:DescribeInternetGateways",
              "ec2:DescribeNatGateways",
              "ec2:DescribeNetworkAcls",
              "ec2:DescribePrefixLists",
              "ec2:DescribeReservedInstancesOfferings",
              "ec2:DescribeRouteTables",
              "ec2:DescribeSecurityGroups",
              "ec2:DescribeSpotInstanceRequests",
              "ec2:DescribeSpotPriceHistory",
              "ec2:DescribeSubnets",
              "ec2:DescribeVolumes",
              "ec2:DescribeVpcAttribute",
              "ec2:DescribeVpcs",
              "ec2:DetachVolume",
              "ec2:DisassociateIamInstanceProfile",
              "ec2:ReplaceIamInstanceProfileAssociation",
              "ec2:RequestSpotInstances",
              "ec2:RevokeSecurityGroupEgress",
              "ec2:RevokeSecurityGroupIngress",
              "ec2:RunInstances",
              "ec2:TerminateInstances"
          ],
          "Resource": [
            "*"
          ]
        },
        {
          "Effect": "Allow",
          "Action": [
              "iam:CreateServiceLinkedRole",
              "iam:PutRolePolicy"
          ],
          "Resource": "arn:aws:iam::*:role/aws-service-role/spot.amazonaws.com/AWSServiceRoleForEC2Spot",
          "Condition": {
            "StringLike": {
                "iam:AWSServiceName": "spot.amazonaws.com"
            }
          }
        }]
    }
    ```

1. インラインポリシー名を入力して**ポリシーを作成**をクリックします。
![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f313136383838322f31663430633037342d643733322d353130352d646663342d3839363764663836346136642e706e67.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/3bedfd65-08c6-1ffb-023c-86292b64e3a4.png)

1. IAMロールの作成が終わったら、**ロールARN**をコピーしておきます。
![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f313136383838322f63623834356537342d366563322d623165392d643066372d3931373064386332636631642e706e67.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/5adbf2b2-6503-309f-eb71-f63f7a1c09e9.png)

## アカウントコンソールでの作業

1. アカウントコンソールの**Add Credential Configuration**ダイアログに戻って、**Credential Configuration Name**に設定名を入力します。他の設定と区別がつくようにわかりやすい名前をつけてください。
1. **Role ARN**フィールドに上で作成したIAMロールの**ロールARN**を貼り付けます。
![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f313136383838322f66633166396666642d386432632d363363642d386561612d3664353139643238363034342e706e67.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/12f1e7c5-8022-bcf1-be09-77b4830b1576.png)
1. **Add**をクリックします。クレディンシャル設定が作成されたことを確認します。
1. [PrivateLink構成を組む](https://qiita.com/taka_yayoi/items/1ca54463469df05dd3ee#%E3%83%AF%E3%83%BC%E3%82%AF%E3%82%B9%E3%83%9A%E3%83%BC%E3%82%B9%E3%81%AE%E9%85%8D%E5%82%99)際にこのクレディンシャル設定を使用する場合には、ローカルマシンのターミナル、コマンドプロンプトから以下のコマンドを実行して作成されたクレディンシャル設定の情報を参照します。必要に応じてcurlやjqをインストールしてください。

  ```sh:Bash
  curl -X GET -u <アカウントオーナーのメールアドレス>:<アカウントオーナーのパスワード> \
'https://accounts.cloud.databricks.com/api/2.0/accounts/<DatabricksアカウントID>/credentials' | jq
  ```

以下のような結果が表示されるので、**credentials_name**に対応する**credentials_id**をメモしておきます。
```json
[
  {
    "credentials_id": "<クレディンシャル設定のID>",
    "account_id": "<DatabricksのアカウントID>",
    "aws_credentials": {
      "sts_role": {
        "role_arn": "<ロールARN>",
        "external_id": "f7253f01-0d0e-4583-bdd0-9aaed2c31dcf"
      }
    },
    "credentials_name": "databricks-credentials-audit-v1",
    "creation_time": 1620093584091
  }
]
```

# S3バケット設定の作成

1. [アカウントコンソール](https://accounts.cloud.databricks.com/
)にアカウントオーナーとしてログインします。
1. サイドメニューの**Cloud Resources**をクリックします。
![Screen Shot 2022-05-20 at 8.58.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/266e0ef6-d896-1339-422e-8f6ca8e9d493.png)
1. **Storage configuration**タブが選択されていることを確認して、**Add storage configuration**ボタンをクリックします。
1. **Add storage configuration**ダイアログが表示されます。
![Screen Shot 2022-05-20 at 8.59.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/8a37ad42-b98b-a7d4-2787-61f5613091db.png)
1. **Storage configuration name**には他の設定と区別がつく名前を指定します。
1. **Bucket name**には、Databricksのデータ格納に使用するS3バケット名を指定します。この後のステップでS3バケットを作成しますが、他のバケット名と重複しないことを確認してください。
1. S3バケットを作成する際に指定するバケットポリシーを生成するために**Generate policy**をクリックします。上で指定したバケット名に応じたポリシーが生成されます。ポリシーをコピーしておきます。
![Screen Shot 2022-05-20 at 9.04.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/b6257646-090a-42b0-823d-ac9b093aef6b.png)

## AWSマネジメントコンソールでの作業

上で作成したストレージ設定を適用するDBFSルート用のストレージS3バケットを作成します。DBFSルートストレージS3バケットは、クラスターのログ、ノートブックのバージョン、ジョブ結果などを格納するために必要となります。また、テストに必要なデータなどを格納するために使用することもできます。

1. S3に移動して、**バケットを作成**をクリックします。
![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f313136383838322f61646264666236362d623236312d656166302d613139342d6637313733656463346335362e706e67.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/a1170b87-56c5-1400-800c-425d66ab1893.png)

    > **推奨事項**
Databricksでは、バケットのバージョニングを有効にすることを強く推奨しています。バージョニングは、ファイルが誤って変更または削除された場合に、バケット内のファイルの以前のバージョンを復元することができます。

1. S3バケットの**アクセス許可**に上でコピーしたDatabricksのバケットポリシーを設定します。
![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f313136383838322f63353436616663642d386335332d653465622d653436312d3561353237643965343835382e706e67.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/1cbda352-a38f-2af9-7a04-ef8aa5c5eb19.png)

## アカウントコンソールでの作業

1. **Add**をクリックして設定を作成します。
1. [PrivateLink構成を組む](https://qiita.com/taka_yayoi/items/1ca54463469df05dd3ee#%E3%83%AF%E3%83%BC%E3%82%AF%E3%82%B9%E3%83%9A%E3%83%BC%E3%82%B9%E3%81%AE%E9%85%8D%E5%82%99)際にこのストレージ設定を使用する場合には、ローカルマシンのターミナル、コマンドプロンプトから以下のコマンドを実行して作成されたクレディンシャル設定の情報を参照します。必要に応じてcurlやjqをインストールしてください。

    ```sh:Bash
    curl -X GET -u <アカウントオーナーのメールアドレス>:<アカウントオーナーのパスワード> \
    'https://accounts.cloud.databricks.com/api/2.0/accounts/<DatabricksアカウントID>/storage-configurations' | jq
    ```

以下のようなアウトプットが出るので、`storage_configuration_name`に対応する`storage_configuration_id`をメモしておきます。

```json
[
  {
    "storage_configuration_id": "<ストレージ設定のID>",
    "account_id": "<DatabricksのアカウントID>",
    "root_bucket_info": {
      "bucket_name": "ty-db-audit-log"
    },
    "storage_configuration_name": "databricks-workspace-storageconf-audit-v1",
    "creation_time": 1620092961899
  }
]
```

### Databricks 無料トライアル

[Databricks 無料トライアル](https://databricks.com/jp/try-databricks)