みなさんこんにちは。t-tasakaです。
Oracle FunctionsについてはCloudiiブログでも何度か取り上げておりますが、これからOracle Cloudでサーバレスを始めるにあたり、Oracle Cloudからわかりやすいチュートリアルが出ているため、やってみようと思います。
本記事の目次です。
- Oracle Functionsとは
- 今回やること
- 1. ネットワークとコンピュート・インスタンスの構築
- 2. Fn Projectの環境構築
- 3. Oracle Functionsの環境構築
- 4. アプリケーションの作成・デプロイ
- 5. 動作確認
- まとめ
Oracle Functionsとは
詳細は以下のOracle Cloudのドキュメントにありますが、概要を簡単に説明いたします。
https://docs.oracle.com/cd/E97706_01/Content/Functions/Concepts/functionsoverview.htmdocs.oracle.com
Fn Projectとは
Oracle Functionsの前に、Oracle FunctionsのベースとなっているFn Projectについて簡単に説明します。
Fn Projectとは、実行環境を選ばないFaaS(Function as a Service)の実行基盤です。GitHub上で開発が行われているOSSです。Fn Server, Fn Load Balancer, Fn FDK's, Fn Flowという主要な4つのコンポーネントから成っています。
開発したファンクションをレジストリに格納し、トリガーをセットすると、セットしたトリガーに応じてFn projectがインフラの分散やオーケストレーションを行い、ファンクションのコードが実行されます。
Oracle Functionsとは
そして、Fn Projectをベースとし、Oracle Cloud上で管理されるFaaSプラットフォームが、Oracle Functionsです。 FaaSですので、イベント駆動型の処理や、断続的であったり、突発的に処理が急増するようなサービスに向いています。 また、Dockerを用いたプラットフォームであるため、既存のDockerイメージを使用することも可能です。
今回やること
では、実際に構築して触ってみたいと思います。
今回はこちらのチュートリアルに沿い、Oracle Functionsの環境構築とAPI GATE WAYを利用した簡単なアプリケーションを構築するまでをやってみます。
大まかな手順は以下の通りとなっています。今回使用したOracle Developper Imageを利用しない場合は、DockerとOCI CLIをインストールする必要があります。
https://docs.oracle.com/cd/E97706_01/Content/API/SDKDocs/cliinstall.htmdocs.oracle.com
1.ネットワークとコンピュート・インスタンスの構築 1. VCNの作成 2. インスタンスの作成 2. Fn Projectの環境構築 3. Oracle Functionsの環境構築 1. Fn ServerとFn CLIのインストール 2. OCI CLIのセットアップ 3. Oracle Functions CLI contextの作成と設定 4. アプリケーションの作成・デプロイ 5. 動作確認
では、始めます。
1. ネットワークとコンピュート・インスタンスの構築
事前準備
必要な情報
まず、前もって取得しておくと便利な情報を以下に挙げます。テキストエディタなどにコピー&ペーストしておくことをお勧めします。
- リージョン名
今回は東京リージョンを利用するので ap-tokyo-1
となります。
- リージョンコード
東京リージョンのコード nrt
を使用します。
- コンパートメントOCID
アイデンティティ> コンパートメントと進み、使用するコンパートメントを選択します。 詳細画面に入り、OCIDをコピーして取得します。
- ユーザOCID、 ユーザネーム
コンソール画面の右上の人形マークをクリックし、ユーザ名をクリックします。(プロファイルの下にある文字列がユーザ名となっていますので、こちらもテキストエディタに保存しておきます。)
ユーザの詳細画面に入り、OCIDをコピーして取得します。
- tenancy OCID、tenancy-namespace
コンソール画面の右上の人形マークをクリックし、テナンシ、と書かれているところをクリックします。 テナンシの詳細画面から、OCIDとネームスペースをコピーし、テキストエディタ等に保存します。
ポリシーの設定
まずは、VCNとファンクションを格納するレジストリをOracle Functionsで使用しても良い、という許可をポリシーで設定します。Oracleの公式チュートリアルではルートコンパートメントで設定していますが、今回は作業するコンパートメントで設定します。
Oracle Cloud コンソール画面のハンバーガーメニューを選択し、アイデンティティ>ポリシーと進みます。
「ポリシーの作成」をクリックします。
名前は任意のものを設定し、以下のステートメントを追加します。 [compartment ocid]
には先ほど取得したコンパートメントOCIDを入力します。
Allow service FaaS to use virtual-network-family in compartment id [compartment ocid] Allow service FaaS to read repos in tenancy
私は Allow service FaaS to read repos in tenancy
の部分でコンパートメントIDを指定してしまい、実行時にリクエストを拒否されてしまいましたのでルートコンパートメントを使用しない方はご注意ください、、
1.1 ネットワークの構成
仮想ネットワーク (VCN)を構成します。 ハンバーガーメニューのネットワーキング>仮想クラウド・ネットワークと進み、VCNウィザードの起動をクリックします。
インターネット接続性を持つVCNを選択し、VCNウィザードの起動をクリックします。
今回は以下の様な設定にしています。 * 名前:任意 * VCN CIDRブロック:10.0.0.0/16 * パブリック・サブネットCIDRブロック:10.0.0.0/24 * プライベート・サブネットCIDRブロック:10.0.1.0/24
ウィザードを進め、VCNを作成します。
完了しました。
1.2 インスタンスの構成
つづいて、Oracle Functionsを動作させるためのインスタンスを作成します。 コンソールのハンバーガーメニューからコンピュート>インスタンスと進み、「インスタンスの作成」をクリックします。
「イメージまたはオペレーティングシステム」の項目で、Oracleイメージタブの"Oracle Cloud Developer Image"を選択します。
Oracle Linux7ベースで、Oracle Cloud関連の開発がしやすいイメージになっているようです。 * インスタンス名:任意 * VCN先ほど設定したを選択
SSH接続するクライアントPCの公開鍵を追加し、「作成」をクリックします。
2. Fn Projectの環境構築
作成したインスタンスにログインします。(/Users/username/.ssh/id_rsa) 私は MacのターミナルからSSHでログインしました。
% ssh -i /Users/username/.ssh/id_rsa opc@"インスタンスのパブリックIPアドレス"
3. Oracle Functionsの環境構築
Oracle Functionsの環境構築のために、以下が必要となります。
- Docker(Oracle Cloud Developer Imageにはじめからインストールされています)
- OCI cli(こちらもはじめからインストールされています)
- Fn Server
- Fn CLI
3.1 Fn ServerとFn CLIのインストール
まずはFn ServerとFn CLIをインストールします。
opcユーザにDockerの操作を許可します。実行したら exit
でログアウトします。
$ sudo usermod -aG docker opc $ exit
再度ログインします。以下を実行します。
$ curl -LSs https://raw.githubusercontent.com/fnproject/cli/master/install | sh
インストールすると以下のように表示されます。
fn version 0.5.99 ______ / ____/___ / /_ / __ \ / __/ / / / / /_/ /_/ /_/`
動作確認します。
$ fn start
time="2020-07-14T03:14:53Z" level=info msg="ram reservations" avail_memory=13028589159
time="2020-07-14T03:14:53Z" level=info msg="available cpu" avail_cpu=2000 total_cpu=2000
time="2020-07-14T03:14:53Z" level=info msg="cpu reservations" cpu=2000
time="2020-07-14T03:14:53Z" level=info msg="
______
/ ____/___
/ /_ / __ \\
/ __/ / / / /
/_/ /_/ /_/
"
time="2020-07-14T03:14:53Z" level=info msg="Fn serving on :8080
" type=full version=0.3.749
というように表示されたらCtrl + Cで Fn Serverを停止させます。
3.2 OCI CLIのセットアップ
opcユーザーの状態でOCI CLIをセットアップします。 以下を実行します。
$ oci setup config
質問に沿って設定していきます。
Enter a location for your config [/root/.oci/config]: Enter a user OCID: ←テキストエディタに貼り付けたユーザOCIDを入力 Enter a tenancy OCID: ←テキストエディタに貼り付けたテナンシOCIDを入力 Enter a region : ap-tokyo-1 ←東京リージョンなのでap-tokyo-1 Do you want to generate a new RSA key pair? (If you decline you will be asked to supply the path to an existing key.) [Y/n]: Y Enter a directory for your keys to be created [/home/opc/.oci]: Enter a name for your key [oci_api_key]: Public key written to: /root/.oci/oci_api_key_public.pem Enter a passphrase for your private key (empty for no passphrase): Private key written to: /home/opc/.oci/oci_api_key.pem
CLIからOCIに対してアクセスを行う際には、このときに作成されたAPIキーをOCI側に登録するため、公開鍵を表示します。
$ cat /home/opc/.oci/oci_api_key_public.pem -----BEGIN PUBLIC KEY----- ~中略~ -----END PUBLIC KEY-----
-----BEGIN PUBLIC KEY-----
と -----END PUBLIC KEY-----
の部分も含めコピーしてテキストエディタ等に保存しておきます。
Oracle Cloudのコンソール上にAPIキーを登録します。 Oracle Cloudの人型のアイコンからユーザ名をクリックし、ユーザの詳細画面からリソース欄のAPIキーをクリックします。
公開キーの追加をクリックし、テキストエディタに保存しておいた公開鍵を貼り付けます。
3.3 Oracle Functions CLI contextの作成と設定
つぎに、OCIR(Oracle Functionsを管理するOracleが提供しているプライベートDockerレジストリ)にログインするための認証tokenを作成します。
ユーザーの詳細画面の左側メニューから、認証トークンをクリックし、トークンの生成をクリックします。
任意の名前を設定して生成すると、トークンは一度しか表示されませんのでテキストエディタにコピーして保存しておきます。
Fn createでコンテキスト(開発環境)を作成します。 以下のコマンドでコンテキストの作成をします。 --provider oracle
と指定することで、Oracle Functionsの環境を指定します。
$ fn create context [context名]--provider oracle
fn use
で使用するコンテキストに切り替えます。
$ fn use context [context名]
作成したコンテキストに、 fn update
コマンドを使用して以下の項目を設定します。
- コンパートメントID
- APIエンドポイント
- OCIR(Oracleが提供するプライベートDockerレジストリで、Oracle Functionsの管理を行う)
まず、 [compartment-ocid]
の部分にコンパートメントOCIDを入れます。
$ fn update context oracle.compartment-id [compartment-ocid]
APIエンドポイントとOCIRを設定します。 nrt
の部分は東京リージョンのコードですので、お使いの環境に合わせて変更ください。
$ fn update context api-url https://functions.ap-tokyo-1.oraclecloud.com $ fn update context registry nrt.ocir.io/[tenancy-namespace]/[context名]
oracle.profile "DEFAULT"
とすることで、OCI CLIセットアップ時に必要なプロファイルをデフォルトで構成します。
$ fn update context oracle.profile "DEFAULT"
設定したら、以下のコマンドでOCIRにログインします。
$ docker login nrt.ocir.io
以下の様に表示がでます。
Login Succeeded
続いて、Oracle Cloudのコンソール画面にて、アプリケーションを作成します。 ハンバーガーメニューの開発者サービス>ファンクションと選択します。
アプリケーションの作成をクリックします。
任意のアプリケーション名、今回作成したVCN名と、そのパブリックサブネットを選択し、作成をクリックします。
これで、実行環境は作成完了です。
4. アプリケーションの作成・デプロイ
つづいて、アプリケーションの作成を行います。javaを使用し、hello worldが表示されるまでをやります。
fn init
コマンドでファンクションの雛形をつくります。名前は helloworld-func
とし、--runtime java
でjavaを使用することを指定します。
$ fn init --runtime java helloworld-func
作成すると、ファイル構成は以下のようなものができます。
└── helloworld-func ├── func.yaml ├── pom.xml └── src ├── main │ └── java │ └── com │ └── example │ └── fn │ └── HelloFunction.java └── test └── java └── com └── example └── fn └── HelloFunctionTest.java
HelloFunction.javaの中は以下の様になっています。
public class HelloFunction { public String handleRequest(String input) { String name = (input == null || input.isEmpty()) ? "world" : input; System.out.println("Inside Java Hello World function"); return "Hello, " + name + "!"; }
ファンクションプロジェクトのディレクトリにいきデプロイします。 [application name]の部分は、先ほどOracle Cloud上で作成したアプリケーション名です。
$ cd helloworld-func $ fn deploy --app [application name]
デプロイしたら、Oracle Cloudコンソール上で確認します。
画面左側ハンバーガーメニューの開発者サービス>レジストリ(OCIR)と進み、 [コンテキスト名]/[Oracle Functionsプロジェクト名]となっているアプリケーションがあるかを確認します。
5. 動作確認
動作確認をします。 fn invoke
コマンドを使用します。
$ fn invoke [アプリケーション名] [ファンクション名]
アプリケーション名:OracleFunctionsHandson ファンクション名:helloworld-func で設定しているので
$ fn invoke OracleFunctionsHandson helloworld-func
を実行します。
以下のように表示されれば成功です。
Hello, World!
引数をうけとって返すようになってるので、適当な文字列を入れてみます。
$ echo -n 'Cloudii' | fn invoke OracleFunctionsHandson helloworld-func
Hello, Cloudii!
まとめ
今回はOracle Functionsを使ってみる、ということで実行環境を構築し、Hello Cloudii!をjavaで表示させる、ということを行いました。
Oracle Cloudのチュートリアルの内容をなぞっただけではありますが、コンパートメントがルートコンパートメントでなかったりと、少しチュートリアルの環境とちがったところがあったせいか 、実行環境の構築にハマってしまいました。
今後もう少しさわってみて、ご紹介して行けたらと思う次第でございます。 では。