IBM Cloud Functionsのシーケンスを使ってアプリを実行する

## はじめに
以前に投稿した記事では、IBM CloudのFunctionsの[Periodicトリガー](https://qiita.com/kenji_kanzaki/items/454027ee258254392d9f)および[Cloudantトリガー](https://qiita.com/kenji_kanzaki/items/18baead468ef97e998b0)を使ってアプリ(Action)を実行しました。

今回はIBM CloudのFunctionsのシーケンス機能を使い、複数のActionをチェーンさせて処理を実行するパターンを実装してみました。
具体的には、シーケンス機能を利用してCloudantデータベースへのデータ登録とデータ参照を実現します。

[Cloud Functions の用語](https://cloud.ibm.com/docs/openwhisk?topic=openwhisk-about&locale=ja)よりシーケンスの説明を引用
>一連のアクションをチェーニングして、コードを記述することなく、シーケンスにまとめることができます。 シーケンスは、順番に呼び出されるアクションのチェーンであり、1 つのアクションの出力が次のアクションへの入力として渡されます。 シーケンスを作成すれば、既存のアクションを組み合わせて、素早く簡単に再利用できます。 シーケンスは、アクションと同様に、REST API から呼び出したり、イベントに応答して自動的に呼び出したりできます。



## 前提
* テスト用Cloudantデータベースが作成済
* テスト用Cloudantデータベースのデータは削除済
* IBM Cloudが提供している2022/09/19時点の機能を用いています。

## Cloudantデータベースにデータを登録するシーケンスの作成
[IBM Cloud FunctionsのAction](https://cloud.ibm.com/functions/actions)ページに遷移します。
"作成"ボタンを押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2073396/7cdced7a-f830-de14-3513-94b0401e28ba.png)

"アクション"を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2073396/ecebbbcd-53b7-c284-d10e-ea0dc2e91d29.png)

表示されたアクションの作成画面にActionの情報を入力し、"作成"ボタンを押下します。
* アクション名およびパッケージに任意の値を設定します。
* ランタイムには、Node.js 16 を設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2073396/5364b910-3222-acbe-7c34-add917cc9572.png)

コードエディターが表示されるので、function mainを以下の内容に変更し、"保存"ボタンを押下します。
※ParameterをもとにCloudantに登録するデータを準備する処理です。
<pre><code>
function main(params) {
  if (!params.name || !params.comment) {
    return Promise.reject({ error: 'no name or comment'});
  }

  return {
    doc: {
      createdAt: new Date(),
       name: params.name,
       email: params.email,
       comment: params.comment
    }
  };
}
</code></pre>

メニューの"エンクロージング・シーケンス"を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2073396/11fa3c51-c426-092b-e4ae-00bc8656b7db.png)

"シーケンスに追加 +"リンクを押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2073396/39185e1a-48ea-7523-5c7d-770ac7651ffc.png)

表示されたシーケンスに追加画面にシーケンスの情報を入力し、"作成&追加"ボタンを押下します。
作成するのはEntityを登録するシーケンスです。
* "新規作成"を選択します。
* シーケンス名およびパッケージに任意の値を設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2073396/f1ecaf60-a44a-af8e-56a2-9936b4555bb2.png)

エンクロージング・シーケンスの一覧から、作成したシーケンスの名称を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2073396/7f5a3f00-cd11-c1a0-7dc5-d93bb7802ce7.png)

アクションの順序付け画面で、"追加 +"リンクを押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2073396/c7477187-d590-f95c-83d2-1854f68365ac.png)

アクションの追加画面で"パブリックの使用"を押下し、"Cloudant"アイコンを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2073396/af9a1dba-73b8-aa05-882e-d2a87ca73ed9.png)


以下の設定し"追加"ボタンを押下します。
* アクションにはcreate-documentを設定します。
* "新規バインディング"を選択します。
* バインディングの"名前"に任意の値を設定します。
* "インスタンス"、"資格情報"、"データベース"には、テスト用Cloudantデータベースの名称等を設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2073396/2b168775-513a-2686-faaf-a351e0ccfe99.png)

"保存"ボタンを押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2073396/dabf4a46-1010-8638-e723-045bb08945a5.png)

作成したシーケンスをテスト実行します。
"パラメーターを付けて起動"リンクを押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2073396/0755ec39-d881-de0c-846f-8456d33e1b1c.png)

アクションの入力データの変更画面に以下のようなパラメーター値を入力し"適用"ボタンを押下します。
<pre><code>
{
  "name": "Hanako Suzuki",
  "email": "hanako@sample.com",
  "comment": "this is Hanako's comment"
}
</code></pre>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2073396/523120eb-9acc-1030-5903-084acf156244.png)


