Databricksの課金利用ログを設定してみる

存在は知っていましたが、試したことがなかったので課金利用ログ(billable usage log)を設定します。

Databricksを本格的に利用することになれば当然コスト管理が大切となります。

- [Databricksにおける利用課金ログデータの分析](https://qiita.com/taka_yayoi/items/ba8b412758758f5febc2)
- [Databricksの利用課金データのデリバリーとアクセス](https://qiita.com/taka_yayoi/items/90c7767025ee3feb3640)

こちらの記事も参考にさせていただきました。

https://qiita.com/maroon-db/items/3b8f6216d29ce8f7baec

# S3の設定

1. バケットを作成します。`ty-db-billable-usage-log`という名前にしています。
1. バケットポリシーを設定します。
![Screen Shot 2022-10-03 at 19.48.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/a9a4d9b0-3b4d-fde3-84c6-34e39c21ab17.png)

    ```json:JSON
    {
    	"Version": "2012-10-17",
    	"Statement": [
    		{
    			"Sid": "Grant Databricks Access",
    			"Effect": "Allow",
    			"Principal": {
    				"AWS": "arn:aws:iam::414351767826:root"
    			},
    			"Action": [
    				"s3:GetObject",
    				"s3:GetObjectVersion",
    				"s3:PutObject",
    				"s3:DeleteObject",
    				"s3:ListBucket",
    				"s3:GetBucketLocation"
    			],
    			"Resource": [
    				"arn:aws:s3:::ty-db-billable-usage-log/*",
    				"arn:aws:s3:::ty-db-billable-usage-log"
    			]
    		}
    	]
    }
    ```

1. オブジェクト所有者を編集し、**ACL有効**に設定した上で**希望するバケット所有者**を選択して保存します。
![Screen Shot 2022-10-03 at 19.49.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/d760b4dd-0bd8-8d43-5c6a-f7514e14ae3e.png)

# IAMロールの作成

1. `ty-db-billable-log`というロールを作成します。
1. インラインポリシーを追加します。ポリシー名は`ty-db-billable-policy`にしました。

    :::note info
    **注意**
    以下のポリシーではS3バケットに`billable-log`というプレフィクスを付与して保存する様にしています。このプレフィックスは[後のステップ](#ログデリバリーの設定)でも指定するのでメモしておいてください。
   :::

    ```json:JSON
    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Action": [
                    "s3:GetBucketLocation"
                ],
                "Resource": [
                    "arn:aws:s3:::ty-db-billable-usage-log"
                ]
            },
            {
                "Effect": "Allow",
                "Action": [
                    "s3:PutObject",
                    "s3:GetObject",
                    "s3:DeleteObject",
                    "s3:PutObjectAcl",
                    "s3:AbortMultipartUpload"
                ],
                "Resource": [
                    "arn:aws:s3:::ty-db-billable-usage-log/billable-log/",
                    "arn:aws:s3:::ty-db-billable-usage-log/billable-log/*"
                ]
            },
            {
                "Effect": "Allow",
                "Action": [
                    "s3:ListBucket",
                    "s3:ListMultipartUploadParts",
                    "s3:ListBucketMultipartUploads"
                ],
                "Resource": "arn:aws:s3:::ty-db-billable-usage-log",
                "Condition": {
                    "StringLike": {
                        "s3:prefix": [
                            "billable-log",
                            "billable-log/*"
                        ]
                    }
                }
            }
        ]
    }
    ```

1. **信頼関係**タブをクリックして、以下の信頼ポリシーを追加します。

    ```json:JSON
    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Principal": {
                    "AWS": "arn:aws:iam::414351767826:role/SaasUsageDeliveryRole-prod-IAMRole-3PLHICCRR1TK"
                },
                "Action": "sts:AssumeRole",
                "Condition": {
                    "StringEquals": {
                        "sts:ExternalId": "<DatabricksアカウントID>"
                    }
                }
            }
        ]
    }
    ```
    ![Screen Shot 2022-10-03 at 19.52.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/d0b0c76b-a1ff-e005-1910-d7ee07294086.png)

作成したロールのARNをメモしておきます。
![Screen Shot 2022-10-03 at 19.58.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/a19ee3c5-e928-9d4c-cd44-88ca97aa5e45.png)


# ストレージ設定情報(Storage configuration)の作成

ここからはローカルマシンのターミナルなどからコマンドを実行します。curlとjqを使います。

```bash:Bash
curl -X POST -u <Databricksアカウントオーナーのメールアドレス>:<パスワード> \
    'https://accounts.cloud.databricks.com/api/2.0/accounts/<DatabricksアカウントID>/storage-configurations' \
  -d '{
    "storage_configuration_name": "databricks-workspace-billable-log-storageconf-v1",
    "root_bucket_info": {
      "bucket_name": "ty-db-billable-usage-log"
    }
  }' | jq
```

レスポンスは以下の様になります。`<ストレージ設定情報のID>`をメモしておきます。
```json:JSON
{
  "storage_configuration_id": "<ストレージ設定情報のID>",
  "account_id": "<DatabricksアカウントID>",
  "root_bucket_info": {
    "bucket_name": "ty-db-billable-usage-log"
  },
  "storage_configuration_name": "databricks-workspace-billable-log-storageconf-v1",
  "creation_time": 1664792184307
}
```

# 認証設定情報(Credential configuration)の作成

```bash:Bash
curl -X POST -u <Databricksアカウントオーナーのメールアドレス>:<パスワード> \
   'https://accounts.cloud.databricks.com/api/2.0/accounts/<DatabricksアカウントID>/credentials' \
   -d '{
   "credentials_name": "databricks-billable-log-credentials-v1",
   "aws_credentials": {
     "sts_role": {
       "role_arn": "<上で作成したIAMロールのARN>"
     }
   }
 }' | jq
```

レスポンスは以下の様になります。

```json:JSON
 {
  "credentials_id": "<認証設定情報のID>",
  "account_id": "<DatabricksアカウントID>",
  "aws_credentials": {
    "sts_role": {
      "role_arn": "<上で作成したIAMロールのARN>",
      "external_id": "<DatabricksアカウントID>"
    }
  },
  "credentials_name": "databricks-billable-log-credentials-v1",
  "creation_time": 1664792541898
}
```

`<認証設定情報のID>`をメモしておきます。

# ログデリバリーの設定

```bash:Bash
curl -X POST -u <Databricksアカウントオーナーのメールアドレス>:<パスワード>  \
  'https://accounts.cloud.databricks.com/api/2.0/accounts/<DatabricksアカウントID>/log-delivery' \
  -d '{
  "log_delivery_configuration": {
    "log_type": "BILLABLE_USAGE",
    "config_name": "billable usage config",
    "output_format": "CSV",
    "credentials_id": "<認証設定情報のID>",
    "storage_configuration_id": "<ストレージ設定情報のID>",
    "delivery_path_prefix": "<IAMロールのポリシー設定時に指定したプレフィックス>",
    "delivery_start_time": "2020-06",
    "workspace_ids_filter": [
    ]
    }
}' | jq
```

:::note info
**注意**
[IAMロールの作成](#iamロールの作成)のポリシーで、ログ保存場所のプレフィックスを指定している場合には、上の`delivery_path_prefix`でも指定する様にしてください。
:::

レスポンスは以下の様になります。

```json:JSON
{
  "log_delivery_configuration": {
    "config_id": "<ログデリバリー設定のID>",
    "config_name": "billable usage config",
    "log_type": "BILLABLE_USAGE",
    "output_format": "CSV",
    "account_id": "<DatabricksアカウントID>",
    "credentials_id": "<認証設定情報のID>",
    "storage_configuration_id": "<ストレージ設定情報のID>",
    "delivery_path_prefix": "<IAMロールのポリシー設定時に指定したプレフィックス>",
    "delivery_start_time": "2020-06",
    "status": "ENABLED",
    "creation_time": 1664792846000,
    "update_time": 1664792846000,
    "log_delivery_status": {
      "status": "CREATED",
      "message": "Log Delivery Configuration is successfully created. Status will be updated after the first delivery attempt."
    }
  }
}
```

有効化されたので、デリバリーされるのを待ちます。デリバリーされたらダッシュボードを作成します。

続きはこちらです。

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

### Databricks 無料トライアル

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