[OCI]Azure ADのサービス・プリンシパルを使用してAutonomous DatabaseからAzure Blob Storageにアクセスし、データを参照してみた


# 1. Azure Active DirectoryのテナントIDの確認
Azureポータルにアクセスして、Azure Active DirectoryのテナントIDを確認し、メモしておきます。
![スクリーンショット 2022-10-17 16.32.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/5e3b86a4-0502-83c9-d58b-402512712d53.png)

# 2. Azure Blob Storageの準備
Azureポータルで「ストレージアカウント」に移動します。
![スクリーンショット 2022-10-17 17.44.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/d78e7247-9036-2657-b50c-6d4f10ebc9f1.png)
左のメニューの「データストレージ」にある「コンテナー」をクリックします。
![スクリーンショット 2022-10-17 17.44.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/469695b8-cfab-1463-1d29-7582ac705686.png)
「＋コンテナー」をクリックします。
![スクリーンショット 2022-10-17 17.48.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/d8a8cb95-3844-c332-fc84-06b67048488c.png)
作成するコンテナーの名前（ここでは「container-for-autonomous-database」）を入力し、「作成」をクリックします。
![スクリーンショット 2022-10-17 17.50.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/7c262d0a-ee86-094e-dd85-9d09ff5be113.png)
作成されたコンテナー名をクリックします。
![スクリーンショット 2022-10-17 17.53.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/3bd36789-452a-3d95-0814-a9fcd21e5d0d.png)
「アップロード」をクリックします。
![スクリーンショット 2022-10-17 17.54.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/969f8a51-9125-dbe2-8509-49a870cc63f2.png)
以下のようなファイル「testdata.txt」を作成します。
```text:testdata.txt
1,Paul
2,John
3,George
4,Ringo
```
ファイルを選択し、「アップロード」をクリックします。
![スクリーンショット 2022-10-17 17.56.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/5a291236-2dad-b02f-a2da-73bfa479412b.png)
コンテナー「container-for-autonomous-database」にファイル「testdata.txt」がアップロードされました。
![スクリーンショット 2022-10-17 18.10.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/ebf037a3-058b-02a8-af39-537b75a0aa4f.png)


# 3. Azure ADのサービス・プリンシパルを使用した認証の有効化
adminユーザとして、Autonomous Databaseに接続します。
```
[opc@swingbench ~]$ sqlplus admin/Demo#1Demo#1@atp1_medium

SQL*Plus: Release 21.0.0.0.0 - Production on 木 10月 13 10:26:57 2022
Version 21.7.0.0.0

Copyright (c) 1982, 2022, Oracle.  All rights reserved.

最終正常ログイン時間: 水 10月 12 2022 14:38:22 +09:00


Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.17.0.1.0
に接続されました。
SQL> 
```
Autonomous DatabaseでAzureのサービスアカウントを有効化するには、providerに'AZURE'、paramsのazure_tenantidにAzure Active DirectoryのテナントIDを指定してDBMS_CLOUD_ADMIN.ENABLE_PRINCIPAL_AUTHプロシージャを実行します。
```
BEGIN
    DBMS_CLOUD_ADMIN.ENABLE_PRINCIPAL_AUTH(
        provider => 'AZURE',
        params   => JSON_OBJECT('azure_tenantid' value 'Azure ADのテナントID'));
END;
/
```
paramsのazure_tenantidに1.で確認したAzure Active DirectoryのテナントIDをセットして、DBMS_CLOUD_ADMIN.ENABLE_PRINCIPAL_AUTHプロシージャを実行します。
```
SQL> BEGIN
  2      DBMS_CLOUD_ADMIN.ENABLE_PRINCIPAL_AUTH(
  3          provider => 'AZURE',
  4          params   => JSON_OBJECT('azure_tenantid' value 'a88eXXXX-0eXX-4bXX-b3XX-5cdbceXXXXXX')
  5      );
  6  END;
  7  /

PL/SQLプロシージャが正常に完了しました。

SQL>
```

