【Oracle Cloud】OCI EventsからOracle Functionを実行してみた

## はじめに
Oracle Cloud Infrastructure（以下OCI）では、サーバレスなアプリケーションを作成・実行できるOracle Functionsというサービスが提供されています。

今回は、OCI Events + Oracle FunctionsでObject Storageへのファイルアップロードを検知し、
ファンクションの実行結果をOCI Loggingでコンソール画面に表示する手順を紹介します。

##Object Storageバケットの作成
メニュー -> ストレージ -> Object Storageに移動し、「バケットの作成」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/226871/54884e12-546e-9761-6d48-84cb1c4029e2.png)

バケットの設定を行っていきます。
ここで注意点ですが、「オブジェクト・イベントの出力」にチェックを忘れずに入れるようにします。
この項目が有効化されていないと、バケット内でオブジェクトのアップロードや削除などを行ってもイベントが発火しないです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/226871/d6b09206-99bc-cf8c-85d2-3b4b0f613456.png)

バケットが作成されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/226871/6bfdc90a-13e5-4a22-a161-555811f928bd.png)

##ファンクションの作成
https://docs.oracle.com/ja-jp/iaas/Content/Functions/Tasks/functionsconfiguringtenancies.htm
ドキュメントやコンソール画面の手順を参考に、Functionのセットアップを行います。

今回ファンクションのruntimeはNode.jsを選択しました。
fn initコマンドで自動生成されたfunc.jsを書き換えます。

```javascript:func.js
const fdk=require('@fnproject/fdk');

fdk.handle(function(input){
  console.log("Object Name is " + input.data.resourceName)
  return "";
})
```
OCI Eventsから渡される値は、引数inputに格納されます。
また、console.logの値はOCI Loggingに出力され、OCIコンソール画面上で確認することができます。
Object Storageにアップロードしたオブジェクト名は`input.data.resourceName`で取得可能なので、取得した値をコンソール画面で確認できるようにします。

次に、作成したファンクションのログを有効化します。
アプリケーションの詳細画面にて、ログ -> ログの有効化を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/226871/bcd0b37c-94f4-4de9-4e3e-9da94f71c5ff.png)

「新規ログ・グループの作成」を選択し、ファンクション用のログ・グループを作成します。
ログ・グループおよびログの名前を設定し、ログの有効化をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/226871/df7e9bc2-15d1-e314-12c0-8f32388d0071.png)

これで、ファンクションの実行結果をOCI Loggingに渡す設定ができました。

##OCI Eventsの設定
メニュー -> 監視および管理 -> イベント・サービスに移動し、「ルールの作成」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/226871/d493ccc3-1e8b-c4c2-6563-5e7f2b0904de.png)

各種設定を入力していきます。

####ルール条件
イベントが発火する条件を指定します。
条件①でObject Storageのルールを指定します。
ただ、条件①のみだと全てのObject Storageが検知対象になるので、条件②で属性を指定して特定のBucketのみをルール条件の対象にします。

+ 条件①：イベントタイプ
    + サービス名：Object Storage
    + イベント・タイプ：「Object - Create」「Object - Delete」「Object - Update」

+ 条件②：属性
    + 属性名：bucketName
    + 属性値：bucket_test


####アクション
イベントが発火した時に実行されるアクションを指定します。
今回はファンクションを実行したいので、アクションタイプをファンクションに設定し、作成したファンクションを選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/226871/a5c09c0c-4f9d-12be-2b66-42131a97ba3d.png)

イベントが作成されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/226871/139b5c77-c385-3559-d2cc-03936e04e132.png)

イベントの動作確認を行うために、ログの設定をします。
イベントの詳細画面にて、ログ -> ログの有効化を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/226871/afb90962-6d50-cd88-8370-a9bbb017125e.png)

ファンクションのログ設定時に作成したログ・グループを指定して、ログを有効化します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/226871/53f17c5a-ba34-34b6-e8d5-1146342450a8.png)


## 動作確認
Object Storageにファイルをアップロードします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/226871/c2780416-6f4d-e90e-2332-ed32e7cab129.png)

ファンクションのログを確認してみると、アップロードしたオブジェクトの名前が出力されていることが分かります。
`"Object Name is test.txt"`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/226871/d69a7ecf-ec32-3b75-1014-6b14a72c122f.png)

OCI Events側のログを見てみると、
①ファイルのアップロードを検出したログ
②Functionにイベントが正常に渡されたことを示すログ
が作成されていました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/226871/1a3db0d9-00d8-0fe4-d25a-a8af0cc739ef.png)


Oracle Functions、OCI EventsのどちらもOCI Loggingに統合されているので、例えば作成したアプリケーションが期待通りに動作しない時に、エラー内容がコンソール画面上で確認できて便利です。

## おわりに
簡易ではありますが、OCI Events + Oracle Functionsを組み合わせて、OCIのイベントを検知して処理を行う仕組みを作ることができました。
色々な利用用途がありそうなので、何か面白そうなアイデアが見つかれば検証して記事を書いてみようと思います。


##参考URL
https://blogs.oracle.com/developers/oracle-functions-invoking-functions-automatically-with-cloud-events
https://qiita.com/sugimount/items/ed460cdc4167a31bfb37