Unity Catalogのストレージ資格情報と外部ロケーションを作成してみる

こちらのマニュアルに沿って、実際にストレージ資格情報(storage credential)と外部ロケーション(external location)を作成して使用してみます。

https://qiita.com/taka_yayoi/items/18fee92365eee58e0b94

# S3バケットの作成

外部ロケーションを経由してアクセスするS3バケットを作成します。ここでは`taka-external-location-bucket`というバケット名にしています。

![Screen Shot 2023-01-02 at 13.06.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/24f1eb9c-4b43-5e7a-aa06-20be1f86c29c.png)

# ストレージ認証情報の作成

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

1. クロスアカウントIAMロールを作成します。
![Screen Shot 2023-01-02 at 13.08.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/6a285a0b-b9b1-41c6-34db-6c4ecf9f70d3.png)
1. ここでは`uc-external-location`というロールを作成します。一度デフォルトの設定で作成します。
1. ロール一覧から作成したIAMロールにアクセスし、**信頼関係**に[ステップ1: IAMロールの作成、更新](https://qiita.com/taka_yayoi/items/18fee92365eee58e0b94#%E3%82%B9%E3%83%86%E3%83%83%E3%83%971-iam%E3%83%AD%E3%83%BC%E3%83%AB%E3%81%AE%E4%BD%9C%E6%88%90%E6%9B%B4%E6%96%B0)のJSONポリシーを貼り付けます。
![Screen Shot 2023-01-02 at 13.12.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/d6e9450c-4f33-0359-4132-f478cff507d9.png)
1. IAMポリシーを作成します。[上のステップ](#s3バケットの作成)で作成したS3バケットにここで作成したIAMロールを仮定することを許可します。
![Screen Shot 2023-01-02 at 13.17.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/934bff73-a2ab-1eb9-cd6c-52842b7c0a9f.png)
![Screen Shot 2023-01-02 at 13.18.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/2cc2e0b1-2919-1da5-ff33-8643e3412de5.png)
1. 上で作成したIAMロールにポリシーをアタッチします。
![Screen Shot 2023-01-02 at 13.20.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/f2161e53-9ef6-cbe0-cb28-5972360dc099.png)
![Screen Shot 2023-01-02 at 13.21.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/05182c77-8b38-40f5-7d4d-dc9295a7afa9.png)

上の画面で**ARN**をコピーしておきます。

## Databricksでの作業

1. Databricksワークスペースにログインします。
1. サイドメニューの**データ**をクリックします。
1. **ストレージ資格情報**をクリックします。
1. **資格情報を作成**をクリックします。
![Screen Shot 2023-01-02 at 13.26.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/0a045495-2f10-70f5-abd5-c1e16015ec90.png)
1. 上でコピーしたARNを指定して資格情報を作成します。
![Screen Shot 2023-01-02 at 13.31.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/6467b8c2-e00b-8255-5b58-cd2c8c549275.png)
![Screen Shot 2023-01-02 at 13.32.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/2fe8b7c6-c8da-f69c-d2b8-da4ac89eae5b.png)

# 外部ロケーションの作成

1. Databricksワークスペースにログインします。
1. サイドメニューの**データ**をクリックします。
1. **外部の格納場所**をクリックします。
1. **格納場所を作成**をクリックします。
![Screen Shot 2023-01-02 at 13.34.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/a7bc3ad4-10f6-fd39-6ca0-1f8e421465d2.png)
1. 上で作成したS3バケットと資格情報と指定して外部ロケーションを作成します。
![Screen Shot 2023-01-02 at 13.35.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/4a096640-f42c-b6d5-43c0-6a9ad90b8112.png)
![Screen Shot 2023-01-02 at 13.36.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/7e182e96-4544-78a6-5670-fe6f9b8ff638.png)

これでストレージ資格情報と外部ロケーションが作成できました。

# ストレージ資格情報や外部ロケーションへのアクセス

1. まずは、ストレージ資格情報を確認してみます。Unity Catalogにアクセスできるクラスターを起動して、ノートブックをアタッチします。
![Screen Shot 2023-01-02 at 13.41.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/931c7db2-5804-2428-a730-5c80b96f5ee8.png)
1. `SHOW STORAGE CREDENTIALS`で資格情報を一覧します。
![Screen Shot 2023-01-02 at 13.42.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/743b8672-3e57-baee-f5ce-a0880d432310.png)
1. `SHOW EXTERNAL LOCATIONS`で外部ロケーションを一覧することもできます。
![Screen Shot 2023-01-02 at 13.44.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/76aa40ee-3c3c-4845-83b2-e56ed11c4448.png)
1. `DESCRIBE LOCATION`で詳細を確認します。ロケーション名にハイフンが入っているのでバッククオートで囲みます。
![Screen Shot 2023-01-02 at 13.45.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/3d66ac41-c457-4b2c-fc02-eda7b3b8d27a.png)
1. 外部ロケーションを使って外部テーブルを作成します。今回は資格情報やロケーションの作成者自身で作業しているので明示的に権限は付与していません。

    ```sql:SQL
    CREATE TABLE main.default.student_external 
    (id INT, name STRING, age INT) 
    LOCATION 's3://taka-external-location-bucket/external-tables/student_external';
    ```

    ```sql:SQL
    INSERT INTO main.default.student_external VALUES
    (1, 'Amy Smith', 16);
    ```

1. テーブルが作成されました。
![Screen Shot 2023-01-02 at 14.09.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/3fcaedc1-c18b-6e8c-181a-bef054e3fd73.png)
![Screen Shot 2023-01-02 at 14.12.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/7b4c1402-1a2c-c6af-afbc-369015ed96ab.png)
1. S3バケット上でもファイルを確認することができます。
![Screen Shot 2023-01-02 at 14.12.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/0178691f-52ba-e889-532a-1aabbf279b5a.png)

# まとめ

一旦今回はここまで。私の理解では、これまでは[インスタンスプロファイル](https://qiita.com/taka_yayoi/items/446c7971be354f88c679)を用いてS3へのアクセス設定をクラスターに持たせていたのですが、それを分離して設定自体をアクセスコントロールできるようにしたのが、ストレージ資格情報と外部ロケーションです。

(適切にS3に設定がされていれば)ストレージ資格情報(IAMロール)だけでもアクセス制御は可能なのですが、その場合、それを使う側は目の前にあるIAMロールがどのS3パスにアクセスできるのかを事前に調べないといけません。なので、S3パスの情報を外部ロケーションとして定義することで、ユーザーはどのS3パスに対してアクセスできるのかを知ることができるようになります。管理の柔軟性や再利用可能性とアクセスコントロールのバランスをとった実装だと思います。まだ使いこなしていないのであれですが。
![Screen Shot 2023-01-02 at 14.17.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/ea4f4574-f9a3-6e60-2c9e-c56a06a1a67a.png)

次回はもう少しディープダイブしていきます。

### Databricks 無料トライアル

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