ベスパリブ

プログラミングを主とした日記・備忘録です。ベスパ持ってないです。

Cloud Functionsのダイレクトトリガーでbase64エンコードしたデータを送信して実行する

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コマンドは長い文字列をエンコードしようとする場合、なぜか半角スペースが入るようです。

例えば以下のようなデータを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'"}'