関数の開発

APIゲートウェイ・デプロイメントをデプロイする前に、関数を開発してデプロイする必要があります。

ビジネス・ロジックについて

実装の重要性は、ファンクションにコードを入れることです。このコードは、必要に応じて複雑になり、複数のエンドポイントを呼び出したり、場合によっては集計を実行したりすることができます。ビジネス・ロジック・ファンクションは、Oracle Cloud Infrastructure API Gatewayで必要に応じてコールされるコードです。

このアーキテクチャの例では、APIゲートウェイがOracleファンクションをコールして、REST APIを介してOracle Fusion Applications Cloud Serviceから一部のデータを問い合せ、処理してユーザーに戻します。関数自体を記述するときは、目的のフレームワークを使用できますが、サーバーの機能が少ない場合のフレームワークの影響を理解しておく必要があります。この例では、Javaを言語として使用し、Apache HttpClientライブラリをREST Serviceに接続しています。Apacheライブラリは、使いやすく実装も簡単でしたが、Java 11では現在、使用可能な新しいHTTPクライアントが用意されています。

また、REST apiをコールする際に、多数のインメモリー・オブジェクトをインスタンス化するフレームワークを回避する必要があります。これは、これらのオブジェクトが各コールで破棄され、関数の実行が遅くなるためです。

ユーザー名およびロールの取得について

Oracle Cloud Infrastructure APIゲートウェイによって関数がコールされると、ゲートウェイはHTTPヘッダーを使用して一部のメタデータをコールに挿入します。これらのヘッダーには、Functions SDKを使用してアクセスできます。

たとえば、次のJavaコードのスニペット(このソリューション・プレイブックで提供されるサンプル・コードでは、クラスJWTUtilsから抜粋)では、認証トークンを抽出し、デコードしてから、本体の一部としてコール元に戻します。

