IBM Cloud FunctionsのCloudantトリガーを使ってアプリを実行する(コマンドを使って構築)

# はじめに
以前に投稿した記事「[IBM Cloud FunctionsのCloudantトリガーを使ってアプリを実行する](https://qiita.com/kenji_kanzaki/items/18baead468ef97e998b0)」では、UIのみで作業を行いました。
本記事では上述の作業をコマンドを利用して行います。

# 前提
* IBM Cloudが提供している2022/11/16時点の機能を用いています。
* テスト用Cloudantデータベースが作成されている。

# 準備
1. リンク先の手順に従って、[IBM Cloud コマンド・ライン・インターフェース (CLI)](https://cloud.ibm.com/docs/cli?topic=cli-getting-started) をインストールします。
1. リンク先の手順に従って、[Cloud Functions プラグイン](https://cloud.ibm.com/functions/learn/cli)をインストールします。
1. 2の手順に従い、IBM Cloudへのログインし名前空間のターゲットを指定します。

# Acionの作成
次の内容のJavascriptファイルoutputInvokedLogForCloudantCmd.jsを作成します。
```javascript:outputInvokedLogForCloudantCmd.js
function main(params) {
    var date = new Date();
    var changes = params.changes;
    console.log("Invoked at: " + date.toLocaleString());
    console.log("param dbname: " + params.dbname);
    console.log("param id: " + params.id);
    console.log("param seq: " + params.seq);
    for (var change of changes) {
        console.log("rev: " + change.rev);
    }
    return { message: 'Invoked at: ' + date.toLocaleString() };
}
```
Javascriptファイルからアクションを作成します。
```shell:
ibmcloud fn action create outputInvokedLogForCloudantCmd outputInvokedLogForCloudantCmd.js
```
```
ok: created action outputInvokedLogForCloudantCmd
```
アクションの一覧を表示し、アクションが作成されていることを確認します。
```shell:
ibmcloud fn action list
```
```shell:
actions
<NAMESPACE>/outputInvokedLogForCloudantCmd   private nodejs:16
```

# Triggerの作成
Cloudantのデータ更新をトリガーとするため、該当するフィードを公開されたパッケージから探します。
公開されたパッケージの一覧を取得します。
```shell:
ibmcloud fn package list /whisk.system
```
~~~
packages
/whisk.system/cloudant                                                 shared
/whisk.system/utils                                                    shared
/whisk.system/samples                                                  shared
/whisk.system/websocket                                                shared
/whisk.system/weather                                                  shared
/whisk.system/slack                                                    shared
/whisk.system/cos                                                      shared
/whisk.system/messaging                                                shared
/whisk.system/alarms                                                   shared
~~~
/whisk.system/cloudantに含まれるフィードを確認します。
```shell:
ibmcloud fn package get --summary /whisk.system/cloudant
```
~~~
package /whisk.system/cloudant: Cloudant database service
   (parameters: *apihost, *bluemixServiceName, dbname, host, iamApiKey, iamUrl, overwrite, password, username)
                             :
 feed   /whisk.system/cloudant/changes: Database change feed
   (parameters: dbname, filter, iamApiKey, iamUrl, query_params)
~~~
/whisk.system/cloudant/changes フィードを使ってトリガーを作成します。
このフィードを実行するには資格情報(iamApiKey)などが必要です。実行の都度パラメータを渡すのを避けるため、パッケージのバインドを行います。

パラメータに設定する値を確認します。
まずはテスト用Cloudantデータベースのインスタンスを確認します。
```shell:
ibmcloud resource service-instances
```
~~~
OK
名前          ロケーション   状態     タイプ             リソース・グループ ID
Cloudant-7v   us-south       active   service_instance   XXXXXXXXXXXXXXXXXXX
~~~
テスト用Cloudantデータベースのインスタンスで利用している資格情報を確認します。
```shell:
ibmcloud resource service-keys --instance-name Cloudant-7v
```
~~~
OK
名前                 状態     作成日時
サービス資格情報-1   active   Mon Dec 27 06:17:08 UTC 2021
~~~
```shell:
ibmcloud resource service-key  サービス資格情報-1
```
~~~
名前:       サービス資格情報-1
ID:         crn:v1:bluemix:public:cloudantnosqldb:us-south:a/707977742b81692deed713861fc5108c:07c8055f-2487-47e2-8ba7-3a9c42ed7af5:resource-key:b2b2f23c-4270-43ee-8b0a-6213ffe8fdb8
作成日時:   Mon Dec 27 06:17:08 UTC 2021
状態:       active
資格情報:
            apikey:                   XXXXXX
            host:                     XXXX-bluemix.cloudantnosqldb.appdomain.cloud
            iam_apikey_description:   Auto-generated for key crn:v1:bluemix:public:cloudantnosqldb:us-south:xxxxx
            iam_apikey_name:          サービス資格情報-1
            iam_role_crn:             crn:v1:bluemix:public:iam::::serviceRole:Manager
            iam_serviceid_crn:        crn:v1:bluemix:public:iam-identity::xxxxxx
            url:                      https://XXXX-bluemix.cloudantnosqldb.appdomain.cloud
            username:                 XXXX-bluemix
~~~
テスト用Cloudantデータベースのデータベース名を確認します。
今回はUIから確認しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2073396/fb38e6a3-cd2e-6c97-4956-9c15da959818.png)


パッケージにバインドし、デフォルトのパラメータ値を設定します。
```shell:
ibmcloud fn package bind /whisk.system/cloudant sampleCloudant --param host <資格情報:host> --param iamApiKey <資格情報:apikey> --param dbname <テスト用Cloudantデータベースのデータベース名>
```
~~~
ok: created binding sampleCloudant
~~~
トリガーを作成します。
```shell:
ibmcloud fn trigger create updatCloudantFunctionsSampleCmd --feed sampleCloudant/changes
```
~~~
ok: created trigger updatCloudantFunctionsSampleCmd
~~~
トリガーの一覧を表示し、トリガーが作成されていることを確認します。
```shell:
ibmcloud fn trigger list
```
~~~
triggers
<NAMESPACE>/updatCloudantFunctionsSampleCmd         private
~~~

# Ruleの作成および動作確認
ActionとTriggerを紐づけるRuleを作成します。
```shell:
ibmcloud fn rule create updatCloudantFunctionsSampleCmdRule updatCloudantFunctionsSampleCmd outputInvokedLogForCloudantCmd
```
~~~
ok: created rule updatCloudantFunctionsSampleCmdRule
~~~
Ruleの一覧を表示し、Ruleが作成されていることを確認します。
```shell:
ibmcloud fn rule list
```
~~~
rules
<NAMESPACE>/updatCloudantFunctionsSampleCmdRule       private          active
~~~

動作確認を行うために、テスト用Cloudantデータベースに格納されたデータを更新します。
今回はUIを使って更新します。データを変更(変更なしでも良い)し"Save Changes"ボタンを押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2073396/2c7de5dc-a090-4539-5225-622ed7d457eb.png)

テスト用Cloudantデータベースのデータが更新されたので、アクティベーションを確認しActionが実行されていることを確認します。
```shell:
ibmcloud fn activation list
```
~~~
Datetime            Activation ID                    Kind      Start Duration   Status            Entity
2022-11-20 19:44:51 e2e55d3d8afd4f33a55d3d8afd1f3303 nodejs:16 cold  58ms       success           <NAMESPACE>/outputInvokedLogForCloudantCmd:0.0.1
2022-11-20 19:44:51 2446cbc266ab443886cbc266ab0438b3 trigger   warm  0s         success           <NAMESPACE>/updatCloudantFu...onsSampleCmd:0.0.1
~~~