シークレット・コンテンツを取得するPL/SQLファンクションの作成
引数としてシークレットのOCIDを渡して実行するとシークレット・コンテンツを返すファンクションget_secret_contentを作成します。
処理の内容は以下のコードのコメントを参照してください。
get_secret
CREATE OR REPLACE FUNCTION get_secret_content( secret_ocid VARCHAR2 )
RETURN VARCHAR2
IS
-- 変数の宣言
region VARCHAR2(100);
request_uri VARCHAR2(200);
resp DBMS_CLOUD_TYPES.resp;
secret_base64 VARCHAR2(1000);
secret_text VARCHAR2(1000);
BEGIN
-- リージョン識別子を取得
SELECT JSON_VALUE(cloud_identity, '$.REGION') INTO region FROM v$pdbs;
-- APIコール用のURIを生成
request_uri := 'https://secrets.vaults.'||region||'.oci.oraclecloud.com/20190301/secretbundles/'||secret_ocid;
-- シークレット・バンドルを取得するAPIをGETメソッドでコール
resp := DBMS_CLOUD.SEND_REQUEST(
credential_name => 'OCI$RESOURCE_PRINCIPAL',
uri => request_uri,
method => DBMS_CLOUD.METHOD_GET
);
-- APIコールのレスポンスからBASE64でエンコードされているシークレット・コンテンツを取得
secret_base64 := JSON_VALUE(DBMS_CLOUD.GET_RESPONSE_TEXT(resp), '$.secretBundleContent.content');
-- BASE64でエンコードされているシークレット・コンテンツをデコード
secret_text := UTL_RAW.CAST_TO_VARCHAR2(UTL_ENCODE.BASE64_DECODE(UTL_RAW.CAST_TO_RAW(secret_base64)));
-- デコードしたシークレット・コンテンツを返す
RETURN secret_text;
END;
/
Database ActionsやSQL*Plusから実行してファンクションget_secret_content作成します。
SQL> CREATE OR REPLACE FUNCTION get_secret_content( secret_ocid VARCHAR2 )
2 RETURN VARCHAR2
3 IS
4 region VARCHAR2(100);
5 request_uri VARCHAR2(200);
6 resp DBMS_CLOUD_TYPES.resp;
7 secret_base64 VARCHAR2(100);
8 secret_text VARCHAR2(100);
9 BEGIN
10 SELECT JSON_VALUE(cloud_identity, '$.REGION') INTO region FROM v$pdbs;
11 request_uri := 'https://secrets.vaults.'||region||'.oci.oraclecloud.com/20190301/secretbundles/'||secret_ocid;
12 resp := DBMS_CLOUD.SEND_REQUEST(
13 credential_name => 'OCI$RESOURCE_PRINCIPAL',
14 uri => request_uri,
15 method => DBMS_CLOUD.METHOD_GET
16 );
17 secret_base64 := JSON_VALUE(DBMS_CLOUD.GET_RESPONSE_TEXT(resp), '$.secretBundleContent.content');
18 secret_text := UTL_RAW.CAST_TO_VARCHAR2(UTL_ENCODE.BASE64_DECODE(UTL_RAW.CAST_TO_RAW(secret_base64)));
19 RETURN secret_text;
20 END;
21 /
ファンクションが作成されました。
SQL>
問題なく作成できました。
作成したPL/SQLファンクションの実行
こちらの記事で作成したシークレットのOCIDを引数に指定して、ファンクションget_secret_contentを実行してみます。
SQL> SELECT get_secret_content('ocid1.vaultsecret.oc1.ap-tokyo-1.a*******************************************q') secret FROM dual;
SECRET
--------------------------------------------------------------------------------
Demo#1Demo#1
OCIボールト・シークレット内のシークレット・コンテンツの値が取得できました。