お問い合わせ
お問い合わせ
TOPICS
更新情報
ホーム > ブログ > Oracle Cloud > 【初心者向け】Oracle Functionsをつかってサーバレスを始めてみました!

【初心者向け】Oracle Functionsをつかってサーバレスを始めてみました!

Oracle Cloud
2020.07.17

みなさんこんにちは。t-tasakaです。

Oracle FunctionsについてはCloudiiブログでも何度か取り上げておりますが、これからOracle Cloudでサーバレスを始めるにあたり、Oracle Cloudからわかりやすいチュートリアルが出ているため、やってみようと思います。

oracle-japan.github.io

本記事の目次です。

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について簡単に説明します。

fnproject.io

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をインストールする必要があります。

docs.docker.com

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、 ユーザネーム

コンソール画面の右上の人形マークをクリックし、ユーザ名をクリックします。(プロファイルの下にある文字列がユーザ名となっていますので、こちらもテキストエディタに保存しておきます。)

ユーザの詳細画面に入り、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ウィザードの起動をクリックします。

今回は以下の様な設定にしています。 * 名前:任意 * VCN CIDRブロック:10.0.0.0/16 * パブリック・サブネットCIDRブロック:10.0.0.0/24 * プライベート・サブネットCIDRブロック:10.0.1.0/24

ウィザードを進め、VCNを作成します。

VCNの作成

完了しました。

1.2 インスタンスの構成

つづいて、Oracle Functionsを動作させるためのインスタンスを作成します。 コンソールのハンバーガーメニューからコンピュート>インスタンスと進み、「インスタンスの作成」をクリックします。

「イメージまたはオペレーティングシステム」の項目で、Oracleイメージタブの"Oracle Cloud Developer Image"を選択します。

f:id:t-tasaka:20200714002732p:plain
すべてのイメージの参照

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キーをクリックします。

f:id:t-tasaka:20200710172330p:plain
ユーザーをクリック

公開キーの追加をクリックし、テキストエディタに保存しておいた公開鍵を貼り付けます。

f:id:t-tasaka:20200714125755p:plain
公開キーの追加

3.3 Oracle Functions CLI contextの作成と設定

つぎに、OCIR(Oracle Functionsを管理するOracleが提供しているプライベートDockerレジストリ)にログインするための認証tokenを作成します。

ユーザーの詳細画面の左側メニューから、認証トークンをクリックし、トークンの生成をクリックします。

f:id:t-tasaka:20200714130232p:plain
トークンの生成

任意の名前を設定して生成すると、トークンは一度しか表示されませんのでテキストエディタにコピーして保存しておきます。

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のコンソール画面にて、アプリケーションを作成します。 ハンバーガーメニューの開発者サービス>ファンクションと選択します。

f:id:t-tasaka:20200715234723p:plain
ファンクションを選択

アプリケーションの作成をクリックします。

f:id:t-tasaka:20200715234837p:plain
アプリケーションの作成

任意のアプリケーション名、今回作成したVCN名と、そのパブリックサブネットを選択し、作成をクリックします。

f:id:t-tasaka:20200715235448p:plain
アプリケーション

これで、実行環境は作成完了です。

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プロジェクト名]となっているアプリケーションがあるかを確認します。

f:id:t-tasaka:20200716001502p:plain
確認

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 World!をjavaで表示させる、ということを行いました。

Oracle Cloudのチュートリアルの内容をなぞっただけではありますが、コンパートメントがルートコンパートメントでなかったりと、少しチュートリアルの環境とちがったところがあったせいか 、実行環境の構築にハマってしまいました。

今後もう少しさわってみて、ご紹介して行けたらと思う次第でございます。 では。


この記事が気に入ったら
「いいね!」

この記事を書いた人


関連コンテンツ

CONTACT お問い合わせ

Cloudiiのサービスやプロダクトについて
興味をお持ちの方は、
お気軽にお問い合わせください。