IBM Cloud Functionsを使って定期実行してみた

# はじめに
メールの定期送信を行いたいという要件があり、ibm cloud functionsを使ってみたのでその覚書を記しておきます。

今回はfunctionsを使って決まった時間に、ローカルアプリのAPIをコールする部分を作りたいと思います。

## ibm cloud functions

サービスからfunctionsを選択し、「作成の開始」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227613/2396082e-3d54-b9b5-6bbc-37df3b4c2a5d.png)

おそらく初めて使う場合は、名前空間を作成することになりますが、ここでは割愛します。

この画面で、fuctionsのコンポーネントを作成していきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227613/8a43e956-559a-9018-41d9-ead1bb0ff206.png)
今回はアクションと、トリガーのみに絞って書いていきたいと思います。
簡単に説明すると、この２つは以下のことを定義できます。
アクション: 何を実行するのか
トリガー: アクションをどのタイミングで実行するのか

## アクションの作成
アクションは「何を実行するのか」を定めたものです。
先ほどの画面からアクションを選択し、任意のアクション名を記載します。
今回言語はnode.jsを使用します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227613/afa05462-4211-f780-8223-0dd825f15466.png)

作成すると以下の画面になります。
デフォルトでは、Hello World!と返すだけのmain関数が定義されていますが、この中に、
実際に何を行いたいかを書いていきます。
![スクリーンショット 2021-12-09 22.38.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227613/d13a0c7c-1833-e1fc-bc6a-9ad9582d428d.png)

今回はローカルで動いているGETのAPIをコールするコードを記載してみました。

localで動いているAPIを呼ぶ際には、当たり前ではありますが、URLがlocalhost:xxxxのままではfunctionsから叩くことはできません。
functions上からローカルAPIを叩けるようにlocalhost:xxxxを外部公開する必要があります。
今回はngrokを使って公開し、そのURLを使用しました。
次でそちらは記載します。

ここで書いたコードを実行する際は右上の実行▷ボタンを押すことで実行できます。

```
async function main() {
    const axios = require('axios');
    const localUrl = "http://xxxx-xxxxx-xxxxx.ngrok.io/api/v1/mail"
   
    await axios.get(localUrl)
      .then(function async(response) {         
        if (response.status === 200) {
             console.log("レスポンス結果:", response.data);
        }
      })
      .catch(function (error) {
        console.log("エラー:", error);
      });
}
```

functionsでデフォルトで使用できるライブラリなど、詳しいことは(こちら)[]に記載があるので一読しておくと良いと思います。

### ngrokを使ってlocalhost:xxxxを外部公開

ngrokについては(こちら)[https://qiita.com/yamatmoo/items/8d5c2ffe6edf54c91957]の記事を参考にしました。

以下のコマンドでローカル環境のポートを公開し、
```
ngrok http {ポート番号}
```

この後、Forwardingに書かれたURLをlocalhost:xxxxの代わりに使用するだけです。


### トリガーの作成
ここまで作成したアクションを今度はどのタイミングで実行するか、を「トリガー」で定義します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227613/c58486d5-6d60-f949-022d-0a924499cf14.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227613/81bfb2ed-5f01-eb33-7618-fd52dbc7e645.png)

トリガーはオブジェクトストレージやDBが更新されたタイミングなどさまざまな5つの種類から選ぶことができます。
ここでは一番シンプルなPeriodic(時刻に基づくアクションの設定)で行ってみます。

トリガー名に任意の名前を入れ、あとは実行したいタイミングをこの画面で定めていきます。
例えば平日のAM6:00-18:00で一時間ごとにアクションを実行したい場合は以下のように設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227613/44937694-6d1e-dd99-d0f3-d17bfd931bc4.png)

### トリガーとアクションの紐付け
上でトリガーまで作成できたら最初に作ったトリガーとアクションの紐付けを行います。
右上の追加ボタンを押し、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227613/8c164bc0-0735-aaa1-a3f5-9a1a68f86de8.png)

アクションの追加画面で、既存の選択タブから先ほど作成したアクションを選択し追加を押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227613/2174b24e-6798-a330-f30e-931b87141a5d.png)

このようにトリガーとアクションが紐付けばOKです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227613/8b081756-8036-2909-a95c-97bd25f1fd26.png)

### アクティベーション・ダッシュボード
実際にトリガーで定めた時刻単位でアクションが実行されているか簡易的に見ることができる画面です。
response内容や、複数のアクションの実行結果など見ることができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227613/5e91d32d-c800-1cbf-79a8-27a69a745f2e.png)


以上、簡単ではありますがfunctionsを試した覚書でした。他の機能もこれから使う機会があれば書きたいと思います。