シンプルな OCI Functions を API Gateway でシンプルに呼び出して結果をブラウザに表示する。(Oracle Cloud Infrastructure)
OCI Functions は OCI のサーバーレスな実行環境や!彡(^)(^)
Java や Python など様々な言語をサーバレスで実行できます。
Oracle Cloud - Cloud Native 2021
https://speakerdeck.com/oracle4engineer/oracle-cloud-hangout-cafe-premium-oracle-cloud-cloud-native-2021?slide=34Serverless な世界をのぞいてみよう!
https://speakerdeck.com/oracle4engineer/lets-dive-serverless-world
今回はシンプルな OCI Functions を作成して、API Gateway でシンプルに
呼び出して結果をブラウザ表示してみますやで彡(゚)(゚)
1. ネットワーク構成
ネットワーク構成は下記記事のとほぼ同じです。
検証によく使う Oracle Cloud Infrastructure(OCI)環境を Terraform で作成してみる。
https://qiita.com/ora_gonsuke777/items/8651c4075ec6bf436c4f
ポートは 22番(SSH), 443(https), 80(http) あたりを開けておきます。22(SSH) は今回使いませんが。
2. OCI Functions の作成
下記記事の Getting Started で使用可能になる Java のコードをほんの少し改修しました。
Functionsそのもの は Private Subnet にデプロイしています。
Oracle Functions の Getting Started を試してみる。(Oracle Cloud Infrastructure)
https://qiita.com/ora_gonsuke777/items/a9bb52faadcb9f2af38e
package com.example.fn; public class HelloFunction { public String handleRequest(String input) { System.out.println("Inside Java Hello World function"); return "{ \"key1\" : \"Hello world!\"}"; } }
package com.example.fn; import com.fnproject.fn.testing.*; import org.junit.*; import static org.junit.Assert.*; public class HelloFunctionTest { @Rule public final FnTestingRule testing = FnTestingRule.createDefault(); @Test public void shouldReturnGreeting() { testing.givenEvent().enqueue(); testing.thenRun(HelloFunction.class, "handleRequest"); FnResult result = testing.getOnlyResult(); assertEquals("{ \"key1\" : \"Hello world!\"}", result.getBodyAsString()); } }
生実行(fn invoke ~)の結果は下記のとおりです。
$ fn invoke ayu-functions1 hello-java { "key1" : "Hello world!"}
3. API Gateway の作成
API Gateway を作成します。特別な事は無く粛々と……。
API Gateway を作成するネットワークは Public の Subnet を指定します。
4. API Gateway の Deployment を作成
API Gateway の Deployment を作成します。シンプルなコール方法なので、こちらも特別なことはなく粛々と……。
METHODS は GET のみを指定
5. 実行権限の付与(リソース・プリンシパル)
API Gateway に Functions の実行権限を付与してやります。
ネットワークおよびAPIゲートウェイ関連リソースへのアクセスを制御するポリシーの作成
https://docs.oracle.com/ja-jp/iaas/Content/APIGateway/Tasks/apigatewaycreatingpolicies.htm
下記のような IAM Policy を作成して、API Gateway に Functions の実行権限を付与します。
ALLOW any-user to use functions-family in compartment <コンパートメント名> where ALL { request.principal.type= 'ApiGateway', request.resource.compartment.id = '<コンパートメントの OCID>' }
OCI の権限(Policy)は通常は Group を介して IAMユーザー に
付与されますが、権限を OCI のリソースに対しても付与することが可能で、
リソースに対して権限を付与するのがリソースプリンシパルです。(あってる?)
6. API Gateway の endpoint をブラウザでアクセス
まず API Gateway の endpoint を確認します。Deployment の下記部分です。
endpoint に 4. で作成した Deployment の PATH を追記してブラウザでアクセスします。
成功や!ブラウザに Functions の結果が表示されたやで彡(^)(^)
7. まとめ
API Gateway と Functions の組み合わせでブラウザに文字列を返すことが出来ました。
これは従来型の Web/AP + DB(データストア) の三層構造のアプリケーションを
サーバーレスなサービスで置き換えられる事を示しています。
AWS の Lambda相当の事を、OCI でも出来るんやで彡(^)(^)
Always Free も充実してきた OCI をどんどん活用して下さいね。
8. 参考ドキュメント
文中のリンクのほか、以下のドキュメントを参照しました。
サーバーレスOracle Functionsを呼び出すための完全ガイド
https://blogs.oracle.com/otnjp/the-complete-guide-to-invoking-serverless-oracle-functions-ja
APIゲートウェイの概要
https://docs.oracle.com/ja-jp/iaas/Content/APIGateway/Concepts/apigatewayoverview.htm
Functionsの概要
https://docs.oracle.com/ja-jp/iaas/Content/Functions/Concepts/functionsoverview.htm