1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

IBM Cloud Functionsを使ってLINE Notifyを送ってみる #LINEDC

Last updated at Posted at 2023-11-07

追加: 書いてから気づいたんですけど非推奨になってました。

IBM Cloud FunctionsがCloud Foundryで使ってたときのユースケースっぽい挙動してくれるかもと思い、すこし触ってみました。

大きな流れ

Functionsを使おうとすると、認証でIBM Cloud IAM トークンが必要と言われるのですが、トークン取得にCLIツールを使う必要があるっぽい(?)ので、CLIの設定 -> トークン取得 -> Functionsの利用とう流れで進めます。

調べるとIBM Cloud CLIは必要そうだったのでこの手順が良さそうな雰囲気です。

1. IBM Cloud CLI周りのセットアップ

IBM Cloud CLIのインストール

GitHub CodeSpacesの環境にインストールします。

$ curl -fsSL https://clis.cloud.ibm.com/install/linux | sh

ちゃんとインストールされた模様です。

$ ibmcloud
NAME:
  ibmcloud - A command line tool to interact with IBM Cloud
  Find more information at: https://ibm.biz/cli-docs

USAGE:

・・・略

IBM Cloud CLIでログイン

マイページのユーザーアイコンからCLIとAPIにログインを選択します。

スクリーンショット 2023-11-07 18.01.57.png

ワンタイムパスコードでのログイン方法が表示されるので、コピペ実行します。

$ ibmcloud login -a https://cloud.ibm.com -u passcode -p <ワンタイムパスコード>

2. トークンの取得

次にトークン取得ですが以下のコマンドで取得できました。

$ ibmcloud iam oauth-tokens

以前触った時に事前にアカウントで何か設定をしてしまってる可能性もありますが、、一旦これでOKです。

IAM token:  Bearer xxxxxxxxxxxxxxxxxxxxxxxxxx

といった形で取得できます。これを後で利用します。

参考
https://qiita.com/testnin2/items/3a4ca8a1a2b79b713c48

3. IBM Cloud Functionsの利用

https://cloud.ibm.com/functions/ にアクセスします。

スクリーンショット 2023-11-07 18.05.49.png

名前空間の作成

ネームスペースの作成をします。

スクリーンショット 2023-11-07 18.07.23.png
Notion2Discordっていう名前で何かやろうとした跡がある...

識別できれば良いと思うので適当につけます。

ロケーションは東京で、リソースグループもDefaultのままにします。

スクリーンショット 2023-11-07 18.08.49.png

Functionsの作成

"作成の開始"から進みます。

アクションの作成をしてみます。

スクリーンショット 2023-11-07 18.09.57.pngスクリーンショット 2023-11-07 18.10.45.png

アクションごとにNode.jsなどのランタイムを選べるみたいですね。

LINEに通知するコードを元に処理を書く

こちらの記事の内容をもとにLINE Notifyを使ってLINE通知をしてみます。

コードのところに以下をコピペしていきます。const axios = require('axios');などは特にnpm installなどをする操作はしてないので自動で裏側でインストールしてくれてる模様です。

スクリーンショット 2023-11-07 18.40.46.png

/**
  *
  * main() このアクションを呼び出すときに実行されます
  *
  * @param Cloud Functions アクションは 1 つのパラメーターを受け入れます。このパラメーターは JSON オブジェクトでなければなりません。
  *
  * @return このアクションの出力。この出力は、JSON オブジェクトでなければなりません。
  *
  */
 
const axios = require('axios');
const qs = require('querystring');

const LINE_NOTIFY_API_URL = 'https://notify-api.line.me/api/notify';

const LINE_NOTIFY_TOKEN = 'LINE Notifyのトークン';

