IBM Cloud FunctionsのPeriodicトリガーを使ってアプリを実行する

##はじめに
Functions-as-a-Service (FaaS) の理解を深めるため、FaaSプラットフォームであるIBM Cloud Functionsを使って簡単なアプリを作ってみました。
IBM Cloud Functionsでは、執筆時点で以下のようなトリガーがサポートされています。

|トリガー|説明|
|:-----------|:------------|
|Cloud Object Storage|特定のバケット内のオブジェクトが更新されるたびにアクションをトリガーします。|
|Cloudant|特定のCloudantデータベースが更新されるたびにアクションをトリガーします。|
|Custom Trigger|特定のRESTエンドポイントがPOSTされるたびにアクションをトリガーします。|
|Event Streams|Kafkaキューに新しいメッセージが書き込まれるたびにアクションをトリガーします。|
|Periodic|時刻に基づいてアクションをトリガーします。|

今回はPeriodicトリガーを使ってアクション(Function)を実行するパターンを実装しました。
具体的には1分毎にアクションをトリガーし、コンソールにアクションが実行されたことを出力します。

##前提
* IBM Cloudが提供している2021/12/22時点の機能を用いています。
* コマンドは使用しません。UIのみで作業を行います。
* トリガー、アクションは未作成の状態です。

##Periodicトリガー&アクションの作成
[IBM Cloud Functions](https://cloud.ibm.com/functions/)のページに遷移します。ログインしていない場合はログインします。　
メニューの"トリガー"を選択し、表示された画面の"作成"ボタンを押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2073396/e07f2a37-5736-29e7-64a8-f77fb6afaa48.png)

"トリガー"を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2073396/9212851f-4937-34da-dbff-d7625e7181dd.png)

"Periodic"を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2073396/d83af493-230f-06fe-5352-2fcaa38848c8.png)

表示された新規トリガー構成画面でトリガーの情報を入力します。

* 任意のトリガー名を記入します。
* 今回はCron式で入力するため、"Cron"を押下します。
* Cron式を記入します。今回は1分毎に起動するため「0/1 * * * *」を入力しました。左側にトリガーが発生する予定時刻が出力されるので入力の正しさを確認できます。
* 入力後、"作成"ボタンを押下します。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2073396/a430b54d-f1ac-2d36-8b43-1f0d5ffbbc6d.png)

トリガーとトリガー発生時に実行するアクションを紐づけるため、"追加"を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2073396/456ba1c1-7b9b-44c9-88d2-1122edf222a0.png)

表示されたアクションの追加画面でアクションの情報を入力します。
今回はアクションを新規に作成するので"新規作成"を選択した状態で以下の入力を行います。

* 任意のアクション名を記入します。
* ランタイムは"Node.js 12"を選択します。
* "作成&追加"ボタンを押下します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2073396/6f75a5c1-faf4-c533-17f5-3c634b857899.png)

"接続されたアクション"の一覧に作成したアクションが追加されます。
アクションのコードを書くため、作成したアクションの名前を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2073396/7b0f270c-4b02-df9b-1f8d-8ceb57afe82a.png)

コードエディターが表示されるので、function mainを以下の内容に変更し、"保存"ボタンを押下します。
<pre><code>
function main(params) {
    var date = new Date();
    console.log("Invoked at: " + date.toLocaleString());
    return { message: 'Invoked at: ' + date.toLocaleString() };
}
</code></pre>

## 動作確認
左上の  "Functions"リンクを押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2073396/6592ce72-f4dc-64b2-8148-b97a457b6c95.png)

メニューの"アクティブ化ダッシュボード"を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2073396/1358069c-e887-a205-7f84-12f6c526e9a3.png)

アクティベーション・ダッシュボード画面が表示され、アクティベーション・ログにトリガーの発生とアクションの実行が記録されていることが確認できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2073396/1f90e814-9596-5a0a-5e01-d66fcf1cc453.png)

## 追加実装　トリガーのパラメーターを設定してアクション側でパラメーター値を取得
Functionsのメニューから"トリガー"を選択、表示されたトリガーの一覧から作成したトリガーの名前を押下します。
メニューの"パラメーター"を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2073396/acf589ce-4e0e-632a-dcc6-3491516ef0a6.png)

"パラメーターの追加"を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2073396/0744a09b-68b4-7bd6-12d3-268ae10298ac.png)

パラメーター名とパラメーター値に任意の値を設定し、"保存"ボタンを押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2073396/e14c2fce-d0de-6768-2014-5a62e2a42e57.png)

アクションを修正します。
メニューの"接続されたアクション"を選択し、作成したアクションの名前を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2073396/44ccb781-91f4-c0fa-7d49-3ec3dff2a94b.png)

コードエディターが表示されるので、パラメーター値をコンソールに出力する処理を追加します。追加後、"保存"ボタンを押下します。
<pre><code>
function main(params) {
    var date = new Date();
    console.log("Invoked at: " + date.toLocaleString());
    console.log("param testKey: " +params.testKey);
    return { message: 'Invoked at: ' + date.toLocaleString() };
}
</code></pre>

"アクティブ化ダッシュボード"から動作確認を行い、パラメーター値が取得され出力されていることが確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2073396/64807de8-9531-a8e2-473c-70041ea3940c.png)


## 参考

今回利用したソースコードは以下のリンク先の[handler.js](https://github.com/IBM/ibm-cloud-functions-action-trigger-rule/blob/master/handler.js)を再利用しました。
https://github.com/IBM/ibm-cloud-functions-action-trigger-rule