IBM Cloud FunctionsのActionをHttpより呼び出せるようにする(コマンドを使って構築)

# はじめに
以前に投稿した記事「[IBM Cloud FunctionsのActionをHttpより呼び出せるようにする](https://qiita.com/kenji_kanzaki/items/efe582bc031d50174654)」では、UIのみでIBM Cloud Functionsの設定作業を行いました。
本記事ではコマンドを利用して上述の作業を行います。
設定作業は簡単で、記事の大半は動作確認です。

# 前提
* IBM Cloudが提供している2023/7/23時点の機能を用いています。
* 「[IBM Cloud FunctionsのActionをHttpより呼び出せるようにする](https://qiita.com/kenji_kanzaki/items/efe582bc031d50174654)」の作業が行われていること。

# 準備
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へのログインし名前空間のターゲットを指定します。
1. 「[IBM Cloud FunctionsのActionをHttpより呼び出せるようにする](https://qiita.com/kenji_kanzaki/items/efe582bc031d50174654)」で有効化したAction readEntitySequenceの「Webアクションとして有効化」を無効化(チェックを外す)します。

# Webアクションの有効化
sample/readEntitySequenceのWebアクションを有効化します。
``` shell
ibmcloud fn action update sample/readEntitySequence --web=true
```
``` shell
ok: updated action sample/readEntitySequence
```

## 動作確認
「[IBM Cloud FunctionsのActionをHttpより呼び出せるようにする](https://qiita.com/kenji_kanzaki/items/efe582bc031d50174654)」と同様に、Web アクション(認証なしで利用できるURL)とREST API(認証が必要かつPOSTメソッドのみのURL)の2つのURLで動作確認します。
#### Web アクション(認証なしで利用できるURL)での動作確認
WebアクションのURLを取得します。
``` shell
ibmcloud fn action get sample/readEntitySequence --url
```
``` shell
ok: got action readEntitySequence
https://us-south.functions.appdomain.cloud/api/v1/web/xxxxx/sample/readEntitySequence
```
Curlコマンドを使って動作確認します。
URLの最後に拡張子"json"を追加しています。これは稼働確認時に"204 No Content"が発生したため、その対策として拡張子を追加しました。

``` shell
Curl https://us-south.functions.appdomain.cloud/api/v1/web/xxxxx/sample/readEntitySequence.json
```
レスポンスとしてentriesが含まれていることを確認します。
``` shell
{
  "entries": [{
    "comment": "this is Hanako's comment",
    "createdAt": "2022-08-30T12:00:17.584Z",
    "email": "hanako@sample.com",
    "icon": "https://secure.gravatar.com/avatar/190f9f022b4bfb762e152f1c3d6dd35a?s=64",
    "name": "Hanako Suzuki"
  }, {
    "comment": "this is Taro's comment.",
    "createdAt": "2022-11-22T13:47:31.157Z",
    "email": "taro@sample.com",
    "icon": "https://secure.gravatar.com/avatar/4179319e919e011a1aec1ca4d34100b1?s=64",
    "name": "Taro Tanaka"
  }]
}
```

#### REST API(認証が必要かつPOSTメソッドのみのURL)での動作確認
URLとBasic認証用のBASE64 エンコード値を取得します。
``` shell
ibmcloud fn action get sample/readEntitySequence -v
```
※コマンド結果の後半は記載を割愛
``` cmd
REQUEST:
[GET]   https://us-south.functions.cloud.ibm.com/api/v1/namespaces/_/actions/sample/readEntitySequence?code=false
Req Headers
{
  "Authorization": [
    "Basic xxxxxxxxxxxxx"
  ],
  "User-Agent": [
    "CloudFunctions-Plugin/1.0 (2023-06-14T19:55:08+00:00) windows amd64"
  ]
}
　　　　　　:
　　　　　　:
```
Curlを使って動作確認を行います。
* HTTP METHODはPOST(-X POST)
* Authorizationヘッダを使ってBASIC認証します(-H "Authorization:Basic [上述のAuthorizationに記載された値]")
* URLは上述のREQUESTに記載されたURL(namespacesの後の"_"には自身のnamespaceを設定する。上述の結果に含まれています。)
* クエリパラメーターとしてblocking=trueを付与
``` shell
curl -X POST -H "Authorization:Basic xxxxxxxxxxxxx" https://us-south.functions.cloud.ibm.com/api/v1/namespaces/xxxxx/actions/sample/readEntitySequence?blocking=true
```
※処理結果(整形しています)
``` json
{
	"activationId": "313f8545fe804994bf8545fe8059946d",
	"annotations": [
		{
			"key": "topmost",
			"value": true
		},
		{
			"key": "path",
			"value": "xxxxx/sample/readEntitySequence"
		},
		{
			"key": "transId",
			"value": "65e0cbbb10474d839dcf33778411481f"
		},
		{
			"key": "kind",
			"value": "sequence"
		},
		{
			"key": "limits",
			"value": {
				"concurrency": 1,
				"logs": 10,
				"memory": 256,
				"timeout": 60000
			}
		}
	],
	"duration": 830,
	"end": 1690717914392,
	"logs": [
		"5d4ed518129a48bd8ed518129a98bd4f",
		"dd8985ab139b43b08985ab139b73b046",
		"203330bceda64d80b330bceda67d8050"
	],
	"name": "readEntitySequence",
	"namespace": "XXXXX",
	"publish": false,
	"response": {
		"result": {
			"entries": [
				{
					"comment": "this is Hanako's comment",
					"createdAt": "2022-08-30T12:00:17.584Z",
					"email": "hanako@sample.com",
					"icon": "https://secure.gravatar.com/avatar/190f9f022b4bfb762e152f1c3d6dd35a?s=64",
					"name": "Hanako Suzuki"
				},
				{
					"comment": "this is Taro's comment.",
					"createdAt": "2022-11-22T13:47:31.157Z",
					"email": "taro@sample.com",
					"icon": "https://secure.gravatar.com/avatar/4179319e919e011a1aec1ca4d34100b1?s=64",
					"name": "Taro Tanaka"
				}
			]
		},
		"size": 847,
		"status": "success",
		"success": true
	},
	"start": 1690717908396,
	"subject": "XXXXX",
	"version": "0.0.3"
}
```
entriesが含まれ、値が返ってきていることを確認します。