public OutputEvent handleRequest(InputEvent rawInput) {
        Optional<string> optionalToken=rawInput.getHeaders().get("Fn-Http-H-Authorization");
        if (!optionalToken.isPresent())
        {
            throw new Exception("No Authentication Bearer token found");
        }
        String jwtToken=optionalToken.get().substring(TOKEN_BEARER_PREFIX.length());
    String[] split_string = jwtToken.split("\\.");
        String base64EncodedHeader = split_string[0];
        String base64EncodedBody = split_string[1];
        String base64EncodedSignature = split_string[2];
        byte[] decodedJWT = Base64.getDecoder().decode(base64EncodedBody);
        try {
            String JSONbody = new String(decodedJWT, "utf-8");
            ObjectMapper mapper = new ObjectMapper();
            JsonNode root=mapper.readTree(JSONbody);
            username=root.get("sub").asText();
            System.out.println(“Username = “+username);
 
        } catch (Exception e)
        {
            Throw new Exception (e.getMessage());
        }
    Return OutputEvent.fromBytes(
            username.getBytes(), // Data
            OutputEvent.Status.Success,// Any numeric HTTP status code can be used here
            "text/plain");

ユーザー名は、必要に応じてビジネス・ロジックを実装するために関数内で使用できます。ロールは認証トークンでは使用できませんが、REST apiを使用してOracle Identity Cloud Serviceから問合せできます。

Oracle API Gatewayが関数をコールすると、いくつかの有用なヘッダーも送信されます。これらのヘッダーは、関数のAPIを使用して読み取ることができます。関数Developerキットから使用できる有用なヘッダーには、次のものがあります。

たとえば、Fn - Http - odとFn - Http - questrlの組合せを使用して、コード内にルーターを実装し、関数がどのようにコールされたか(PUT、PATCHなど)に基づいて、異なる関連項目を処理できます。このアプローチは「Serverless Service」パターンと呼ばれることが多く、開発者がより少ない関数を保持する必要があるという利点があり、各関数には、必要な作業を決定するためにわずかなルーターがあります。

public OutputEvent handleRequest(InputEvent rawInput, HTTPGatewayContext hctx) throws JsonProcessingException {
  String httpMethod = hctx.getMethod();
  String httpRequestURI = hctx.getRequestURL();
   // etc
}   

JWTアサーション・アクセス・トークンを使用したOracle Fusion Applications Cloud Serviceのコールについて

着信認可ヘッダーのサブジェクトを使用して、Oracle FunctionsからJWTアサーションを実装する必要があります。

このソリューション・プレイブックで提供されるサンプル機能では、idcsOAuthAsserterという名前のヘルパー・ライブラリを使用して、このセキュリティ・プロセスを実行できます。ヘルパー・ライブラリは、Oracle Fusion Applications Cloud Serviceを起動する前にベアラー・トークンの交換を実行することで、OAuthアサーションの完全なフローを実行します。このライブラリは、サンプル関数と統合されています。

この関数では、OAuth JWTアサーションを使用して新しいベアラー・アクセス・トークンを作成するために、Oracle Identity Cloud Serviceの起動に使用されるユーザーおよびクライアントのアサーションを構築するために、秘密キーと公開証明書が必要です。

idcsOAuthAsserterライブラリには、「関数の構成」で定義できるプロパティがいくつか必要です。次の表の変数はすべて必須です:

構成名 説明
IDCS_URL Oracle Identity Cloud ServiceインスタンスのURL https ://<アイデンティティ・クラウドhostname.identity.oraclecloud.com >
CLIENT_ID Oracle FunctionsおよびOracle API Gatewayに関連付けられたOracle Identity Cloud Serviceアプリケーション・クライアントID 1a2b3c4d5e6f7g8h9i01j2k3l4m5o6p7
KEY_ID 信頼できるOracle Identity Cloud Serviceアプリケーションにインポートされた証明書の別名 fnassertionkey
スコープ このスコープは、Oracle Fusion Applications Cloud Serviceに関連付けられているOracle Identity Cloud ServiceアプリケーションであるターゲットOAuthリソースと一致する必要があります urn: opc: resource: fa: instanceid = xxxxxxurn: opc: resource: consumer :: all https ://my_fusion_hostname: 443/
対象読者 アサーション・プロセスの対象者。複数の入力値はカンマで区切ります。 myhostname.identity.oraclecloud.com, https://myfusionservice.dc1.oraclecloud.com
IDDOMAIN Oracle Fusion Applications Cloud Serviceインスタンス・テナントの名前 mytenant

この関数では、idcsOAuthAsserterに関連するアサーションのシークレットにアクセスするための構成プロパティも必要です。JWTアサーションでは、クライアントおよびユーザー・アサーションを生成するために、証明書および秘密キーが必要です。このファンクションは、V_KEYSTOREで指定されたOCIDでキーストアを取得します。その情報を取得するための別名は、構成内のKEY_ID値と一致している必要があります。キーストアと秘密キーの両方のパスフレーズは、V_KS_PASSおよびV_PK_PASSで指定されたOCIDsを使用して、Oracle Cloud Infrastructure Vault Secrets Serviceから取得する必要があります。

構成名 説明
V_KEYSTORE キーストアのセキュア・ストアド・コンテンツを含むシークレット ocid1.vaultsecret.oc1.dc1.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
V_KS_PASS キーストアのセキュア・ストアド・パスワードを含むシークレット ocid1.vaultsecret.oc1.dc1.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
V_PK_PASS 秘密キーのセキュア・ストアド・パスワードを含むシークレット ocid1.vaultsecret.oc1.dc1.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

サポートされる追加の構成値は、プロパティUSE_CACHE_TOKENで、デフォルトではTrueに設定されています。このプロパティを使用すると、トークンが有効な場合に、生成されたOracle Identity Cloud Serviceアサーション・トークンをOracle Fusion Applications Cloud Serviceの将来の呼出しで再利用できます。キャッシュされたトークンは、サブジェクトを着信トークンと比較し、有効期限を検証してまだ有効かどうかを確認することによって、使用前に検証されます。そうでない場合は、OAuthアサーションを使用して新しいアクセス・トークンがリクエストされます。この機能は、USE_CACHE_TOKENFalseに設定することで無効にできます。

実装する関数は、idcsOAuthAsserterライブラリのSecurityHelper objectを使用して、access-tokenヘッダーからサブジェクトを抽出し、OAuth JWTアサーションを使用して新しいベアラー・アクセス・トークンを生成し、新しいアクセス・トークンをAuthorizationヘッダーとして使用してリクエストをOracle Fusion Applications Cloud Serviceに送信できます。

ソース・コード・サンプル内の関数saasopportunitiesfnは、idcsOAuthAsserterライブラリとすでに統合されています。次のコード・スニペットは、サンプルのファンクションのhandleRequestメトリックで使用できます。このサンプル・ファンクションは、idcsOAuthAsserterのオブジェクトを初期化し、Oracle Identity Cloud Serviceを使用してアサーションを使用してトークンの欠如を実行する方法を示しています。

// Full Oauth scenario Perform exchange of tokens
if(fullOAauth) {
    LOGGER.log(Level.INFO, "Full Oauth Assertion scenario - Perform exchange of tokens");
    SecurityHelper idcsSecurityHelper = new SecurityHelper(context)                   // Initialize SecurityHelper with RuntimeContext
                                        .setOciRegion(Region.US_PHOENIX_1)            // Specify the OCI region, used to retrieve Secrets.
                                        .extractSubFromJwtTokenHeader(rawInput);      // Extracts the subject from Token in Fn-Http-H-Authorization.
 
    // Get OAuth Access token with JWT Assertion using the principal extracted from Fn-Http-H-Access-Token Header
    jwttoken = idcsSecurityHelper.getAssertedAccessToken();
    LOGGER.log(Level.INFO, "Successfully token retrived with IDCS Assertion");
    LOGGER.log(Level.FINEST, "Access Token from assertion [" + jwttoken + "]");
}

このスニペットでは、オブジェクトSecurityHelperRuntimeContextタイプのコンテキスト・オブジェクトで初期化されていることに注意してください。これは、idcsOAuthAsserterヘルパー・ライブラリの構成でSecurityHelperを初期化するために使用されます。

例のsaasopportunitiesfn関数はUS_PHOENIX_1領域を使用するように設定されているため、地域を指すようにスニペット内に表示されているメソッドsetOciRegionの地域を変更する必要があります。

また、SecurityHelperには、handleRequestファンクション・メソッドからInputEventオブジェクトを取り、API Gateway AuthorizationヘッダーにあるBearerトークンを抽出するメソッドextractSubFromJwtTokenHeaderもあります。その後、Oracle Identity Cloud Serviceアサーションの結果としてアクセス・トークンを取得できる必要があります。

idcsOAuthAsserterの使用方法および関数との統合の詳細は、コード・リポジトリでidcsOAuthAsserterのREADMEファイルを参照し、ダウンロード可能なコード・サンプルとともにこのソリューション再生ブックを参照してください。

構成パラメータの設定

Oracle Functions環境には、Oracle Cloud Infrastructure環境内でいくつかのパラメータを定義し、それらをコードから参照できる、非常に便利な機能があります。

このユースケースでは、FusionおよびOverrideJWTトークンURL、およびコードで使用されるパラメータとしてのfull_oauthというフラグを設定します。パラメータを追加するには:

  1. コマンドラインの使用:

    fn config function cloudnativesaas saasopportunitiesfn fusionhost <value>

    fn config function cloudnativesaas saasopportunitiesfn overridejwt <value>

    fn config function cloudnativesaas saasopportunitiesfn full_oauth <value>

  2. コンソールから:
    1. 開発者サービス」を選択して、「ファンクション」を選択します。
    2. アプリケーション」で、関数を選択します。
    3. リソース」セクションで、「構成」を選択します。
    4. 次のアイテムのキーと値のペアを入力し、プラス・アイコンをクリックしてパラメータとして追加します。
      • fusion URL (キーfusionhost)
      • OverrideJWTトークンURL (key overridejwt)
      • OAuthのフル・フラグ(キーfull_oauth)を使用
  3. デプロイメント時の関数yamlファイルからの場合:
    config:
      fusionhost: <value>
      overridejwt: <value>
      full_oauth: <value>

コード内では、特殊なJava注釈(@FnConfiguration)を使用し、コンテキスト変数を介してパラメータにアクセスすることで、SDK関数を使用して次の構成変数にアクセスできます。

private String jwtoverride = "";
    private String fusionHostname = "";
    private String fnURIBase ="/fnsaaspoc/opportunities";
    /**
     * @param ctx : Runtime context passed in by Fn
     */
    @FnConfiguration
    public void config(RuntimeContext ctx) {
        fusionHostname = ctx.getConfigurationByKey("fusionhost").orElse("NOTSET");
        jwtoverride = ctx.getConfigurationByKey("overridejwt").orElse("NOTSET");
        fullOAauth = Boolean.parseBoolean(ctx.getConfigurationByKey("full_oauth").orElse("false"));
        LOGGER.info("Configuration read : jwt=" + jwtoverride + " saasurl=" + fusionHostname);
    }

さらに、このソリューションではidcsOAuthAsserterヘルパー・ライブラリが使用されるため、関数構成で、前の項で説明されている特定の変数を提供してOracle Identity Cloud Service OAuthアサーションを使用し、アクセス・トークンを交換する必要があります。このプロセスには複数の必須構成が必要なため、yamlのファイルアプローチを使用して関数の構成を設定することをお薦めします。次に例を示します。

config:
  AUDIENCE: <AUDIENCE_VALUES>
  CLIENT_ID: <YOUR_CLIENT_ID>
  IDCS_URL: <YOUR_IDCS_URL>
  IDDOMAIN: <YOUR_FA_TENANT_NAME>
  KEY_ID: <YOUR_IDCS_URL>
  SCOPE: <FA_RESOURCE_SCOPE>
  V_KEYSTORE: <YOUR_KS_OCID>
  V_KS_PASS: <YOUR_KSPASS_OCID>
  V_PK_PASS: <YOUR_PKPASS_OCID>
  fusionhost: <value>
  overridejwt: <value>
  full_oauth: <value>

Fusionアプリケーションへのユーザー認証トークンの受渡し

関数では、セキュアなREST API相互作用のユーザー認証トークンを処理する必要があります。

関数が呼び出されると、認証トークンを含む「authorization」ヘッダー変数も送信されます。このトークンは、コール元のアプリケーションのアイデンティティ・サーバー(Oracle Cloud Infrastructure APIゲートウェイ関数がリクエストの検証に使用しているアイデンティティ・サーバーと同じ)で生成されます。

このソリューションのプレイブックで説明するアプローチでは、Oracle Identity Cloud Service OAuth JWTアサーションを使用して、idcsOAuthAsserterヘルパー・ライブラリを使用してトークンの交換を実行します。これにより、Oracle FunctionsからOracle Fusion Applications Cloud Serviceへの起動用の追加のセキュリティ・レイヤーが提供されます。アーキテクチャ・ダイアグラムに示されているように、OAuth JWTアサーションを使用したトークンの問合せは、API Gatewayヘッダーからのインバウンド呼出しに含まれ、Oracle Identity Cloud Serviceを使用したアサーション処理中に別のトークンが示されるように使用されます。この新しいトークンは宛先サーバー(Oracle Fusion Applications Cloud Service)へのアウトバウンド・コールで使用されOracle Fusion Applications Cloud Serviceでは、Oracle Visual Builderでユーザーとしてコールが実行されます。

指定されたサンプル関数(saasopportunitiesfn)には、full_oauthという構成があります。これはデフォルトでTrueに設定されており、動作は前述のとおりです。

必要に応じて、 full_oauthFalseに設定できます。この場合、ファンクションは、API Gatewayヘッダーからのインバウンド・コールにあるトークンを問い合せて、Oracle Fusion Applications Cloud Serviceへのアウトバウンド・コールでそのトークンを再使用します。2番目のトークンは生成されません。

次のコード・スニペットはApache HTTPライブラリを使用し、渡された認証トークンを使用してOracle Fusion Applications Cloud Service REST APIを呼び出します。

String fusionURL=”<yourfusionresturl>”;
HttpClient client = HttpClients.custom().build();
HttpUriRequest request = RequestBuilder.get().setUri(fusionURL).
     setHeader(HttpHeaders.CONTENT_TYPE, "application/json").
     setHeader(HttpHeaders.AUTHORIZATION, "Bearer " + jwtToken).
     build();
HttpResponse response = client.execute(request);
responseJson = EntityUtils.toString(response.getEntity());
status = response.getStatusLine().getStatusCode();

関数のコンパイルおよびデプロイ

Oracle Functionsで、関数のアプリケーションを作成し、関数をデプロイします。

  1. ローカルのリポジトリに必要な依存性を生成するには、関数の前にidcsOAuthAsserterコードをコンパイルします。次に例を示します。
    $ cd <PATH_TO>/idcsOAuthAsserter
    $ mvn clean install
  2. yaml.funcと同じレベルで、libディレクトリが関数内に存在することを確認します。たとえば、この場合、ファンクション名はsaasopportunitiesfnです。必要なファイル idcsOAuthAsserter-1.0.0.jarおよびidcsOAuthAsserter-1.0.0.pomlib/ディレクトリに生成するために、Mavenコマンドを使用してコードをコンパイルします
    $ cd <PATH_TO>/saasopportunitiesfn
    $ mkdir -pv lib/
    $ mvn clean install
     
    $ ls lib/
    idcsOAuthAsserter-1.0.0.jar  idcsOAuthAsserter-1.0.0.pom
  3. 関数のidcsOAuthAsserterライブラリを統合するには、ドックレット・ファイルを使用する必要があります。関数saasopportunitiesfnの例は、次の例にすでに組み込まれたドックレット・ファイルを示しています。プロキシの背後でいる場合は、ENV MAVEN_OPTS行の内容を把握して、必要なプロキシ・プロパティを使用してドックレット・ファイルのプロパティを更新する必要がある場合があります。また、必要に応じて、Dockファイル内のプロキシ・プロパティMAVEN_OPTS変数も変更します。
    
    FROM fnproject/fn-java-fdk-build:jdk11-1.0.107 as build-stage
    WORKDIR /function
     
    COPY lib /function/lib
     
    # Uncomment this line and populate if you are behind a proxy
    # ENV MAVEN_OPTS -Dhttp.proxyHost=<ProxyHost> -Dhttp.proxyPort=<ProxyPort> -Dhttps.proxyHost=<ProxyHost> -Dhttps.proxyPort=<ProxyPort>
     
    ADD lib/idcsOAuthAsserter*.pom /function/pom.xml
    RUN ["mvn", "org.apache.maven.plugins:maven-install-plugin:2.5.2:install-file", "-Dfile=/function/lib/idcsOAuthAsserter-1.0.0.jar", "dependency:copy-dependencies", "-DincludeScope=runtime", "-DskipTests=false", "-Dmdep.prependGroupId=true", "-DoutputDirectory=target"]
     
    ADD pom.xml /function/pom.xml
    RUN ["mvn", "package", "dependency:copy-dependencies", "-DincludeScope=runtime", "-DskipTests=false", "-Dmdep.prependGroupId=true", "-DoutputDirectory=target"]
     
    ADD src /function/src
    RUN ["mvn", "package"]
    FROM fnproject/fn-java-fdk:jre11-1.0.107
    WORKDIR /function
    COPY --from=build-stage /function/target/*.jar /function/app/
     
    CMD ["<INSERT_FUNCTION_PACKAGE_AND_CLASSNAME>::handleRequest"]
  4. Oracle Functionsのコンパートメントにアプリケーションを作成します。
    1. ターミナル・ウィンドウで、次のように入力して新しいアプリケーションを作成します。
      $ fn create app <app-name> --annotation oracle.com/oci/subnetIds='["<subnet-ocid>"]'
      ここで、
      • <app-name>は新しいアプリケーションの名前です。機密情報を入力しないでください。
      • <subnet-ocid>は、ファンクションを実行するサブネット(最大3つ)のOCIDです。リージョナル・サブネットが定義されている場合、ベスト・プラクティスはそのサブネットを選択し、可用性ドメイン全体でフェイルオーバーを実装しやすくすることです。リージョナル・サブネットが定義されておらず、高可用性の要件を満たす必要がある場合は、複数のサブネットを指定します(各OCIDをカンマで区切り、'["<subnet-ocid>","<subnet-ocid>"]'の形式で囲みます)。Oracleでは、サブネットはFn Project CLIコンテキストで指定されているDockerレジストリと同じリージョンにあることをお薦めします。
    2. 次を入力して、新しいアプリケーションが作成されたことを確認します。
      $ fn list apps
  5. 関数をアプリケーションにデプロイします。次に例を示します。
    $ cd <PATH_TO>/saasopportunitiesfn 
    $ fn deploy --app myapplication --verbose

オプションで、Oracle Cloud Infrastructureでの認証ファンクションの定義

Oracle Cloud Infrastructure APIゲートウェイは、認証プロバイダとしてIDCSをネイティブでサポートしています。ただし、ゲートウェイではコール可能なファンクションの定義も許可されています。必要に応じて、この機能を使用してカスタム認証ファンクションを作成できます。

カスタム認証ファンクションはゲートウェイからのコールを受け取り、着信認可ヘッダーを渡します。ファンクションがtrueを戻す場合はファンクション・コールが許可され、反対にfalseを戻す場合はリクエストはHTTP 401エラー・コードを使用して拒否されます。この関数は、ソース・コード形式で指定され、関数内にデプロイされます。この関数は、そのOCIDを介してOCI API GATEWAYデプロイメント・ファイルで参照されます。コンソール内のデプロイ済ファンクションにナビゲートし、そのOCID列を展開することにより、OCIDを検出できます。関数をデプロイする前にResourceServerConfig.javaファイルを編集する必要があります。これにより、関数のOracle Identity Cloud Serviceへの接続方法および使用するOracle Identity Cloud Service OAuthアプリケーションが定義されます。

次の関数の例では、クライアント・シークレットなどの機密の値をハードコーディングすることを防止しています。コメント// KMS Key for IDCS Client Secretの下の4行で、コードによりOracle Cloud Infrastructureのキー管理機能であるOracle Cloud Infrastructure Vaultを使用してOAuthシークレットを復号化します。関数をデプロイする前に、Oracle Cloud Infrastructureコンソールにこれらの値を入力します。

  1. カスタム認証ファンクションを記述します。次に例を示します。
    package com.example.fn.idcs_ocigw.utils;
    import com.fnproject.fn.api.RuntimeContext;
    import java.util.logging.Logger;
    
    /**
     * It contains the resource server configuration and constants
     * Like a properties file, but simpler
     */
    public class ResourceServerConfig {
    
        public  final String CLIENT_ID;
        public  final String CLIENT_SECRET;
        public  final String IDCS_URL ;
        public  final String SCOPE_ID;
    
        //INFORMATION ABOUT IDENTITY CLOUD SERVICES
        public  final String JWK_URL;
        public  final String TOKEN_URL;
        public final String KMS_ENDPOINT;
        public final String KMS_IDCS_SECRET_KEY;
    
        //PROXY
        public  final boolean HAS_PROXY ;
        public  final String PROXY_HOST;
        public  final int PROXY_PORT;
        public  final String DEBUG_LEVEL;
        private static final String NOT_SET_DEFAULT="NOTSET";
    
        /**
         * Gets defaults out of Oracle Functions Configuration
         */
        private  static final Logger LOGGER = Logger.getLogger("IDCS_GTW_LOGGER");
    
        public ResourceServerConfig(RuntimeContext ctx)   {
            // Get config variables from Functions Configuration
            HAS_PROXY = Boolean.parseBoolean(ctx.getConfigurationByKey("idcs_proxy").orElse("false"));
            PROXY_HOST = ctx.getConfigurationByKey("idcs_proxy_host").orElse("");
            PROXY_PORT = Integer.parseInt(ctx.getConfigurationByKey("idcs_proxy_port").orElse("80"));
    
            IDCS_URL = ctx.getConfigurationByKey("idcs_app_url").orElse(NOT_SET_DEFAULT);
            SCOPE_ID = ctx.getConfigurationByKey("idcs_app_scopeid").orElse(NOT_SET_DEFAULT);
            CLIENT_ID = ctx.getConfigurationByKey("idcs_app_clientid").orElse(NOT_SET_DEFAULT);
    
            DEBUG_LEVEL = ctx.getConfigurationByKey("debug_level").orElse("INFO");
            JWK_URL = IDCS_URL+"/admin/v1/SigningCert/jwk";
            TOKEN_URL=IDCS_URL+"/oauth2/v1/token";
    
            // KMS Key for IDCS Client Secret
            KMS_ENDPOINT = ctx.getConfigurationByKey("kms_endpoint").orElse(NOT_SET_DEFAULT);
            KMS_IDCS_SECRET_KEY= ctx.getConfigurationByKey("kms_idcs_secret_key").orElse(NOT_SET_DEFAULT);
    
            String decodedClientSecret="";
    
            // Decode the client Secret using KMS
            decodedClientSecret=DecryptKMS.decodeKMSString(KMS_ENDPOINT,KMS_IDCS_SECRET_KEY,ctx.getConfigurationByKey("idcs_app_secret").orElse(NOT_SET_DEFAULT));
            decodedClientSecret=decodedClientSecret.trim();
    
            CLIENT_SECRET = decodedClientSecret;
    
            LOGGER.info("IDCS Configuration Data read : IDCS_URL=[" + IDCS_URL + "] SCOPE_AUD=[" + SCOPE_ID +"] CLIENT_ID=["+CLIENT_ID+"], DEBUG_LEVEL=["+DEBUG_LEVEL+"]");
        }
    }
    Oracle Identity Cloud Serviceエンドポイントやシークレットなど、いくつかの構成値を追加する必要があります。これらの構成パラメータは、Oracle Functionsの構成で入力します。
  2. Oracle Cloud Infrastructureコンソールで、「Developer Services」に移動して、「関数」をクリックします。
  3. 関数を選択し、「リソース」で「構成」をクリックします。
    関数で定義されている任意の構成変数に値を入力できます。機密値はOracle Cloud Infrastructure Vaultによって保護されます。
  4. 関数をデプロイします。次に例を示します。
    fn deploy -app fnsaaspoc