GCPのCloud Functionsには動作テストをするためにダイレクトトリガーというものがあります。このダイレクトトリガーをする方法にGUIのテストを実行するか、CUIでcallコマンドを実行する方法があります。
詳しくは以下の2つのリンクに書いてあります。
Direct Triggers | Cloud Functions Documentation | Google Cloud
https://cloud.google.com/sdk/gcloud/reference/beta/functions/call
1個目のリンクにhelloPubSubのサンプルコードがあるのですが、これに送るデータはbase64でエンコードする必要があります。
以下はサンプルコードそのままのコピペです。
/** * Background Cloud Function to be triggered by Pub/Sub. * This function is exported by index.js, and executed when * the trigger topic receives a message. * * @param {object} event The Cloud Functions event. * @param {function} callback The callback function. */ exports.helloPubSub = (event, callback) => { const pubsubMessage = event.data; const name = pubsubMessage.data ? Buffer.from(pubsubMessage.data, 'base64').toString() : 'World'; console.log(`Hello, ${name}!`); callback(); };
上記のhelloPubSubに'PubSub!'という文字列を送信して実行するコマンドは以下になります(サンプルそのまま)。
DATA=$(printf 'PubSub!'|base64) && gcloud functions call helloPubSub --data '{"data":"'$DATA'"}'
上記のような'PubSub!'のような短い文字列はこのままでいけるのですが、base64コマンドは長い文字列をエンコードしようとする場合、なぜか半角スペースが入るようです。
DATA=$(printf '{"a" : "1547604173", "b" : "-0.91", "c" : "0.40", "d" : "10.45", "e" : "80.58", "f" : "1013.67", "g" : "36.98", "h" : "", "i" : "", "j" : "0.00"}'|base64) echo -n $DATA
実行結果は以下。
eyJhIiA6ICIxNTQ3NjA0MTczIiwgImIiIDogIi0wLjkxIiwgImMiIDogIjAuNDAiLCAiZCIgOiAi MTAuNDUiLCAiZSIgOiAiODAuNTgiLCAiZiIgOiAiMTAxMy42NyIsICJnIiA6ICIzNi45OCIsICJo IiA6ICIiLCAiaSIgOiAiIiwgImoiIDogIjAuMDAifQ==
このようにbase64コマンドは見栄えを整えて半角スペースを入れてくれます。余計なことを。
この場合はしょうがないのでtrコマンドで半角スペースとついでに改行コードを除去します。
DATA=$(printf '{"a" : "1547604173", "b" : "-0.91", "c" : "0.40", "d" : "10.45", "e" : "80.58", "f" : "1013.67", "g" : "36.98", "h" : "", "i" : "", "j" : "0.00"}'|base64|tr -d " \n") echo $DATA
実行結果は以下。
eyJhIiA6ICIxNTQ3NjA0MTczIiwgImIiIDogIi0wLjkxIiwgImMiIDogIjAuNDAiLCAiZCIgOiAiMTAuNDUiLCAiZSIgOiAiODAuNTgiLCAiZiIgOiAiMTAxMy42NyIsICJnIiA6ICIzNi45OCIsICJoIiA6ICIiLCAiaSIgOiAiIiwgImoiIDogIjAuMDAifQ==
これでよし。
例えばJSONデータを送信したい場合、以下のようなシェルスクリプトを用意しコンソールで実行してやれば、helloPubSubを実行することができます。
DATA=$(printf '{"a" : "1547604173", "b" : "-0.91", "c" : "0.40", "d" : "10.45", "e" : "80.58", "f" : "1013.67", "g" : "36.98", "h" : "", "i" : "", "j" : "0.00"}'|base64|tr -d " \n") gcloud functions call helloPubSub --data '{"data":"'$DATA'"}'