0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

[OCI]OCIボールト・シークレット内のシークレット・コンテンツを取得するPL/SQLファンクションを作成してみた

Posted at

シークレット・コンテンツを取得する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ボールト・シークレット内のシークレット・コンテンツの値が取得できました。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?