let config = {
    url: LINE_NOTIFY_API_URL,
    method: 'post',
    headers: {
        'Content-Type': 'application/x-www-form-urlencoded',
        'Authorization': 'Bearer ' + LINE_NOTIFY_TOKEN
    },
    data: qs.stringify({
      imageFullsize: `https://images.dog.ceo/breeds/airedale/n02096051_3443.jpg`,
      imageThumbnail: `https://images.dog.ceo/breeds/airedale/n02096051_3443.jpg`,
      message: 'ProtoOut Studioからの通知だよー! https://images.dog.ceo/breeds/airedale/n02096051_3443.jpg',
    })
}

async function getRequest() {

  ////// LINE Notify に送る ////////////////////////

  try {
    const responseLINENotify = await axios.request(config);
    console.log(responseLINENotify.data);
  } catch (error) {
    console.error(error);
  }

}

function main(params) {
    getRequest();    // getRequest を呼び出してデータを読み込む
	return { message: 'Hello World' };
}

LINE Notifyのトークンの箇所は書き換えましょう。

main関数の中が起動に呼ばれてそうですね。

起動してみる

保存をして、起動ボタンを押すとLINEに通知がきます。

スクリーンショット 2023-11-07 18.42.24.png

無事に通知がきました。

スクリーンショット 2023-11-07 18.42.11.png

エンドポイントをCURLで叩いて呼び出し

エンドポイントの項目から

curl --request POST --url 'https://xxxx.functions.cloud.ibm.com/api/v1/namespaces/xxxxxxxxxxxxxxxxxxxxxx/actions/アクション名?blocking=true' --header 'accept: application/json' --header 'authorization: Bearer <IAM token>'

のようなCURLで実行するコマンドサンプルを使って試してみます。

ここでIAM tokenという記述があるので、先ほど入手したIAMトークン(ibmcloud iam oauth-tokensで取得したトークン)を使ってエンドポイントにリクエストをしてみましょう。

curl --request POST --url 'https://xxxx.functions.cloud.ibm.com/api/v1/namespaces/xxxxxxxxxxxxxxxxxxxxxx/actions/アクション名?blocking=true' --header 'accept: application/json' --header 'authorization: Bearer XXXXXXXXXXXXXXXXXXX'

のような感じですが、トークンは結構長いです。

実行するとこんな感じのレスポンスがあり、LINE Notifyで通知もされます。

ちなみに、以下JSONはレスポンスそのままではなく見やすいように整形ツールで整形してあります。

{
	"activationId": "xxxxxxxxxxxx",
	"annotations": [
		{
			"key": "path",
			"value": "xxxxxxxxxxxxxxxxxxx/アクション名"
		},
		{
			"key": "waitTime",
			"value": 199
		},
		{
			"key": "transId",
			"value": "xxxxxxxxxxxxxxxxxxxxx"
		},
		{
			"key": "kind",
			"value": "nodejs:20"
		},
		{
			"key": "timeout",
			"value": false
		},
		{
			"key": "limits",
			"value": {
				"concurrency": 1,
				"logs": 10,
				"memory": 256,
				"timeout": 60000
			}
		},
		{
			"key": "initTime",
			"value": 83
		}
	],
	"duration": 185,
	"end": 1699350113386,
	"logs": [],
	"name": "reply",
	"namespace": "xxxxxxxxxxxxxxxxxxxx",
	"publish": false,
	"response": {
		"result": {
			"message": "Hello World"
		},
		"size": 25,
		"status": "success",
		"success": true
	},
	"start": 1699350113201,
	"subject": "nobisuke@hogehoge.com",
	"version": "0.0.1"
}

コードのmain関数内の{message: 'Hello World'}はこちらのレスポンスの中に含まれてました。

所感など

トリガー設定がなくアクションだけでもとりあえず試すことができました。

デバッグが辛いかもしれないという雰囲気を感じつつとりあえず動いたから一旦ここまででまとめておきます。

トリガーのところでトリガーを設定して任意のアクションと紐づける みたいな感じのことをやりたい気もしますがそれはまた機会があれば。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?