こちらのマニュアルに沿って、実際にストレージ資格情報(storage credential)と外部ロケーション(external location)を作成して使用してみます。
S3バケットの作成
外部ロケーションを経由してアクセスするS3バケットを作成します。ここではtaka-external-location-bucket
というバケット名にしています。
ストレージ認証情報の作成
AWSマネジメントコンソールでの作業
- クロスアカウントIAMロールを作成します。
- ここでは
uc-external-location
というロールを作成します。一度デフォルトの設定で作成します。 - ロール一覧から作成したIAMロールにアクセスし、信頼関係にステップ1: IAMロールの作成、更新のJSONポリシーを貼り付けます。
- IAMポリシーを作成します。上のステップで作成したS3バケットにここで作成したIAMロールを仮定することを許可します。
- 上で作成したIAMロールにポリシーをアタッチします。
上の画面でARNをコピーしておきます。
Databricksでの作業
- Databricksワークスペースにログインします。
- サイドメニューのデータをクリックします。
- ストレージ資格情報をクリックします。
-
資格情報を作成をクリックします。
- 上でコピーしたARNを指定して資格情報を作成します。
外部ロケーションの作成
- Databricksワークスペースにログインします。
- サイドメニューのデータをクリックします。
- 外部の格納場所をクリックします。
-
格納場所を作成をクリックします。
- 上で作成したS3バケットと資格情報と指定して外部ロケーションを作成します。
これでストレージ資格情報と外部ロケーションが作成できました。
ストレージ資格情報や外部ロケーションへのアクセス
-
まずは、ストレージ資格情報を確認してみます。Unity Catalogにアクセスできるクラスターを起動して、ノートブックをアタッチします。
-
DESCRIBE LOCATION
で詳細を確認します。ロケーション名にハイフンが入っているのでバッククオートで囲みます。
-
外部ロケーションを使って外部テーブルを作成します。今回は資格情報やロケーションの作成者自身で作業しているので明示的に権限は付与していません。
SQLCREATE TABLE main.default.student_external (id INT, name STRING, age INT) LOCATION 's3://taka-external-location-bucket/external-tables/student_external';
SQLINSERT INTO main.default.student_external VALUES (1, 'Amy Smith', 16);
まとめ
一旦今回はここまで。私の理解では、これまではインスタンスプロファイルを用いてS3へのアクセス設定をクラスターに持たせていたのですが、それを分離して設定自体をアクセスコントロールできるようにしたのが、ストレージ資格情報と外部ロケーションです。
(適切にS3に設定がされていれば)ストレージ資格情報(IAMロール)だけでもアクセス制御は可能なのですが、その場合、それを使う側は目の前にあるIAMロールがどのS3パスにアクセスできるのかを事前に調べないといけません。なので、S3パスの情報を外部ロケーションとして定義することで、ユーザーはどのS3パスに対してアクセスできるのかを知ることができるようになります。管理の柔軟性や再利用可能性とアクセスコントロールのバランスをとった実装だと思います。まだ使いこなしていないのであれですが。
次回はもう少しディープダイブしていきます。