cloud_integrationsビューを検索して、設定に必要なazure_app_name、azure_consent_urlの値を確認し、メモしておきます。
```
SQL> set pagesize 20
SQL> set linesize 200
SQL> col param_name for a20
SQL> SELECT param_name, param_value FROM cloud_integrations WHERE param_name LIKE 'azure%';

PARAM_NAME
--------------------
PARAM_VALUE
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
azure_app_name
ADBS_APP_OCID1.AUTONOMOUSDATABASE.OC1.AP-TOKYO-1.ANXHILJRSSL65IQAWFH2EIJ5VHOBLXXXXXXXXXXXXXXXXXXXXXXXXXX

azure_consent_url
https://login.microsoftonline.com/a88eXXXX-0eXX-4bXX-b3XX-5cdbceXXXXXX/oauth2/v2.0/authorize?client_id=f21dXXXX-d3XX-41XX-85XX-597c3bedXXXX&response_type=code&scope=User.read

azure_tenantid
a88eXXXX-0eXX-4bXX-b3XX-5cdbceXXXXXX


SQL>
```

# 4. Azure ADの同意ページへのアクセス
ブラウザから、3.でコピーしたazure_concent_urlのURLにアクセスします。
「組織の代理として同意する」のチェックをオンにし、「承諾」をクリックします。
![スクリーンショット 2022-10-14 11.20.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/9722a5e5-8701-dcb2-da16-3897380cfdbb.png)
これにより、Autonomous DatabaseがAzure ADにアプリケーションとして登録され、サービス・プリンシパルが利用できるようになります。

# 5. サービス・プリンシパルを使用したAzure Blob Storageへのアクセス許可
Azureポータルでストレージアカウントの概要画面に移動します。
![スクリーンショット 2022-10-17 16.57.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/e4d450b1-575f-8a4c-8f93-dbcb6013f469.png)
左のメニューから「アクセス制御（IAM）」に移動します。
![スクリーンショット 2022-10-17 16.57.38のコピー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/4d7ce27c-2ce4-39d8-f7ca-76a625b5b777.png)
「追加」をクリックし、「ロールの割り当ての追加」をクリックします。
![スクリーンショット 2022-10-17 17.16.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/4b10f4dc-a9b5-c1a0-5d12-c37913a49fc6.png)
検索窓に「ストレージ」と入力し、表示された「ストレージ BLOB データ共同作成者」を選択して、「次へ」をクリックします。
![スクリーンショット 2022-10-17 17.02.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/36078f8d-7fa2-9504-3d65-592d25f82be6.png)
「メンバーを選択する」をクリックします。
![スクリーンショット 2022-10-17 17.05.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/7a13fdad-f583-1681-a2a5-a645cf69617a.png)
「選択」欄に3.でコピーしたazure_app_nameの値を入力し、表示されたアプリケーションをクリックして選択します。
![スクリーンショット 2022-10-17 17.08.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/878aad81-801a-a32e-364f-910ad6788525.png)
「選択」をクリックします。
![スクリーンショット 2022-10-17 17.10.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/e6f5f59e-4a12-281c-e42e-00d60ef6d8a3.png)
ウインドウ下部の「レビューと割り当て」をクリックします。
![スクリーンショット 2022-10-17 17.11.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/5a60fcaf-fe09-95e1-a4c0-6df3811a18fe.png)
設定内容を確認し、問題がなければウインドウ下部の「レビューと割り当て」をクリックして、ロールの割り当てを追加します。
![スクリーンショット 2022-10-17 17.12.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/e73e5856-a205-816d-474d-4364057e695b.png)


# 6. サービス・プリンシパルを用いたAzure Blob Storageへのアクセス
準備が整ったので、サービス・プリンシパルを使用して、Autonomous DatabaseからAzure Blob Storageのコンテナーにアクセスし、バケット内のオブジェクト一覧を取得してみます。

