GraalVMは、REST APIを搭載したOCI Functionsを5行のみで、まったく機能しません。 (2026/03/06)
GraalVMは、REST APIを搭載したOCI Functionsを5行のみで、まったく機能しません。 (2026/03/06)
mkdir my-graalvm-function && cd my-graalvm-function
fn init --runtime java
npm i @mikarinneoracle/oci-cdk
export OCI_COMPARTMENT_ID='ocid1.compartment.oc1...gq' OCI_USE_GRAALVM_JAVA=1
npx ocdk deploy --auto-approveこれは、JavaでネイティブコンパイルされたHello World OCI FunctionsへのREST APIエンドポイントを提供するocdk npmパッケージを使用して、フルスタックデプロイメントを作成する方法です。簡単です!
デプロイの出力は次のようになります (大幅に短縮されています)。
oci-stack Initializing the backend...
oci-stack Initializing provider plugins...
oci-stack - Reusing previous version of hashicorp/null from the dependency lock file
oci-stack - Reusing previous version of oracle/oci from the dependency lock file
oci-stack - Using previously-installed hashicorp/null v3.2.4
oci-stack - Using previously-installed oracle/oci v5.46.0
oci-stack Terraform has been successfully initialized!
...
Plan: 17 to add, 0 to change, 0 to destroy.
...
oci-stack null_resource.BuildAndPushImage (local-exec): [INFO] Building jar: /function/target/hello-1.0.0.jar
oci-stack null_resource.BuildAndPushImage (local-exec): [INFO] ------------------------------------------------------------------------
oci-stack null_resource.BuildAndPushImage (local-exec): [INFO] BUILD SUCCESS
null_resource.BuildAndPushImage (local-exec): [INFO] ------------------------------------------------------------------------
oci-stack null_resource.BuildAndPushImage (local-exec): [INFO] Total time: 5.057 s
null_resource.BuildAndPushImage (local-exec): [INFO] Finished at: 2026-03-06T08:31:56Z
...
null_resource.BuildAndPushImage (local-exec): ====================================================
oci-stack null_resource.BuildAndPushImage (local-exec): GraalVM Native Image: Generating 'Hello' (executable)...
...
null_resource.BuildAndPushImage (local-exec): Build artifacts:
null_resource.BuildAndPushImage (local-exec): /app/Hello (executable)
null_resource.BuildAndPushImage (local-exec): ========================================================================================================================
null_resource.BuildAndPushImage (local-exec): Finished generating 'Hello' in 2m 14s.
...
oci-stack oci_apigateway_deployment.ApiDeployment: Creation complete after 1m13s [id=ocid1.apideployment.oc1.eu-frankfurt-1.amaaaaaa...3rkca]
oci-stack
Apply complete! Resources: 17 added, 0 changed, 0 destroyed.
Outputs:
api_gateway_host = "m5bwcy7pf...5wr5ny.apigateway.eu-frankfurt-1.oci.customer-oci.com"
execution_log_id = "ocid1.log.oc1.eu-frankfurt-1.amaaaaaa...olnq"
function_id = "ocid1.fnfunc.oc1.eu-frankfurt-1.amaaaaaa...eyta"
function_invoke_url = "https://m5bwcy7pf...5wr5ny.apigateway.eu-frankfurt-1.oci.customer-oci.com"
log_group_id = "ocid1.loggroup.oc1.eu-frankfurt-1.amaaaaaa...ma7q"
ocir_repository_name = "my-graalvm-function"ブラウザまたは cURL からエンドポイントを使用して関数を呼び出す:
curl "https://m5bwcy7pf...5wr5ny.apigateway.eu-frankfurt-1.oci.customer-oci.com"
Hello, world!関数ログを末尾に表示するには、次の手順を実行します。
npx ocdk tail:execution-log
2026-03-06T08:48:07.978Z Received function invocation request
2026-03-06T08:48:07.967Z Inside Java Hello World function
2026-03-06T08:48:08.000Z Served function invocation request in 0.022 secondsocdk は Terraform を使用するため、デプロイメントの削除はnpx ocdk destroy で同様に簡単です。
ocdk は Java だけでなく、PythonとNode JSの OCI Functionsもサポートしており、 MacOs、OCI Cloud Shell、OCI OL8 VMでテストされているため、開発環境を選択するオプションが豊富にあります。
前提条件はいくつかあります:
- 認証トークン設定付きのOCI CLI (つまり、一般的なCLI設定)
- Terraform
- NodeJS( npmはNode Package Managerなので)
Fn CLI はオプションですが、ファンクションの定型コードの作成 (例: fn init — ランタイム java/python/node)に便利で、その後、 fn bump を使用してファンクションのバージョン/タグ (func.yaml 内) を更新します。
Java ファンクションは、 OCI_USE_GRAALVM_JAVAを1 に設定しなくても (デフォルト)、JVM ベースとしても実行できます。この設定を変更する場合は、npx ocdk deploy を実行する前に Dockerfile も削除して有効にする必要があることに注意してください。
必須の env はOCI_COMPARTMENT_IDのみで、その他の env 変数はすべてオプションであり、ocdk GitHubおよびocdk パッケージの readmeに説明されています。
おそらく最も有用なものは次のとおりです。
- OCI_STACK_ACTION は「フルスタック」(設定されていない場合はデフォルト)または「ファンクションのみ」のいずれかです。
- OCI_FUNCTION_SUBNET_ID (または OCI_PRIVATE_SUBNET_OCID)
- OCI_APIGATEWAY_SUBNET_ID (または OCI_PUBLIC_SUBNET_OCID)
Env vars を使用すると、ocdk のデプロイメントを最適化および制御できます。
デフォルト(環境変数が設定されておらず、デプロイメントが「フルスタック」として実行される場合)では、デプロイメントはプライベートサブネットとパブリックサブネットを持つ新しいVCNを作成し、パブリックサブネットのみがインターネットにアクセスできます。したがって、ファンクションアプリとファンクションはプライベートサブネットに配置され、API GatewayデプロイメントはHTTP/S RESTアクセスのためにパブリックサブネットに配置されます。
OCI_STACK_ACTIONが「funtion-only」の場合、API Gateway RESTエンドポイントを作成せずにデプロイメントが実行されるため、デプロイメントが大幅に高速化されます。この場合、ファンクションの呼び出しは、Cloud Shellでメニューから OCI Service Network を選択し、fn invoke <app> <func>を実行するか、OCI CLIを使用することで実行できます。
他の 2 つの en vars を使用すると、ocdk デプロイメント用にユーザー独自の VCN/サブネットを設定できます。
OCI_STACK_ACTIONが「フルスタック」(または設定されていない)の場合、 OCI_FUNCTION_SUBNET_IDとOCI_APIGATEWAY_SUBNET_ID の両方を設定する必要があります。OCI_FUNCTION_SUBNET_IDは、OCI サービス ゲートウェイ アクセス(10.xxx/24 CIDR ブロックなど)を備えたプライベート ID であり、OCI_APIGATEWAY_SUBNET_IDは、パブリック アドレス指定と REST エンドポイント用のインターネット アクセスを備えたパブリック ID です。
OCI_STACK_ACTIONが「function-only」の場合、 OCI_FUNCTION_SUBNET_IDをオプションで設定できます。この場合、env として定義されたプライベートサブネットが、インターネットアクセス可能なパブリックサブネットも持つ VCN の一部であれば、インターネット(つまり自分のマシン)からfn invokeまたはOCI CLI の function invokeを使用できます。したがって、このために API Gateway を使用したフルスタックのデプロイメントは必ずしも必要ではありません。fn CLI を使用するには、最初に少し設定が必要です。
echoでfn invoke を実行すると、テストのためにファンクション呼び出しにデータをパイプできます (ローカルホストからでも API Gateway は必要ありません)。
echo 'Mika Rinne' | fn invoke my-graalvm-function my-graalvm-function
Hello, Mika Rinne !OCI_STACK_ACTIONが「function-only」で、OCI_FUNCTION_SUBNET_IDが設定されていない場合、ファンクションをデプロイするために、OCI サービス ゲートウェイ アクセスを持つ VCN とプライベート サブネットが作成されます。
オプションはデプロイメント間で変更可能(例:npx ocdk deploy の実行)で、Terraform は環境変数の設定に基づいてリソースの作成と削除を自動的に行います。デプロイメントの途中で run destroy を実行する必要はありません。デプロイメントを完全に削除する場合のみ実行してください。これにより、設定変更が迅速かつ容易になります。
デプロイメント
ファンクションのデプロイメントでは、ocdk はファンクションのメモリ、タイムアウト、構成パラメータなどの構成をfunc.ymlから取得します。次に例を示します。
memory: 256
timeout: 60
config:
default-name: Mika Rinne前述の通り、ファンクションのバージョンはfn bumpで変更するか、 func.yamlで手動で変更できます。バージョンを変更すると、ocdk はバージョンタグ付きの新しいイメージをソースから作成し、それをデプロイします。
コードのみを変更すると、ocdk がソースから新しいイメージを作成するようにトリガーされる可能性がありますが、バージョンが変更されない場合は関数のデプロイメントには影響しないため、この点に注意してください。
コードとバージョンを変更したら、 npx ocdk deployで再デプロイします。通常、この操作は高速で、関数を再度呼び出すのも高速です。これは、関数が既にウォームアップ状態になっているためで、数秒程度で完了します。前述の環境変数が変更されない限り、ocdk のデプロイは基本的に同じままなので、コードの再デプロイは高速かつ便利です。
逆に、最初のocdkデプロイとファンクション作成後のコールドスタートファンクションの最初の呼び出しは、通常、ファンクションの言語やその他の設定にもよりますが、30~60秒ほどとかなり時間がかかります。しかし、その後は確実に大幅に高速化されます。
また、最初のデプロイ時にファンクションディレクトリに追加のファイルが生成されることにお気づきかもしれません(必要なファイルが不足している場合は後日も追加されます)。これらのファイルの1つは、ファンクションイメージを作成するためのDockerfileです。
必要に応じてDockerfileを編集できます。例えば、ファンクション名やパッケージを変更した場合、Dockerfileに反映されます。これは自動的には行われません。ただし、Dockerfileが既に存在する場合、ocdkは独自のDockerfileを生成せず、ファンクションイメージの作成には既存のDockerfileを使用し、それを使い続けます。
フル スタック デプロイメント用に生成されるもう 1 つのファイルは、API Gateway デプロイメントを保持するoci_apigateway_deployment.jsonです。
{
"routes" : [
{
"path" : "/{path*}" ,
"methods" : [
"GET" ,
"POST" ,
"OPTIONS"
] ,
"backend" : {
"type" : "ORACLE_FUNCTIONS_BACKEND" ,
"functionId" : "${function_id}" ,
"readTimeoutInSeconds" : 30
}
}
]
}ドキュメントに従ってこのファイルを変更することもできます。その場合、ocdk はそれを使い続けます。
より複雑なJavaファンクションの場合、生成されたreflection.jsonの調整や、GraalVMネイティブビルド用のresources.jsonの追加が必要になる場合があります。詳細はGraalVMのドキュメントをご覧ください。OCI Oracle Autonomous DB接続プーリングとsysdateクエリを使用したファンクションのサンプルリポジトリはこちらです: https://github.com/mikarinneoracle/my-graalvm-function/tree/master
DB クエリのログの例:
npx ocdk tail:execution-log
2026-03-06T13:28:51.010Z Served function invocation request in 25.884 seconds
2026-03-06T13:28:51.824Z Received function invocation request
2026-03-06T13:28:51.848Z Served function invocation request in 0.024 seconds
2026-03-06T13:28:50.215Z Got connection, making query ...
2026-03-06T13:28:50.217Z Query succesful. Sysdate:2026-03-06 13:28:50
2026-03-06T13:28:51.053Z Got connection, making query ...
2026-03-06T13:28:51.055Z Query succesful. Sysdate:2026-03-06 13:28:51
ぜひお試しいただき、フィードバックをいただければ幸いです。何か問題があればリポジトリにご報告いただければ、一緒に解決いたします。楽しいコーディングを!
コメント
コメントを投稿