Oracle Functions セットアップ

OracleFunctionsのセットアップ手順を記載します。

Fn,OracleFunctionsについて、どんなものかメモ書きを掲載したのでよろしければご覧下さい。
[・Oracle Functionsに関するメモ](https://qiita.com/y-araki-qiita/items/f73f815ea60a93978cac)

参考:
[クイックスタート](https://bit.ly/2FEPZEO)

# OCI設定
現在Phoenixリージョンのみサービスが提供されているため、OCIコンソール上で`us-phoenix-1`を選択してください。
※2019/08/01現在、サービスが公開されているためどのリージョンでもよいです。

## グループとユーザの作成
Oracle Functions を利用するユーザと、ユーザが所属するグループを作成します。
既存ユーザでもよいと思いますが、ユーザをグループに追加するのを忘れずにしてください。

・グループ作成
Identity > Groups > Create Groupより
<img width="462" alt="キャプチャ.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131627/6063d2fb-852c-be48-3e34-516fbba48391.png">
Name: Fn-Group (任意)
Description: Fn-Group (任意)
上記入力し「Submit」を押す。

・ユーザ作成
Identity > Users > Create Userより
<img width="467" alt="キャプチャ2.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131627/54ab4f9c-48ee-69a3-861a-11ecd4853072.png">
Name: fn-user (任意)
Description: fn-user (任意)
上記入力し「Submit」を押す。

ユーザ一覧より作成したユーザをクリックし、左下Groups > Add User to Groupより
先程作成したグループを選択し「Add」を押す。
<img width="528" alt="キャプチャ3.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131627/b032db11-d9c5-4711-7f5b-95fdefaa7821.png">


## コンパートメントの作成
コンパートメントも同様にOracleFunctions用のものを作成します。
Identity > Compartments > Create Compartmentより
<img width="419" alt="キャプチャ4.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131627/cafbfd8d-3413-18a3-dfa0-1eab111a9a44.png">
Name: fn-compartment (任意)
Description: fn-compartment (任意)

## VCNとSubnet作成
作成したコンパートメント内に VCNを作成します。
インターネットゲートウェイを作成し、ルートテーブルをインターネットゲートウェイへのトラフィックを許可するように設定します。

検証用であれば[チュートリアル](https://community.oracle.com/docs/DOC-1019114)のように、`Create Virtual Cloud Network Plus Related Resources`で
自動で作成してもよいかもしれません。

## IAMポリシーの作成
作成したグループにFaaS(Oracle Functions)サービスが操作できるようポリシーの設定を行います。
Identity > Policies > 左下COMPARTMENTでルートコンパートメントを選択 >Create Policyより
<img width="472" alt="キャプチャ5.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131627/e0add931-0528-e10a-a6bc-f8f66c70fe14.png">
Name: fn-policy(任意)
Description: fn-policy(任意)
以下Policy Statementsを追加して「create」

```
Allow group <1で作成したグループ名> to manage repos in tenancy
Allow service FaaS to read repos in tenancy
```

左下COMPARTMENTで今回作成したコンパートメントを選択 > Create Policyより

Name: fn-policy(任意)
Description: fn-policy(任意)
以下Policy Statementsを追加して「create」

```
Allow group <1で作成したグループ名> to manage functions-family in compartment <2で作成したコンパートメント名>
Allow group <1で作成したグループ名> to manage vnics in compartment <2で作成したコンパートメント名>
Allow group <1で作成したグループ名> to inspect subnets in compartment <2で作成したコンパートメント名>
Allow service FaaS to use virtual-network-family in compartment <2で作成したコンパートメント名>
```

## Auth tokenの生成
Identity > Users > 先程作成したユーザ選択 > 左下Auth Tokens > Generated Token
![Inkedキャプチャ6_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131627/efd08422-54e0-279e-0592-371be74368e9.jpeg)
※GENERATED TOKENで表示されるパスワードは後程必要になるため必ずメモに控えて下さい!!

# 開発環境の構築
ファンクション開発環境を構築するためサーバをたてます。
サーバはクラウド上でもローカルの仮想環境でもよいとのこと。
今回PhoenixリージョンにOracle Linux Server 7.6を立て、簡単な初期設定(yum update、selinux、firewalld無効、タイムゾーン設定)をした後の作業です。

## OCI CLIインストール
以下rootユーザで基本デフォルト設定のままセットアップしていきます。適宜環境に合わせてください。

・インストール

```
# bash -c "$(curl ?L https://raw.githubusercontent.com/oracle/oci-cli/master/scripts/install/install.sh)"

以下インストール先ディレクトリ、設定ファイルに関する質問が表示される。
===> In what directory would you like to place the install? (leave blank to use '/root/lib/oracle-cli'): そのままEnter
===> In what directory would you like to place the 'oci' executable? (leave blank to use '/root/bin'): そのままEnter 
===> In what directory would you like to place the OCI scripts? (leave blank to use '/root/bin/oci-cli-scripts'): そのままEnter
===> Currently supported optional packages are: ['db (will install cx_Oracle)']
What optional CLI packages would you like to be installed (comma separated names; press enter if you don't need any optional packages)?: そのままEnter
===> Modify profile to update your $PATH and enable shell/tab completion now? (Y/n): y
===> Enter a path to an rc file to update (leave blank to use '/root/.bashrc'): そのままEnter

確認
# oci -v
2.5.19
```

・セットアップ
こちらも鍵の作成など一旦デフォルトで設定。

```
# oci setup config

以下設定ファイル、OCIDなど指定
Enter a location for your config [/root/.oci/config]: そのままEnter
Enter a user OCID: 今回作成したユーザのOCIDをコピー貼り付け (OCIコンソールメニューIdentity>Usersより確認)
Enter a tenancy OCID: fullenergy120のテナンシーIDをコピー貼り付け (OCIコンソール右上の人マークより確認)
Enter a region (e.g. ca-toronto-1, eu-frankfurt-1, uk-london-1, us-ashburn-1, us-gov-ashburn-1, us-gov-chicago-1, us-gov-phoenix-1, us-langley-1, us-luke-1, us-phoenix-1): us-phoenix-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 [/root/.oci]: そのままEnter
Enter a name for your key [oci_api_key]: そのままEnter
Enter a passphrase for your private key (empty for no passphrase): 鍵にパスフレーズ必要なければそのままEnter
```

・ユーザにAPI Keyを追加

```
# cat ~/.oci/oci_api_key_public.pem
-----BEGIN PUBLIC KEY-----
~ 公開鍵の内容が表示される。
-----END PUBLIC KEY-----
```
この公開鍵をコピーして、今回作成したユーザにAPI Keyを設定します。
OCIコンソール上にて、
Identity > Users > 該当ユーザ選択 > Add Public Key > コピーした公開鍵を貼り付けて「Add」

## dockerインストール

・リポジトリ設定

```
# vi /etc/yum.repos.d/docker.repo
以下記載

[dockerrepo]
name=Docker Repository
baseurl=https://yum.dockerproject.org/repo/main/oraclelinux/7
enabled=1
gpgcheck=1
gpgkey=https://yum.dockerproject.org/gpg
```

・インストール

```
# yum install docker-engine

# dockerd --version
Docker version 18.09.1-ol, build c3ab8a8
```

・起動、自動起動設定

```
# systemctl start docker.service
# systemctl enable docker.service
```

## FN CLIインストール・設定
・インストール

```
# curl -LSs https://raw.githubusercontent.com/fnproject/cli/master/install | sh

# fn version
Client version is latest version: 0.5.84
Server version:  ?
```

・コンテキスト設定
コンテキスト名は任意。ここではfn-context。

```
コンテキスト作成
# fn create context fn-context --provider oracle

使用するコンテキスト指定
# fn use context fn-context

コンテキストの一覧と、使用するコンテキストにアスタリスクが表示される。
#  fn ls contexts

コンパートメントID指定
# fn update context oracle.compartment-id  今回作成したコンパートメントのID

使用するエンドポイント指定 
# fn update context api-url https://functions.us-phoenix-1.oraclecloud.com
※上記PHOENIXリージョンの場合、東京リージョンの場合は以下
 https://functions.ap-tokyo-1.oraclecloud.com

Docker Registry と Oracle Functions で使用するリポジトリの指定
# fn update context registry phx.ocir.io/テナンシー名/任意のリポジトリ名
※上記OCIRのリージョンコード phx.ocir.io の場合。
　東京リージョンの場合は nrt.ocir.io です。

プロファイル指定
# fn update context oracle.profile DEFAULT
※OCI CLIインストール時に設定したプロファイル名を指定。cat ~/.oci/config で確認。ここではDEFAULTを使用しているがFn用に作成したほうがよい。

# docker login phx.ocir.io
Username: テナンシー名/今回作成したユーザ名
Password: ユーザに追加したAuth Tokenのパスワード

Login Succeededと表示されればOK。
```

※root以外のユーザで設定した場合、dockerに関するエラーで認証に失敗する。
その場合そのユーザをdockerグループに追加し、docker再起動する。

```
usermod -g docker グループに追加したいユーザ
systemctl restart docker.service
```


## テスト関数実行

ブラウザで以下指定してOracle Functionのコンソール画面を開きます。
https://console.us-phoenix-1.oraclecloud.com/functions/
<img width="797" alt="キャプチャ7.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131627/6136e5e0-770f-69a5-9f73-2e65777796aa.png">

テスト用にアプリケーションを作成します。
※Oracle Functionsはアプリケーションという枠をまず作成し、そこに複数の関数を作成して管理します。
Create Applicationより
<img width="464" alt="キャプチャ8.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131627/f871ff42-b41f-ecda-21c8-1bf9f509b6e2.png">
NAME: test-go
VCN: 今回作成したVCN
SUBNETS:PHX-AD-1から3まで指定
上記で「create」します。





作成後、Fnコマンドで操作します。

```
アプリケーション一覧表示
# fn list apps
NAME            ID
※作成したアプリケーションが表示される。

作業用ディレクトリ作成
# mkdir ~/fn-test/
# cd ~/fn-test/

Goの初期ファンクションを作成。
# fn init --runtime go helloworld-func

ファンクションをDockerImageとしてBuildし、OCIRにPush。
# cd helloworld-func

# fn -v deploy --app 作成したアプリケーション名(今回はtest-go)
※-v オプションをつけたほうがデプロイ内容、進捗が確認できてよいと思います。

デプロイした関数の確認
# fn list functions test-go

# ファンクション呼び出し実行
fn invoke test-go helloworld-func
"Hello World !' が表示されること。
※初回は少し時間かかります(dockerコマンドがいろいろ走ってる？)。2回目以降はすぐ表示されます。
```

関数を編集したい場合、編集後にfn deployでデプロイし直せば反映されます。

今回はGoのテスト関数でしたが、サポートされている言語(fn initのオプションで現在選択できるもの)は以下になります。
go, java, java11, java8, kotlin, node, python, python3.6, python3.7.1, ruby

また以下関連記事のリンクにてOracle Functions,Fnの検証、作成例を掲載しています。
是非ご覧になって下さい。

## 関連記事
[・Oracle FunctionsでAPEXのRestful Serviceと連携](https://qiita.com/y-araki-qiita/items/03e67f5bca570c526a7c)
[・Oracle FunctionsでTensorFlowによる画像分類](https://qiita.com/y-araki-qiita/items/fefebb7e7b20d8573095)
[・Oracle FunctionsでEmail Deliveryと連携しメール送信](https://qiita.com/y-araki-qiita/items/5a580bb739b37198300d)
[・Oracle FunctionsでObject Storage操作 (テキストを格納・取得+テキストをPDFに変換)](https://qiita.com/y-araki-qiita/items/e55bfe111794feda7716)
[・Fn Project - Fn Server構築 (Oracle Linux7.6)](https://qiita.com/y-araki-qiita/items/e11369243723792d1a6e)
[・Oracle FunctionsでOCI Go SDKを使いインスタンス操作](https://qiita.com/y-araki-qiita/items/c927aea9e743a4468c61)
・Fn Project - FnとAWS Lambda連携（近日掲載）