Unity Catalogにおける外部ロケーションとストレージ資格情報の管理

[Manage external locations and storage credentials \| Databricks on AWS](https://docs.databricks.com/data-governance/unity-catalog/manage-external-locations-and-credentials.html) [2022/12/14時点]の翻訳です。

:::note warn
本書は抄訳であり内容の正確性を保証するものではありません。正確な内容に関しては原文を参照ください。
:::

本書では、外部ロケーションとストレージ資格情報を紹介し、外部テーブルへのアクセスを管理するためのこれらの作成方法と使用方法を説明します。

# 外部ロケーションとストレージ資格情報とは何か？

外部ロケーション(external location)とストレージ資格情報(storage credential)を用いることで、Unity Catalogがユーザーの代わりにクラウドテナントにデータを書き込めるようになります。これらのオブジェクトは以下の目的で使用されます。

- [外部テーブル](https://docs.databricks.com/data-governance/unity-catalog/create-tables.html#create-an-external-table)の作成、読み込み、書き込み
- ご自身のクラウドテナントに格納されている[ファイルからマネージドテーブルあるいは外部テーブルを作成](https://docs.databricks.com/data-governance/unity-catalog/create-tables.html#create-a-table-from-files-stored-in-your-cloud-tenant)
- お使いのクラウドテナントに格納されているファイルからテーブルに[レコードをインサート](https://docs.databricks.com/data-governance/unity-catalog/create-tables.html#insert-records-from-a-path-into-an-existing-table)
- お使いのクラウドテナントに格納されている[データファイルを直接探索](https://docs.databricks.com/data-governance/unity-catalog/create-tables.html#explore-the-contents-of-the-files)

*ストレージ資格情報*は、IAMロールを用いて皆様のクラウドテナントに格納されているデータに対する認証と承認のメカニズムを提供します。それぞれのストレージ資格情報は、どのユーザーとグループが資格情報にアクセスできるのかを制御するUnity Catalogのアクセスコントロールポリシーの対象になります。ユーザーがUnity Catalog上のストレージ資格情報にアクセスできない場合、リクエストは失敗し、Unity Catalogはユーザーに代わって皆様のクラウドテナントに認証を受けようとはしません。

*外部ロケーション*は、クラウドストレージのパスへのアクセスを承認するストレージ資格情報とクラウドストレージのパスを組み合わせるオブジェクトです。それぞれのストレージのロケーションは、どのユーザーとグループが資格情報にアクセスできるのかを制御するUnity Catalogのアクセスコントロールポリシーの対象になります。ユーザーがUnity Catalog上のストレージロケーションにアクセスできない場合、リクエストは失敗し、Unity Catalogはユーザーに代わって皆様のクラウドテナントに認証を受けようとはしません。

:::note
**注意**
名前に「外部」という用語がありますが、外部ロケーションは外部テーブルのストレージロケーションを定義するだけに使うだけでなく、マネージドテーブルにも使用することができます。特に、これらはデフォルトメタストアのルートストレージロケーションを上書きし、カタログやスキーマレベルでのマネージドテーブルのストレージロケーションの定義に使うこともできます。[CREATE CATALOG](https://docs.databricks.com/sql/language-manual/sql-ref-syntax-ddl-create-catalog.html)や[CREATE SCHEMA](https://docs.databricks.com/sql/language-manual/sql-ref-syntax-ddl-create-schema.html)をご覧ください。
:::

直接ストレージ資格情報を用いるよりも、外部ロケーションを使用することをお勧めします。

外部ロケーションとストレージ資格情報は、カタログ内ではなくメタストアの最上位レベルに格納されます。ストレージ資格情報や外部ロケーションを作成、管理するには、メタストアの管理者あるいはアカウントレベルの管理者である必要があります。

# 要件

- ストレージ資格情報を作成するには、Databricksアカウント管理者である必要があります。ストレージ資格情報を作成したアカウント管理者は、権限を管理できるようにオーナーシップをユーザーやグループに移譲することができます。
- 外部ロケーションを作成するには、メタストア管理者あるいは`CREATE EXTERNAL LOCATION`権限を持つユーザーである必要があります。
- ユーザーに読み書きさせたいS3バケット名にはドット記法(.)を使うことができません。バケット名の命名におけるガイドについては、[AWS bucket naming rules](https://docs.aws.amazon.com/AmazonS3/latest/userguide/bucketnamingrules.html)をご覧ください。

# ストレージ資格情報の管理

以下のセクションではストレージ資格情報の作成、管理方法を説明します。

## ストレージ資格情報の作成

ストレージ資格情報を作成するには、S3バケットパスへの読み書きを許可するIAMロールが必要となります。ストレージ資格情報を作成する際にそのIAMロールを参照します。

### ステップ1: IAMロールの作成、更新

AWS上で、ユーザーにアクセスさせたいS3に対するアクセスを許可するIAMロールを作成、更新します。

:::note info
**ティップス**
このアクセスを提供するIAMロールをすでに作成済みの場合、このステップをスキップして[ステップ2: DatabricksにIAMロールの詳細を指定](#ステップ2-databricksにiamロールの詳細を指定)に進んでください。
:::

1. IAMロールを作成、あるいは既存のロールを更新します。

    Databricksユーザーに代わってUnity Catalogがバケットのデータにアクセスするために、ロールを仮定できるようにクロスアカウント信頼関係をセットアップします。また、お使いのロールは自己仮定、すなわち、自分自身を仮定するように設定する必要があります。

    変更するために、S3バケットと同じアカウント内に以下のポリシーを作成し、以下の値を置き換えます。**Trust Relationship**タブに以下のポリシーJSONを貼り付けます。

    - `Principal`セクションの最初のロールARNは変更しないでください。これは、Databricksによって作成されたロールを参照する静的な値です。
    - 2つ目のロールARNは、ロールは自己仮定しないといけないため、作成するロールに対する自己参照となります。自己仮定に関しては、[Amazon blog article](https://aws.amazon.com/blogs/security/announcing-an-update-to-iam-role-trust-policy-behavior/)をご覧ください。`<YOUR_AWS_ACCOUNT_ID>`と`<THIS_ROLE_NAME>`を実際のIAMロールの値で置き換えてください。
    - `sts:ExternalId`セクションでは、`<DATABRICKS_ACCOUNT_ID>`をあなたのDatabricksアカウントID(AWSアカウントIDではありません)で置き換えてください。DatabricksアカウントIDの取得方法については、[WSにおけるストレージバケットとIAMロールの設定](https://qiita.com/taka_yayoi/items/3f2df6ddea81521ee786#aws%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8B%E3%82%B9%E3%83%88%E3%83%AC%E3%83%BC%E3%82%B8%E3%83%90%E3%82%B1%E3%83%83%E3%83%88%E3%81%A8iam%E3%83%AD%E3%83%BC%E3%83%AB%E3%81%AE%E8%A8%AD%E5%AE%9A)のステップ1を参照ください。

    ```json:JSON
    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Principal": {
            "AWS": [
              "arn:aws:iam::414351767826:role/unity-catalog-prod-UCMasterRole-14S5ZJVKOTYTL",
              "arn:aws:iam::<YOUR_AWS_ACCOUNT_ID>:role/<THIS_ROLE_NAME>"
             ]
          },
          "Action": "sts:AssumeRole",
          "Condition": {
            "StringEquals": {
              "sts:ExternalId": "<DATABRICKS_ACCOUNT_ID>"
            }
          }
        }
      ]
    }
    ```

1. S3バケットと同じアカウントに以下のIAMポリシーを作成し、以下の値を置き換えます。

    - `<BUCKET>`: S3バケット名
    - `<KMS_KEY>`: 暗号化が有効化されている場合、S3バケットのコンテンツを暗号化するKMSキーの名前。**暗号化が無効の場合はIAMポリシーのKMSセクションを削除してください。**
    - `<AWS_ACCOUNT_ID>`: (Databricksアカウントではなく)お使いのAWSアカウントのアカウントID
    - `<AWS_IAM_ROLE_NAME>`: 前のステップで作成したAWSのIAMロール名

    ```json:JSON
    {
      "Version": "2012-10-17",
      "Statement": [
          {
              "Action": [
                  "s3:GetObject",
                  "s3:PutObject",
                  "s3:DeleteObject",
                  "s3:ListBucket",
                  "s3:GetBucketLocation",
                  "s3:GetLifecycleConfiguration",
                  "s3:PutLifecycleConfiguration"
              ],
              "Resource": [
                  "arn:aws:s3:::<BUCKET>/*",
                  "arn:aws:s3:::<BUCKET>"
              ],
              "Effect": "Allow"
          },
          {
              "Action": [
                  "kms:Decrypt",
                  "kms:Encrypt",
                  "kms:GenerateDataKey*"
              ],
              "Resource": [
                  "arn:aws:kms:<KMS_KEY>"
              ],
              "Effect": "Allow"
          },
          {
              "Action": [
                  "sts:AssumeRole"
              ],
              "Resource": [
                  "arn:aws:iam::<AWS_ACCOUNT_ID>:role/<AWS_IAM_ROLE_NAME>"
              ],
              "Effect": "Allow"
          }
        ]
    }
    ```

    :::note
     **注意**
    - Unity Catalogに対してより厳しいIAMポリシーが必要な場合は、サポートのためにDatabricks担当にお問合せください。
    - Databricksでは、Partner ConnectとデータアップロードUIで使用されるパーソナルステージングロケーションのためのライフサイクルポリシーを管理するために`GetLifecycleConfiguration`と`PutLifecycleConfiguration`を使用します。

1. IAMロールにIAMポリシーをアタッチします。

    ロールの**Permission**タブで、作成したIAMポリシーをアタッチします。

### ステップ2: DatabricksにIAMロールの詳細を指定

1. Databricksでメタストアにリンクされているワークスペースにログインします。
1. ![](https://docs.databricks.com/_images/data-icon.png)**Data**をクリックします。
1. 画面の下にある**Storage Credentials**をクリックします。
1. **Create credential**をクリックします。
1. 資格情報の名前、お使いのクラウドテナント上のストレージロケーションにアクセスすることをUnity Catalogに許可するIAMロールのARN、オプションのコメントを入力します。

    :::note info
    **ティップス**
Databricksですでに[インスタンスプロファイル](https://qiita.com/taka_yayoi/items/446c7971be354f88c679)を定義している場合、**Copy instance profile**をクリックすることで、そのインスタンスプロファイルにIAMロールARNをコピーすることができます。そのインスタンスプロファイルのIAMロールは、Databricksユーザーの代わりに、Databricksがバケットにアクセスできるようにロールの権限を移譲できるクロスアカウント信頼関係を持っている必要があります。IAMロールのポリシーと信頼関係の要件については、[ステップ1: IAMロールの作成、更新](#ステップ1-iamロールの作成更新)をご覧ください。
   :::

1. **Save**をクリックします。
1. ストレージ資格情報を参照する[外部ロケーションを作成](#外部ロケーションの作成)します。

また、[Databricks Terraform provider](https://docs.databricks.com/dev-tools/terraform/index.html)や[databricks\_storage\_credential](https://registry.terraform.io/providers/databricks/databricks/latest/docs/resources/storage_credential)を用いて、ストレージ資格情報を作成することもできます。

## ストレージ資格情報の一覧

メタストアの全てのストレージ資格情報の一覧を参照するには、Data ExplorerかSQLコマンドを使用することができます。

**Data Explorer**
1. メタストアにリンクされているワークスペースにログインします。
1. ![](https://docs.databricks.com/_images/data-icon.png)**Data**をクリックします。
1. 画面の下部にある**Storage Credentials**をクリックします。

**SQL**
ノートブック、Databricks SQLのエディタで以下のコマンドを実行します。

```sql:SQL
SHOW STORAGE CREDENTIALS;
```

**Python**

ノートブックで以下のコマンドを実行します。

```py:Python
display(spark.sql("SHOW STORAGE CREDENTIALS"))
```

**R**

ノートブックで以下のコマンドを実行します。

```r:R
library(SparkR)

display(sql("SHOW STORAGE CREDENTIALS"))
```

**Scala**

ノートブックで以下のコマンドを実行します。

```scala:Scala
display(spark.sql("SHOW STORAGE CREDENTIALS"))
```


## ストレージ資格情報の参照

ストレージ資格情報のプロパティを参照するには、Data ExplorerかSQLコマンドを使用することができます。

**Data Explorer**
1. メタストアにリンクされているワークスペースにログインします。
1. ![](https://docs.databricks.com/_images/data-icon.png)**Data**をクリックします。
1. 画面の下部にある**Storage Credentials**をクリックします。
1. プロパティを参照するためにストレージ資格情報の名前をクリックします。

**SQL**
ノートブック、Databricks SQLのエディタで以下のコマンドを実行します。`<credential_name>`を資格情報の名前で置き換えます。

```sql:SQL
DESCRIBE STORAGE CREDENTIAL <credential_name>;
```

**Python**
ノートブックで以下のコマンドを実行します。`<credential_name>`を資格情報の名前で置き換えます。

```py:Python
display(spark.sql("DESCRIBE STORAGE CREDENTIAL <credential_name>"))
```

**R**

ノートブックで以下のコマンドを実行します。`<credential_name>`を資格情報の名前で置き換えます。

```r:R
library(SparkR)

display(sql("DESCRIBE STORAGE CREDENTIAL <credential_name>"))
```

**Scala**
ノートブックで以下のコマンドを実行します。`<credential_name>`を資格情報の名前で置き換えます。

```scalacala:Scala
display(spark.sql("DESCRIBE STORAGE CREDENTIAL <credential_name>"))
```

## ストレージ資格情報の名前の変更

ストレージ資格情報の名前を変更するには、Data ExplorerかSQLコマンドを使用することができます。

**Data Explorer**
1. メタストアにリンクされているワークスペースにログインします。
1. ![](https://docs.databricks.com/_images/data-icon.png)**Data**をクリックします。
1. 画面の下部にある**Storage Credentials**をクリックします。
1. 編集ダイアログを開くためにストレージ資格情報の名前をクリックします。
1. ストレージ資格情報の名前を変更し保存します。

**SQL**
ノートブック、Databricks SQLのエディタで以下のコマンドを実行します。以下のプレースホルダーを置き換えます。
- `<credential_name>`: 資格情報の名前
- `<new_credential_name>`: 新たな名前

```sql:SQL
ALTER STORAGE CREDENTIAL <credential_name> RENAME TO <new_credential_name>;
```

**Python**
ノートブックで以下のコマンドを実行します。以下のプレースホルダーを置き換えます。
- `<credential_name>`: 資格情報の名前
- `<new_credential_name>`: 新たな名前

```py:Python
spark.sql("ALTER STORAGE CREDENTIAL <credential_name> RENAME TO <new_credential_name>")
```

**R**
ノートブックで以下のコマンドを実行します。以下のプレースホルダーを置き換えます。
- `<credential_name>`: 資格情報の名前
- `<new_credential_name>`: 新たな名前

```r:R
library(SparkR)

sql("ALTER STORAGE CREDENTIAL <credential_name> RENAME TO <new_credential_name>")
```

**Scala**
ノートブックで以下のコマンドを実行します。以下のプレースホルダーを置き換えます。
- `<credential_name>`: 資格情報の名前
- `<new_credential_name>`: 新たな名前

```scala:Scala
spark.sql("ALTER STORAGE CREDENTIAL <credential_name> RENAME TO <new_credential_name>")
```

## ストレージ資格情報に対するアクセス権の管理

ストレージ資格情報に対して直接アクセス権を設定することができますが、そうではなく、[外部ロケーション](#外部ロケーションの作成)を参照し、外部ロケーションへのアクセス権を設定することをお勧めします。外部ロケーションはストレージ資格情報と特定のパスを組み合わせ、そのパスとコンテンツに対してのみアクセスを許可します。

[Data Explorer](https://docs.databricks.com/data/manage-storage-credentials.html)かSQLコマンド、[Terraform](https://registry.terraform.io/providers/databricks/databricks/latest/docs/resources/external_location)を使用することでストレージ資格情報に対するアクセス権を管理することができます。ストレージ資格情報に対して以下の権限を許可、剥奪することができます。

- `CREATE TABLE`
- `READ FILES`
- `WRITE FILES`

以下のサンプルでは、プレースホルダーの値を置き換えてください。

- `<principal>`: アクセスを許可するアカウントレベルユーザーのメールアドレス、アカウントレベルグループの名前
- `<storage_credential_name>`: ストレージ資格情報の名前

ストレージ資格情報に付与されている権限を表示するには、以下のようなコマンド使用します。オプションとして、特定のプリンシパルに許可された権限のみを表示するように結果をフィルタリングすることができます。

**SQL**
以下のサンプルではプレースホルダーの値を置き換えてください。

- `<principal>`: アクセスを許可するアカウントレベルユーザーのメールアドレス、アカウントレベルグループの名前
- `<storage_credential_name>`: ストレージ資格情報の名前

ストレージ資格情報に許可されている権限を参照するには、以下のようなコマンドを実行します。オプションとして、特定のプリンシパルに許可されている権限だけにフィルタリングすることができます。

```sql:SQL
SHOW GRANTS [<principal>] ON STORAGE CREDENTIAL <storage_credential_name>;
```

```py:Python
display(spark.sql("SHOW GRANTS [<principal>] ON STORAGE CREDENTIAL <storage_credential_name>"))
```

```r:R
library(SparkR)
display(sql("SHOW GRANTS [<principal>] ON STORAGE CREDENTIAL <storage_credential_name>"))
```

```scala:Scala
display(spark.sql("SHOW GRANTS [<principal>] ON STORAGE CREDENTIAL <storage_credential_name>"))
```

ストレージ資格情報を直接用いて、外部テーブルの作成権限を与えるには以下のコマンドを実行します。

```sql:SQL
GRANT CREATE TABLE ON STORAGE CREDENTIAL <storage_credential_name> TO <principal>;
```

```py:Python
spark.sql("GRANT CREATE EXTERNAL TABLE ON STORAGE CREDENTIAL <storage_credential_name> TO <principal>")
```

```r:R
library(SparkR)
sql("GRANT CREATE EXTERNAL TABLE ON STORAGE CREDENTIAL <storage_credential_name> TO <principal>")
```

```scala:Scala
spark.sql("GRANT CREATE EXTERNAL TABLE ON STORAGE CREDENTIAL <storage_credential_name> TO <principal>")
```

ストレージ資格情報を直接用いて、外部テーブルの参照権限を与えるには以下を実行します。

```sql:SQL
GRANT READ FILES ON STORAGE CREDENTIAL <storage_credential_name> TO <principal>;
```

```py:Python
spark.sql("GRANT READ FILES ON STORAGE CREDENTIAL <storage_credential_name> TO <principal>")
```

```r:R
library(SparkR)
sql("GRANT READ FILES ON STORAGE CREDENTIAL <storage_credential_name> TO <principal>")
```

```scala:Scala
spark.sql("GRANT READ FILES ON STORAGE CREDENTIAL <storage_credential_name> TO <principal>")
```

:::note info
**注意**
グループ名にスペースが含まれている場合、(アポストロフィではなく)バックティックで囲んでください。
:::

## ストレージ資格情報のオーナーの変更

ストレージ資格情報の作成者が最初のオーナーとなります。オーナーを別のアカウントレベルユーザー、グループに変更するには、以下のいずれかを実行してください。

**SQL**
ノートブック、Databricks SQLのエディタで以下のコマンドを実行します。以下のプレースホルダーを置き換えます。

- `<credential_name>`: 資格情報の名前
- `<principal>`: アカウントレベルユーザーのメールアドレス、アカウントレベルグループの名前

```sql:SQL
ALTER STORAGE CREDENTIAL <credential_name> OWNER TO <principal>;
```

**Python**
ノートブックで以下のコマンドを実行します。以下のプレースホルダーを置き換えます。

- `<credential_name>`: 資格情報の名前
- `<principal>`: アカウントレベルユーザーのメールアドレス、アカウントレベルグループの名前

```py:Python
spark.sql("ALTER STORAGE CREDENTIAL <credential_name> OWNER TO <principal>")
```

**R**
ノートブックで以下のコマンドを実行します。以下のプレースホルダーを置き換えます。

- `<credential_name>`: 資格情報の名前
- `<principal>`: アカウントレベルユーザーのメールアドレス、アカウントレベルグループの名前

```r:R
library(SparkR)

sql("ALTER STORAGE CREDENTIAL <credential_name> OWNER TO <principal>")
```

**Scala**
ノートブックで以下のコマンドを実行します。以下のプレースホルダーを置き換えます。

- `<credential_name>`: 資格情報の名前
- `<principal>`: アカウントレベルユーザーのメールアドレス、アカウントレベルグループの名前

```scala:Scala
spark.sql("ALTER STORAGE CREDENTIAL <credential_name> OWNER TO <principal>")
```

## ストレージ資格情報の削除

ストレージ資格情報を削除するには、Data ExplorerかSQLコマンドを使用できます。

**Data Explorer**
1. メタストアにリンクされているワークスペースにログインします。
1. ![](https://docs.databricks.com/_images/data-icon.png)**Data**をクリックします。
1. 画面の下部にある**Storage Credentials**をクリックします。
1. 編集ダイアログを開くためにストレージ資格情報の名前をクリックします。
1. **Delete**ボタンをクリックします。

**SQL**
ノートブックかDatabricks SQLのエディタで以下のコマンドを実行します。`<credential_name>`を資格情報の名前で置き換えてください。コマンドのブラケット内の部分はオプションです。デフォルトでは、外部ロケーションで資格情報が使用されている場合は削除されません。

- `IF EXISTS`: 資格情報がない場合にエラーとなりません。

```sql:SQL
DROP STORAGE CREDENTIAL [IF EXISTS] <credential_name>;
```

**Python**

```py:Python
spark.sql("DROP STORAGE CREDENTIAL [IF EXISTS] <credential_name>")
```

**R**

```r:R
library(SparkR)

sql("DROP STORAGE CREDENTIAL [IF EXISTS] <credential_name>")
```

**Scala**

```scala:Scala
spark.sql("DROP STORAGE CREDENTIAL [IF EXISTS] <credential_name>")
```

# 外部ロケーションの管理

以下のセクションでは外部ロケーションの作成方法、管理方法を説明します。

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

[Data Explorer](https://docs.databricks.com/data/manage-external-locations.html)、SQLコマンド、[Terraform](https://registry.terraform.io/providers/databricks/databricks/latest/docs/resources/external_location)を用いて外部ロケーションを作成することができます。

ノートブックかDatabricks SQLエディタで以下のSQLコマンドを実行します。プレースホルダーの値を置き換えます。

- `<location_name>`: 外部ロケーションの名前
- `<bucket_path>`: この外部ロケーションがアクセスを許可するクラウドテナント上のパス
- `<storage_credential_name>`: S3バケットに読み書きを許可するIAMロールARNを含むストレージ資格情報の名前

:::note info
**注意**
それぞれのクラウドストレージのパスは、1つの外部ロケーションにのみ関連づけることができます。同じパスを参照する2つ目の外部ロケーションを作成しようとするとエラーになります。
:::

```sql:SQL
CREATE EXTERNAL LOCATION [IF NOT EXISTS] <location_name>
URL 's3://<bucket_path>'
WITH ([STORAGE] CREDENTIAL <storage_credential_name>)
[COMMENT <comment_string>];
```

```py:Python
spark.sql("CREATE EXTERNAL LOCATION [IF NOT EXISTS] <location_name> "
  "URL 's3://<bucket_path>' "
  "WITH ([STORAGE] CREDENTIAL <storage_credential_name>) "
  "[COMMENT <comment_string>]")
```

```r:R
library(SparkR)
sql(paste("CREATE EXTERNAL LOCATION [IF NOT EXISTS] <location_name> ",
  "URL 's3://<bucket_path>' ",
  "WITH ([STORAGE] CREDENTIAL <storage_credential_name>) ",
  "[COMMENT <comment_string>]",
  sep = ""))
```

```scala:Scala
spark.sql("CREATE EXTERNAL LOCATION [IF NOT EXISTS] <location_name> " +
  "URL 's3://<bucket_path>' " +
  "WITH ([STORAGE] CREDENTIAL <storage_credential_name>) " +
  "[COMMENT <comment_string>]")
```

## 外部ロケーションの参照

外部ロケーションのプロパティを参照するには、Data ExplorerかSQLコマンドを使用することができます。

**Data Explorer**
1. メタストアにリンクされているワークスペースにログインします。
1. ![](https://docs.databricks.com/_images/data-icon.png)**Data**をクリックします。
1. 画面の下部にある**External Locations**をクリックします。
1. プロパティを参照するために外部ロケーションの名前をクリックします。

**SQL**
ノートブック、Databricks SQLのエディタで以下のコマンドを実行します。`< location_name>`を外部ロケーションの名前で置き換えます。

```sql:SQL
DESCRIBE EXTERNAL LOCATION <location_name>;
```

**Python**
```py:Python
display(spark.sql("DESCRIBE EXTERNAL LOCATION <location_name>"))
```

**R**
```r:R
library(SparkR)

display(sql("DESCRIBE EXTERNAL LOCATION <location_name>"))
```

**Scala**
```scala:Scala
display(spark.sql("DESCRIBE EXTERNAL LOCATION <location_name>"))
```

## 外部ロケーションの変更

外部ロケーションのオーナーは、名称、URIの変更、外部ロケーションのストレージ資格情報を変更することができます。

以下のいずれかを実行します。以下のプレースホルダーを置き換えます。
- `<location_name>`: 外部ロケーションの名前
- `<new_location_name>`: 新たな名前

```sql:SQL
ALTER EXTERNAL LOCATION <location_name> RENAME TO <new_location_name>;
```

```py:Python
spark.sql("ALTER EXTERNAL LOCATION <location_name> RENAME TO <new_location_name>")
```

```r:R
library(SparkR)

sql("ALTER EXTERNAL LOCATION <location_name> RENAME TO <new_location_name>")
```

```scala:Scala
spark.sql("ALTER EXTERNAL LOCATION <location_name> RENAME TO <new_location_name>")
```

クラウドテナントで外部ロケーションがポイントするURIを変更するには、ノートブック、Databricks SQLのエディタで以下のコマンドを実行します。以下のプレースホルダーを置き換えます。

- `<location_name>`: 外部ロケーションの名前
- `<url>`: クラウドテナントでアクセスを許可する新たなストレージURL

```sql:SQL
ALTER EXTERNAL LOCATION location_name SET URL ‘<url>’ [FORCE];
```

```py:Python
spark.sql("ALTER EXTERNAL LOCATION location_name SET URL `<url>` [FORCE]")
```

```r:R
library(SparkR)

sql("ALTER EXTERNAL LOCATION location_name SET URL `<url>` [FORCE]")
```

```scala:Scala
spark.sql("ALTER EXTERNAL LOCATION location_name SET URL `<url>` [FORCE]")
```

`FORCE`オプションを指定すると、外部テーブルが外部ロケーションを使用している場合でもURLを変更します。

外部ロケーションが使用するストレージ資格情報を変更するには、ノートブック、Databricks SQLのエディタで以下のコマンドを実行します。以下のプレースホルダーを置き換えます。

- `<location_name>`: 外部ロケーションの名前
- `<credential_name>`: クラウドテナント上のロケーションのURLへのアクセスを許可するストレージ資格情報の名前

```sql:SQL
ALTER EXTERNAL LOCATION <location_name> SET STORAGE CREDENTIAL <credential_name>;
```

```py:Python
spark.sql("ALTER EXTERNAL LOCATION <location_name> SET STORAGE CREDENTIAL <credential_name>")
```

```r:R
library(SparkR)

sql("ALTER EXTERNAL LOCATION <location_name> SET STORAGE CREDENTIAL <credential_name>")
```

```scala:Scala
spark.sql("ALTER EXTERNAL LOCATION <location_name> SET STORAGE CREDENTIAL <credential_name>")
```

## 外部ロケーションに対するアクセス権の管理

[Data Explorer](https://docs.databricks.com/data/manage-external-locations.html)かSQLコマンド、[Terraform](https://registry.terraform.io/providers/databricks/databricks/latest/docs/resources/external_location)を使用することで外部ロケーションに対するアクセス権を管理することができます。

- `CREATE TABLE`
- `READ FILES`
- `WRITE FILES`

以下のサンプルではプレースホルダーの値を置き換えてください。

- `<principal>`: アクセスを許可するアカウントレベルユーザーのメールアドレス、アカウントレベルグループの名前
- `<location_name>`: 外部ロケーションの名前

外部ロケーションに許可されている権限を参照するには、以下のようなコマンドを実行します。オプションとして、特定のプリンシパルに許可されている権限だけにフィルタリングすることができます。

```sql:SQL
SHOW GRANTS [<principal>] ON EXTERNAL LOCATION <location_name>;
```

```py:Python
display(spark.sql("SHOW GRANTS [<principal>] ON EXTERNAL LOCATION <location_name>"))
```

```r:R
display(spark.sql("SHOW GRANTS [<principal>] ON EXTERNAL LOCATION <location_name>"))
```

```scala:Scala
display(spark.sql("SHOW GRANTS [<principal>] ON EXTERNAL LOCATION <location_name>"))
```

外部テーブルを作成するために外部ロケーションを使用できる許可を与えるには、以下を実行します。

```sql:SQL
GRANT CREATE EXTERNAL TABLE ON EXTERNAL LOCATION <location_name> TO <principal>;
```

```py:Python
spark.sql("GRANT CREATE EXTERNAL TABLE ON EXTERNAL LOCATION <location_name> TO <principal>")
```

```r:R
library(SparkR)

sql("GRANT CREATE EXTERNAL TABLE ON EXTERNAL LOCATION <location_name> TO <principal>")
```

```scala:Scala
spark.sql("GRANT CREATE EXTERNAL TABLE ON EXTERNAL LOCATION <location_name> TO <principal>")
```

外部ロケーションからファイルを読み込む権限を与えるには以下を実行します。

```sql:SQL
GRANT READ FILES ON EXTERNAL LOCATION <location_name> TO <principal>;
```

```py:Python
spark.sql("GRANT READ FILES ON EXTERNAL LOCATION <location_name> TO <principal>")
```

```r:R
library(SparkR)

sql("GRANT READ FILES ON EXTERNAL LOCATION <location_name> TO <principal>")
```

```scala:Scala
spark.sql("GRANT READ FILES ON EXTERNAL LOCATION <location_name> TO <principal>")
```

:::note info
**注意**
グループ名にスペースが含まれている場合、(アポストロフィではなく)バックティックで囲んでください。
:::

## 外部ロケーションのオーナーの変更

外部ロケーションの作成者が最初のオーナーとなります。オーナーを別のアカウントレベルユーザー、グループに変更するには、ノートブックあるいはDatabricks SQLのSQLエディタで以下のコマンドを実行してください。あるいは、[Data Explorer](https://docs.databricks.com/data/manage-ownership.html)を使用してください。プレースホルダーの値を置き換えてください。

- `<location_name>`: 外部ロケーションの名前
- `<principal>`: アカウントレベルユーザーのメールアドレス、アカウントレベルグループの名前

```sql:SQL
ALTER EXTERNAL LOCATION <location_name> OWNER TO <principal>;
```

## 外部ロケーションの削除

ノートブックかDatabricks SQLのエディタで以下のコマンドを実行します。`<location_name>`を外部ロケーションの名前で置き換えてください。コマンドのブラケット内の部分はオプションです。

```sql:SQL
DROP EXTERNAL LOCATION [IF EXISTS] <location_name>;
```

```py:Python
spark.sql("DROP EXTERNAL LOCATION [IF EXISTS] <location_name>")
```

```r:R
library(SparkR)

sql("DROP EXTERNAL LOCATION [IF EXISTS] <location_name>")
```

```scala:Scala
spark.sql("DROP EXTERNAL LOCATION [IF EXISTS] <location_name>")
```

# 次のステップ

- [テーブルの作成](https://docs.databricks.com/data-governance/unity-catalog/create-tables.html)
- [ビューの作成](https://docs.databricks.com/data-governance/unity-catalog/create-views.html)


### Databricks 無料トライアル

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