Azure Blob Storageのコンテナー内のオブジェクト一覧を取得するには、以下のような構文でDBMS_CLOUD.LIST_OBJECTSファンクションを使用します。
クレデンシャルには、「AZURE$PA」を指定します。
location_uriには、以下のような形式でAzure Blob Storageのコンテナーを指定します。
`https://ストレージアカウント名.blob.core.windows.net/コンテナー名/`
```
SELECT object_name FROM DBMS_CLOUD.LIST_OBJECTS(
           credential_name => 'AZURE$PA',
           location_uri    => 'https://ストレージアカウント名.blob.core.windows.net/コンテナー名/');
```
コンテナーのURIを指定して実行してみます。
```
SQL> SELECT object_name FROM DBMS_CLOUD.LIST_OBJECTS(
  2      credential_name => 'AZURE$PA',
  3      location_uri    => 'https://storageaccountofmine.blob.core.windows.net/container-for-autonomous-database/'
  4  );

OBJECT_NAME
--------------------------------------------------------------------------------
testdata.txt

SQL>
```
サービス・プリンシパルを使用してAzure Blob Storageのコンテナーにアクセスし、先ほどアップロードしたtestdata.txtが格納されていることが確認できました。

次に、DBMS_CLOUD.CREATE_EXTERNAL_TABLEプロシージャでAzure Blob Storageのコンテナー内にあるオブジェクト（ファイル）「testdata.txt」をもとにした外部表を作成し、testdata.txt内のデータをAutonomous Databaseから参照してみます。

file_uri_listには、以下のような形式でバケット内のオブジェクト（ファイル）を指定します。
`https://ストレージアカウント名.blob.core.windows.net/コンテナー名/ファイル名`

```
BEGIN
    DBMS_CLOUD.CREATE_EXTERNAL_TABLE(
        table_name =>'作成するテーブル名',
        credential_name =>'AZURE$PA',
        file_uri_list =>'https://ストレージアカウント名.blob.core.windows.net/コンテナー名/ファイル名',
        format => json_object('delimiter' value ','), -- ファイル内の列のデリミタを指定
        column_list => 'ID NUMBER, name VARCHAR2(20)' -- 表の列定義を指定
    );
END;
/
```
テーブル名をmember_azureとし、オブジェクト（ファイル）のURIを指定して、上記のSQLを実行してみます。
```
SQL> BEGIN
  2      DBMS_CLOUD.CREATE_EXTERNAL_TABLE(
  3          table_name =>'member_azure',
  4          credential_name =>'AZURE$PA',
  5          file_uri_list =>'https://storageaccountofmine.blob.core.windows.net/container-for-autonomous-database/testdata.txt',
  6          format => json_object('delimiter' value ','),
  7          column_list => 'ID NUMBER, name VARCHAR2(20)'
  8      );
  9  END;
 10  /

PL/SQLプロシージャが正常に完了しました。

SQL>
```
サービス・プリンシパルを使用して、Azure Blob Storageのコンテナー内にあるオブジェクト（ファイル）「testdata.txt」をもとにした外部表「member_azure」が作成できました。

外部表「member_azure」の内容を確認してみます。
```
SQL> SELECT * FROM member_azure;

	    ID NAME
---------- --------------------
	     1 Paul
	     2 John
	     3 George
	     4 Ringo

SQL>
```
Azure ADのサービス・プリンシパルを使用して作成した外部表「member_azure」経由で、Azure Blob Storageのコンテナー内にあるオブジェクト（ファイル）「testdata.txt」の内容を参照できることが確認できました。

# 7. Autonomous DatabaseでAzureのサービスプリンシパルを無効化

Autonomous DatabaseでAzureのサービスアカウントを無効にするには、providerに'AZURE'を指定してDBMS_CLOUD_ADMIN.DISABLE_PRINCIPAL_AUTHプロシージャを実行します。
```
BEGIN
    DBMS_CLOUD_ADMIN.DISABLE_PRINCIPAL_AUTH(
        provider => 'AZURE' );
END;
/
```

# 参考資料
[Use Azure Service Principal to Access Azure Resources](https://docs.oracle.com/en/cloud/paas/autonomous-database/adbsa/azure-service-principal.html#GUID-29ED76DB-8202-44B3-9ADF-D5352334D7B4)