[OCI]Oracle Functionsを使用する際のヒント (2020/01/27)

 Oracle Functionsを使用する際のヒント (2020/01/27)

https://www.ateam-oracle.com/some-hints-and-tips-when-using-oracle-functions
投稿者:Angelo Santagata | Architect

前書き


先日、VBCSとOracle Functionsを使用してOracle SaaSを拡張する方法についてのブログ記事を完成させ、そのコードを公開しました。
このコードを書いている間に、私はFunctionsについて多くのことを学び、他の多くの開発者が直面するであろう多くの状況に遭遇しました。
このブログ記事では、それらを一つのブログ記事にまとめています (定期的に更新していくかもしれません)。

REST サービスとしてファンクションを公開する方法


ファンクション自体は、まさに彼らが言うところの「ファンクション」であり、「何か」を行うコードの小さな断片です。
Oracle Functions自体は、彼らは "箱から出して" RESTのサポートを持っていないことで、RESTを認識していませんが、
簡単にOracle API Gatewayを使用して、RESTクライアントからファンクションにアクセスすることができます。

一般的な手順は以下の通りです。

  1. ファンクションのデプロイ
  2. API Gatewayを作成。ゲートウェイは、Oracle Functionsアプリケーションと同じVCNとサブネットにデプロイする必要があります。
    これがない場合は、API Gatewayが ファンクションを呼び出すためのネットワークルートを設定する必要があります。
  3. API Gateway のデプロイメントを作成
  4. デプロイメント内で、REST Verb/URIごとに1つずつパスを追加し、それをファンクションにマップ

これで完成です。

複数のバージョンのファンクションをサポートしたい場合、最も簡単なのは、異なるパスのファンクション用に複数のエントリを作成することです。

/cart/v1 -> Maps to OCID1
/cart/v2 -> Maps to OCID2
/cart/latest -> Maps to OCID2

上記の例では、/cart/v2と/cart/latestの両方が同じファンクションを指しています。

もう一つの問題は、VCN のセキュリティリストでポートを公開するのを忘れていた場合です(例:SSL のポート 443)。
Oracle FunctionsからカスタムHTTPエラーコードを公開する方法

ここでのシナリオは、Oracle FunctionsからHTTP-401 (Un-Authorized)やHTTP-404 (Not Found)などのカスタムエラーコードを返したい場合です。
ドキュメントを読むと、カスタム出力イベントを使用するのが正しい解決策だと思うかもしれません。

OutputEvent out = OutputEvent.fromBytes(
OutputEvent.fromBytes(("Not found : ").getBytes(), // Data
OutputEvent.SUCCESS, // Set the status code here?
"text/plain", // Content type
Headers.fromMap(customHeaders) // and additional custom headers on output
);


これは正しくありません。
カスタムのエラーコードを返したい場合、ファンクションはSUCCESS(ファンクションは成功しましたがファンクションエラーが発生しました)を返し、
Gatewayを使用してカスタムヘッダを返す必要があります。

public OutputEvent handleRequest(InputEvent rawInput, HTTPGatewayContext hctx)
{
// process request
// Do something which causes a not found error
LOGGER.info("NotFoundException Error ");
int SC_NOTFOUND=401;
int CT_TEXT_PLAIN="text/plain";
hctx.setStatusCode(SC_NOTFOUND);
return OutputEvent.fromBytes(("Not found : ").getBytes(),
OutputEvent.Status.Success,
CT_TEXT_PLAIN // Content type
);
}


安全な「もの」をファンクション設定に保存


私の最近のPOCでは、IDCSセキュリティファンクションがそれを取得できるように、OAuthのシークレットをどこかに保存する必要がありました。
当初、私はちょうどOracle Functionsの設定変数にそれを格納するだけでOKだろうと思っていましたが、
私の "セキュリティ意識の高い "仲間(Olaf!)に話した後、我々はそれがないことを決定しました。



この例を見ると、すべての設定変数がクリアテキストで表示されていることがわかるでしょう (これらは実際のクライアント ID や秘密ではありません)。
シークレットであるはずのものを保存している場合や、少なくとも制限されている場合には良くありません。

解決策は、代わりにOCIのOracle Key Management Servicesを使用することでした。
Oracle KMSを使用すると、キーストアを定義し、シークレットデータを「暗号化」するようKMSに依頼することができます。

詳細については、このブログ記事「Secure storage of confidential configuration data in Oracle Functions using Oracle OCI Key Management Services」を参照してください。

メモリ量のチェック


ファンクシを開発するときは、開発しているもののメモリ消費量を見る必要があります。Java はかなりメモリを消費します。
128Mb のメモリ (デフォルト) で問題なく動作しますが、一度 Jersey や Apache Http Client のようなフレームワークを使用し始めると、
サービスの動作が少し遅くなることに気づくかもしれません。これは、ガベージコレクタが動き回っていて、物事を遅くしているからかもしれません。

メモリを 1GB に増やすこともできますが、私自身は java のファンクシに 256MB を割り当てる傾向があります。

schema_version: 20180708
name: saasopportunitiesfn
version: 0.0.139
runtime: java
build_image: fnproject/fn-java-fdk-build:jdk11-1.0.104
run_image: fnproject/fn-java-fdk:jre11-1.0.104
cmd: com.example.saas.fn.cloudnativesaas.SaaSOpportunitiesFunctions::handleRequest
memory: 256
timeout: 60


今のところはここまでですが、このブログ記事はまた見つけたら随時更新していきたいと思います!

コメント

このブログの人気の投稿

Oracle Database 19cサポート・タイムラインの重要な更新 (2024/11/20)

Oracle APEXのInteractive Gridで、Oracle Formsと比較して、重複行の検証を制御/通過させる方法 (2022/07/21)

Oracle APEX 24.1の一般提供の発表 (2024/06/17)