IBM Cloud Functons 動かしてみた

# はじめに
LINEとIBM Cloud Functionsを連携したSlackへの通知機能を作ったので、3回に分けて紹介したいと思います。
　第1回：[IBM Cloud Functons 動かしてみた](https://qiita.com/katahiro/items/4b515c12e42e98e17eb7) ← この記事
　第2回：[IBM Cloud FunctionsでNode.jsのパッケージを利用してみた](https://qiita.com/katahiro/items/1d483030527367338574)
　第3回：[IBM Cloud Functions でLINEとSlack連携させてみた](https://qiita.com/katahiro/items/298eac9c0fa875333d84)

# IBM Cloud Functions って？
IBM Cloud に関わらずですが、サーバーレスで任意のプログラムを実行してくれる FaaS (Function as a Service) と呼ばれるほど一般化しているサービスのIBM Cloud版です。
IBM Cloud Function のサービスは、動かしたいプログラムである `アクション` を登録して、そのアクションを実行するきっかけとなる `トリガー` (API, Webhook, 定期実行等)を設定することで、動かすことが可能になります。  

Functions の良いところは、その実行時間、利用メモリ等が課金対象であり、プログラムが動いていない間は課金されることはありません。例えば、Cloud Foundry でAPIを公開した場合、アプリケーションが起動している限り Cloud Foundry のサービスが実行中となり 24時間 × 1か月分が毎月請求の対象となります。
※Cloud Foundry の有償アカウントでの無料枠は、2020年3月で廃止されました。

その点、Functions であれば、APIを公開しても、呼び出された時に利用したIBM Cloudのリソース分が課金対象となりますし、そもそもこちらは無料枠があるので、お試しのサービスや、個人や仲間内で利用するようなサービスを提供するにはもってこいの環境と言えるでしょう。

# IBM Cloud Functions を利用してみよう
## アクションを登録しよう
Functions を選びます
ダッシュボード左部から `F` をもじったアイコンを選びましょう。私は楽譜のフォルテにしか見えないです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/651598/b39ce33e-11ef-1cfe-1f6c-f288123ba0e5.png)
`作成の開始` を選びます
先ほどと似たような説明を書いてくれていますね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/651598/c482e17b-31ca-116d-f07e-8246bcd2d68f.png)
`クイック・スタート・テンプレート` を選びます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/651598/d07dc1d4-d841-3c1f-9816-4b534cb5f696.png)
定番 `Hello World` を選びます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/651598/1895e5fb-3bcd-dd43-f47e-60143520699f.png)
この時点でコードを編集することもできますが、このままデプロイしましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/651598/61c0af35-3ecc-22a8-b3f2-2ae7218cc63f.png)
`アクション` がデプロイできました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/651598/73b30979-8055-8b76-277d-36e194b7eedc.png)
これは、コードのコメントにも記述されていますが、実行時にパラメータとしてJSONオブジェクトが渡されて、そこに `name` 変数があれば、`Hello name変数` を、そんな変数が無ければ `Hello stranger!` を `greeting` のKeyに設定してJSONを返すよってコードです。
何も考えず、右上にある `起動` をクリックすると以下のように表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/651598/8c60f737-298b-764a-c340-eff1d0584e6d.png)
変数は何も指定していないので、`Hello stranger!` が表示されていますね。
では、`パラメータを付けて起動` を選んで、試しにパラメータを設定して `適用` を選択します。
もう一度 `起動` をクリックしましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/651598/166e0cfe-54d5-bb3e-f0fc-ac6516e76fde.png)
`name` を指定したので、そちらが表示されるようになりましたね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/651598/1166217e-e2b7-fa27-96d4-8ce244ec2477.png)

## トリガーを登録しよう
今回は、Web(インターネット)からリクエストされたら動くようにしましょう。
どこからでも良いですが、Functionsのトップに戻りましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/651598/8f8d429f-7d04-0167-31f7-3f28b1b4101f.png)
`API` から `APIの作成` を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/651598/ebe4570a-6a29-2aeb-7639-8250c9b91868.png)
API全体のベースとなる名前を決定します。ここでは `function-api` としています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/651598/bcc218f3-35a3-33f2-1f43-7f760c3d40cb.png)
`操作の作成` をクリックしてください。これで、どのようなリクエストが来た時にアクションを実行するかを定義します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/651598/c8f57b09-6a44-0b4a-1328-4260bacc7025.png)
- パス：APIとして呼び出す際の個別のパス名、アクションを識別できる名称が良いです。今回は `helloworld` を指定
- verb：`GET` `POST` `DELETE` `PUT` `PATCH` `OPTIONS` `HEAD` から選択します。今回は `GET` 要求で動作するように `GET` を選択します。
- アクションを含むパッケージ：こちらは、先ほど作成したアクションの `hello-world` を選択します。
- アクション：上記のパッケージを選択すれば、自動的に選択されます。
- 応答コンテンツタイプ：`application/json` `text/html` `text/plain` 等、アクションに合わせて選択してください。今回はJSONオブジェクトを応答するので、 `application/json` を選択します。
全て指定が完了したら、`作成` をクリックしてください。

今回は、その他の指定は特に行わず、画面下部の `作成` をクリックしてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/651598/5b3fc68d-a9cf-4bd1-cb46-c77228cf42bb.png)
これで、APIが公開されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/651598/ee6b413d-e2a9-82d3-ddc0-f4d54c5b912a.png)

# Functionsのアクションを呼び出す
以下で設定したので、合わせてURLにして、ブラウザに入力してみましょう。
ルート：https://81fe65f5.jp-tok.apigw.appdomain.cloud/function-api
アクション：/hellowold
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/651598/6c948132-ec7b-529e-e207-5831af9bc4dd.png)

無事に、パラメータ指定せずに呼び出すと、 `Hello stranger!` が値となった `greeting` がKeyのJSONオブジェクトが応答されました。

では、このAPIに `name` パラメータを指定して呼び出してみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/651598/beb01878-d426-d0b7-be7b-1a63210d080f.png)

URLにパラメータ設定することで、目的通りに `name` に指定した文字列が応答されました。
今回は、`GET` 要求でAPIが動くように指定しているので、ブラウザのURLバーに入力するだけで動いていますが、`POST` で動かしたい場合は `REST Client` 等の通信のツールやコマンドを利用するようにしてください。

# さいごに
IBM Cloud Functionsはいかがでしたでしょうか？簡単に外部公開可能なサービスを立ち上げることができるので、プログラマからすると使いやすいのではないでしょうか？
例えば、Node-REDのように、Nodeを繋ぐだけでサービスを提供可能という簡便さは、コードを記述する分、IBM Cloud Functionsのほうが手がかかる部分もありますが、細かくNodeを分けずに、処理を一本で記述したい、といったプログラマには、逆に自由にできて嬉しい部分も多いと思います。
次回は、テンプレートのコードではなく、外部と通信するパッケージを利用したアクションの作成方法の記事を書けたらと思います。
　第1回：[IBM Cloud Functons 動かしてみた](https://qiita.com/katahiro/items/4b515c12e42e98e17eb7)
　第2回：[IBM Cloud FunctionsでNode.jsのパッケージを利用してみた](https://qiita.com/katahiro/items/1d483030527367338574)
　第3回：[IBM Cloud Functions でLINEとSlack連携させてみた](https://qiita.com/katahiro/items/298eac9c0fa875333d84)