"起動"ボタンを押下し、アクティベーションで処理が実行できたことを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2073396/9e0007fd-359a-7521-2844-a0904ab9db11.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2073396/6c40580b-6e52-c3e2-fb96-7fe08953f940.png)
参考　Cloudantに該当のデータが登録されている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2073396/9aebbbdf-411d-601f-f3a7-7b684a292758.png)


## Cloudantデータベースのデータを参照するシーケンスの作成
[IBM Cloud FunctionsのAction](https://cloud.ibm.com/functions/actions)ページに遷移し、"作成"ボタンを押下します。 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2073396/e52536b8-e54a-eec2-a298-1d38bec3e8e5.png)

"アクション"を選択し、アクションの作成画面を表示します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2073396/73ec3b3a-903c-36f6-3188-281ed42b93e2.png)

フラグを設定するActionを作成します。
Actionの情報を入力し、"作成"ボタンを押下します。
* アクション名およびパッケージに任意の値を設定します。
* ランタイムには、Node.js 16 を設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2073396/c474c5c7-f2a8-aadd-3f8c-84f442ace778.png)

コードエディターが表示されるので、function mainを以下の内容に変更し、"保存"ボタンを押下します。
※フラグを設定する処理です。trueに設定しないと最後の稼働確認でエラーが発生します。
<pre><code>
function main(params) {
  return {
    params: {
      include_docs: true
    }
  };
}
</code></pre>

メニューの"エンクロージング・シーケンス"を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2073396/0170ef83-8f28-388f-01bd-18cf9c4f7ad9.png)

"シーケンスに追加 +"リンクを押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2073396/9182ee73-6722-f90f-5b0a-2781499ea3db.png)

表示されたシーケンスに追加画面にシーケンスの情報を入力し、"作成&追加"ボタンを押下します。
* "新規作成"を選択します。
* シーケンス名およびパッケージに任意の値を設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2073396/3a05097d-ee3d-8009-a7fb-ff0123ba490a.png)

エンクロージング・シーケンスの一覧から、作成したシーケンスの名称を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2073396/103365ab-2805-ba10-3170-e81aea60c4da.png)

アクションの順序付け画面で、"追加 +"リンクを押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2073396/4af19ace-b512-e8a1-901a-623a91e89b30.png)

アクションの追加画面で"パブリックの使用"を押下します。
"Cloudant"アイコンを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2073396/139a8eb2-f23f-2117-3998-0fb612d9d454.png)

以下の設定し"追加"ボタンを押下します。
* アクションはlist-documentsを選択します。
* "マイバインディング"を選択します。
* 「Cloudantデータベースにデータを登録するシーケンスの作成」で作成したバインディング名を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2073396/731188f9-7c9c-9adc-1643-1f8e0ec5221d.png)

アクションの順序付け画面で、"追加 +"リンクを押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2073396/8ba5a08f-0440-9957-b356-42b89f131f73.png)

取得したEntityをフォーマットするActionを作成します。
アクションの追加画面で"以下を入力し、"作成&追加"ボタンを押下します。
* アクション名およびパッケージに任意の値を設定します。
* ランタイムには、Node.js 16 を設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2073396/7e4cd320-5f64-d7c4-51ec-4e1bccc6e5f0.png)

アクションの順序付け画面で、作成したAction名を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2073396/c55db35f-b4aa-e8b3-43ba-0da58355e7ae.png)

コードエディターが表示されるので、function mainを以下の内容に変更し、"保存"ボタンを押下します。
<pre><code>
const md5 = require('spark-md5');

function main(params) {
  return {
    entries: params.rows.map((row) => { return {
      name: row.doc.name,
      email: row.doc.email,
      comment: row.doc.comment,
      createdAt: row.doc.createdAt,
      icon: (row.doc.email ? `https://secure.gravatar.com/avatar/${md5.hash(row.doc.email.trim().toLowerCase())}?s=64` : null)
    }})
  };
}
</code></pre>

[IBM Cloud FunctionsのAction](https://cloud.ibm.com/functions/actions)ページに遷移します。

作成していたシーケンスを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2073396/c0b4ef0e-5ffb-53b6-986b-02a142a3e754.png)

アクションの順序付け画面で、"保存"ボタンを押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2073396/ab831ba3-9f52-61a7-9353-4fa89fe76e3f.png)

"起動"ボタンを押下し、稼働確認を行います。
"Cloudantデータベースにデータを登録するシーケンスの作成"の稼働確認で登録したデータがアクティベーションの結果に表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2073396/fff6867f-8551-52a4-b5ac-834c597b15ca.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2073396/3e315732-d3f3-a080-7047-113b04c4ec04.png)