Oracle Cloudではじめるサーバレス　Oracle Functionsことはじめ

# はじめに
本記事は、Oracle CloudでOracle Functionsを使用するための必要な設定方法について記載しています。

2019年8月1日に、正式サービスとしてOracle Cloudのサーバレスを実現するための**[Oracle Functions](https://blogs.oracle.com/cloud-infrastructure/oracle-functions-now-generally-available)**と、Oracle Functionsで作成した関数をイベントドリブンで呼び出せる**[Oracle Cloud Infrastructure Events](https://blogs.oracle.com/cloud-infrastructure/oracle-cloud-infrastructure-events-service-now-generally-available)**のリリースが発表されました。

Oracle Functionsの公式マニュアルはWebから参照できますが、設定に関して一連の流れがまとまっていないため、初見の場合とても分かりずらいです。

本記事は、最短距離でOracle CloudのOracle Functionsを使用するための設定手順について簡潔にまとめています。

## サーバレス
はじめに、サーバレスについて簡単に解説します。

一般的なサーバレスの技術は、FaaS（Function as a Service）として分類されます。
他のクラウドサービスで言うと、[AWS Lambda](https://aws.amazon.com/jp/lambda/)がメジャーです。

実行時間に応じて課金されるため、コード（関数）が実行されていないときには料金は発生しません。スクリプトの実行環境のみ提供されるので、IaaSに比べて大分保守コストは下がります。

実用的には、イベントに連動してトラフィックやパフォーマンスが求めれる、現代型のクラウドを使用したアーキテクチャと親和性が高い技術になります。

ホスティングするクラウドサービスも増えてきているので、サーバレスが進むと、システムの抽象化もより進み、インフラの概念は大きく変わることでしょう。

## Oracle Functions
Oracle Functionsを使用するためには、Oracle FunctionsとOracle Cloud Infrastructure Eventsの設定が必要ですが、その他にも準備作業があります。

全体的に以下の作業が必要です。

1. アクセス権の設定
2. OCIRリポジトリの作成
3. Oracle Functionsの作成
4. Oracle Eventsの作成

本記事では、Oracle Functionsを使うために必要な上記、「アクセス権の設定」と「OCIRリポジトリの作成」について記載しています。

### アクセス権の設定
ファンクションを作成するには、ユーザー・アカウントに、少なくとも1つのOCIRリポジトリと関連イメージに対するアクセス権が必要です。はじめに、アクセス権を設定するためのユーザを作成（※）します。

（※）既存ユーザを使用する場合は、ユーザ作成は不要

#### ユーザ
はじめに、Oracle Functionsで使用するユーザを作成します。
このユーザは、compartment単位で考えます。

また、APIの公開キーとトークンも合わせて設定します。

- APIの公開キー作成手順は、[Required Keys and OCIDs](https://docs.cloud.oracle.com/iaas/Content/API/Concepts/apisigningkey.htm)を参照
- トークンの作成は、[Docker CLIを使用したイメージのプッシュ](https://docs.oracle.com/cd/E97706_01/Content/Registry/Tasks/registrypushingimagesusingthedockercli.htm)を参照

#### グループ
ユーザ作成後、ユーザが所属するグループを作成（※）し、グループに先ほど作成したユーザを追加します。

（※）既存グループを使用する場合は、ユーザ作成は不要

#### ポリシー
グループ作成後、親コンパートメントのポリシーに以下のポリシー・ステートメントを設定します。

```text
allow group ＜グループ名＞ to manage repos in tenancy
allow group ＜グループ名＞ to manage cloudevents-rules in tenancy
```

- 設定画面

<img width="712" alt="スクリーンショット 2019-08-13 13.35.04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/d0ff042c-f776-90ab-e5ad-598d1ad47fbf.png">

- 設定後の画面例

<img width="1130" alt="スクリーンショット 2019-08-13 13.35.55.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/3fbc8a5c-5f21-4032-1433-464ba1de4aca.png">


### OCIRリポジトリの作成
次に、OCIRリポジトリと関連イメージを作成します。

#### OCIRリポジトリの作成
必要に応じて、OCIRリポジトリを作成します。
なお、OCIRリポジトリが存在しない場合は、`docker push`コマンド実行時にリポジトリが作成されます。

<img width="1440" alt="スクリーンショット 2019-08-13 13.54.47.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/d1e1c24b-502e-2d86-e504-130db10fd4b1.png">

#### イメージのアップロード
以下のコマンドを実行し、Oracle Cloud Infrastructure Registryにログインします。

`# docker login nrt.ocir.io`

```console
Username: ＜コンパートメント名＞/＜リポジトリ名＞
Password: 
Login Succeeded
```

以下のコマンドを実行し、Oracle Cloud Infrastructure Registryにプッシュするタグをイメージに付けます。

`# docker tag ＜コンテナID＞ nrt.ocir.io/＜コンパートメント名＞/＜リポジトリ名＞/＜イメージ名＞:＜タグ名＞`

以下のコマンドを実行し、Oracle Cloud Infrastructure Registryにプッシュします・

`# docker push nrt.ocir.io/＜コンパートメント名＞/＜リポジトリ名＞/＜イメージ名＞:＜タグ名＞`

**docker pushコマンドが失敗する場合は、ポリシーの設定に不備があります。ポリシーを設定しているコンパートメントの場所にも考慮が必要です。**

- docker pushコマンド失敗の例

```console
denied: User UserId(ocid1.user.***) cannot UploadDockerLayer on resource mytenant/myproject
```

# おわりに
上記、準備作業が終わったら、Oracle Functionsの作成とOracle Eventsの作成を行います。

## 参考

- [Policy Syntax](https://docs.cloud.oracle.com/iaas/Content/Identity/Concepts/policysyntax.htm)
- [Policies to Control Repository Access](https://docs.cloud.oracle.com/iaas/Content/Registry/Concepts/registrypolicyrepoaccess.htm)
- [Create Policies to Control Access to Network and Function-Related Resources](https://docs.cloud.oracle.com/iaas/Content/Functions/Tasks/functionscreatingpolicies.htm)
- [Events and IAM Policies](https://docs.cloud.oracle.com/iaas/Content/Events/Concepts/eventspolicy.htm)
- [レジストリの準備](https://docs.oracle.com/cd/E97706_01/Content/Registry/Concepts/registryprerequisites.htm#Availab)
- [Docker CLIを使用したイメージのプッシュ](https://docs.oracle.com/cd/E97706_01/Content/Registry/Tasks/registrypushingimagesusingthedockercli.htm)