今回はAzure Blob Storageを操作するために、APEXのWeb資格証明を作成します。作成したWeb資格証明をAPEX_WEB_SERVICE.MAKE_REST_REQUESTに与えて、Azure Blob Storageを操作します。
前回の記事で準備したストレージアカウントおよびコンテナーをそのまま使用します。
Microsoft Entra IDの概要を開きます。テナントIDはOAuth2認証で呼び出すトークンURLに含めるため、記録しておきます。
サービスプリンシパルとなるアプリケーションを登録します。
アプリの登録を開きます。
登録をクリックします。
アプリケーション(クライアント)IDは、APEXのWeb資格証明に設定する値なので記録しておきます。
クライアントシークレットを開き、新しいクライアントシークレットをクリックします。
追加されたクライアントシークレットの値をコピーします。シークレットIDではありません。この値はAPEXでWeb資格証明を作成する際に使用します。
作成直後しか値を参照することはできないので、忘れずにコピーして記録しておきます。
APIのアクセス許可を開き、アクセス許可を追加します。
アクセス許可の追加をクリックします。
APIアクセス許可の要求が開きます。
Microsoft APIのAzure Storageを選択します。
アクセス許可のuser_impersonationにチェックを入れます。
アクセス許可の追加をクリックします。
アクセス許可としてuser_impersonationが追加されます。
これをクリックして開き、Resource App IDを確認します。
Resource App IDをコピーします。この値がOAuth2認証のスコープになります。
アクセス制御(IAM)を開き、ロールの割り当ての追加をクリックします。
割り当てるロールとしてストレージBLOBデータ所有者を選択します。
次へ進みます。
メンバーを選択するをクリックして、メンバーとして先ほど作成したアプリケーションAzure for APEXを選択します。
レビューと割り当てをクリックします。レビュー画面が表示されるので、再度レビューと割り当てをクリックします。
APEXの作業に移ります。
ワークスペース・ユーティリティのWeb資格証明を開きます。
作成をクリックします。
名前はAzure for APEX、静的IDはAZURE_FOR_APEXとします。認証タイプにOAuth2クライアント資格証明フローを選択します。
OAuthスコープとしてAPIのアクセス許可のuser_impersonationのResource App IDの末尾に/.defaultを加えた文字列を設定します。
クライアントIDまたはユーザー名には、アプリケーションAzure for APEXのアプリケーション(クライアント)IDを設定します。
クライアント・シークレットまたはパスワードに、クライアントシークレットの値を設定します。
作成をクリックします。
Web資格証明としてAzure for APEXが作成されました。
以上でAPEXからAzure Blob Storageを操作する準備ができました。
SQLワークショップのSQLコマンドから、Azure Blob Storageの操作を行います。
最初にファイルをアップロードします。以下のコードを実行します。
引数p_token_urlにOAuth2のアクセス・トークンを要求するURLを与えます。テナントIDの部分を置き換える必要があります。また、ストレージアカウントやコンテナーも環境に合わせて置き換えます。
本文がmy first uploadであるファイルをtest.txtとしてアップロードしています。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
declare | |
l_url varchar2(400) := 'https://oracleapex2024.blob.core.windows.net/my-apex-files/test.txt'; | |
l_response clob; | |
l_clob clob; | |
l_blob blob; | |
begin | |
l_clob := 'my first upload'; | |
l_blob := apex_util.clob_to_blob(l_clob); | |
apex_web_service.clear_request_headers; | |
apex_web_service.set_request_headers('Content-Type','text/plain',p_reset => false); | |
apex_web_service.set_request_headers('x-ms-version','2020-04-08',p_reset => false); | |
apex_web_service.set_request_headers('x-ms-blob-type','BlockBlob',p_reset => false); | |
l_response := apex_web_service.make_rest_request( | |
p_url => l_url | |
,p_http_method => 'PUT' | |
,p_body_blob => l_blob | |
,p_credential_static_id => 'AZURE_FOR_APEX' | |
,p_token_url => 'https://login.microsoftonline.com/[テナントID]/oauth2/v2.0/token' | |
); | |
dbms_output.put_line(l_response); | |
end; |
ファイルtest.txtがアップロードされたかどうか確認します。コンテナーに含まれるBlobを一覧します。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
declare | |
l_url varchar2(400) := 'https://oracleapex2024.blob.core.windows.net/my-apex-files?restype=container&comp=list'; | |
l_response clob; | |
begin | |
apex_web_service.clear_request_headers; | |
apex_web_service.set_request_headers('Content-Type','application/xml',p_reset => false); | |
apex_web_service.set_request_headers('x-ms-version','2020-04-08',p_reset => false); | |
l_response := apex_web_service.make_rest_request( | |
p_url => l_url | |
,p_http_method => 'GET' | |
,p_credential_static_id => 'AZURE_FOR_APEX' | |
,p_token_url => 'https://login.microsoftonline.com/[テナントID]/oauth2/v2.0/token' | |
); | |
dbms_output.put_line(l_response); | |
end; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
declare | |
l_url varchar2(400) := 'https://oracleapex2024.blob.core.windows.net/my-apex-files/test.txt'; | |
l_response clob; | |
begin | |
apex_web_service.clear_request_headers; | |
apex_web_service.set_request_headers('Content-Type','text/plain',p_reset => false); | |
apex_web_service.set_request_headers('x-ms-version','2020-04-08',p_reset => false); | |
l_response := apex_web_service.make_rest_request( | |
p_url => l_url | |
,p_http_method => 'GET' | |
,p_credential_static_id => 'AZURE_FOR_APEX' | |
,p_token_url => 'https://login.microsoftonline.com/[テナントID]/oauth2/v2.0/token' | |
); | |
dbms_output.put_line(l_response); | |
end; |
ファイルの内容としてmy first uploadが表示されます。
ファイルtest.txtを削除します。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
declare | |
l_url varchar2(400) := 'https://oracleapex2024.blob.core.windows.net/my-apex-files/test.txt'; | |
l_response clob; | |
begin | |
apex_web_service.clear_request_headers; | |
apex_web_service.set_request_headers('x-ms-version','2020-04-08',p_reset => false); | |
l_response := apex_web_service.make_rest_request( | |
p_url => l_url | |
,p_http_method => 'DELETE' | |
,p_credential_static_id => 'AZURE_FOR_APEX' | |
,p_token_url => 'https://login.microsoftonline.com/[テナントID]/oauth2/v2.0/token' | |
); | |
dbms_output.put_line(l_response); | |
end; |