Skip to content

contentfulのwebhookをトリガーにブログ更新したよツイートを自動投稿する(完)

  • Jamstack
  • AWS

📅 October 23, 2020

⏱️2 min read

どうも、ブログ更新したら自動でツイートしたいおじさんです。

何回目やねん!状態ですが、やっと今回で、自動ツイートするよ記事は終了のハズ。

前回までのおさらい。

ブログ更新をtweetする | masayukiBlog

API Gateway・Lambda・StepFunctionで時差のある処理を実行する | masayukiBlog

こちらとこちらの記事で書いたとおり、api gateway・lambda・step functionsを使って、ブログを投稿したら、netlifyのビルドが終わった頃を見計らって、(5分後くらい)に「記事書いたぜ」ツイートを自動投稿を目論んでいましたが、見事失敗しておりました。

原因は、step functionsへの値の渡し方が特殊で、

"input": "{\"first_name\" : \"test\"}"
// step functionsが求めている形式

上記のような形式でしか値を渡せない。そして、contentfulのwebhookを使用すると、更新したブログのタイトルやurlを渡そうとすると、上記の文字列形式ではなく、オブジェクトの形式になってしまうため、うまくいきませんでした。

"input": {"first_name" : "test"}
// contentfulのwebhookが投げる形式

詳しくはこちらを↓

StartExecution - AWS Step Functions

間に加工用のlambdaを挟む

今では、

  1. contentfulのwebhook
  2. api gateway
  3. step functions (5分くらいnetlifyのビルド完了を待つ)
  4. lambda (ツイートする) という構成で、挫折していたのですが、

よくよく考えると、間にもう一つ加工用のlambdaを挟んで渡すパラメーターを文字列に変換したら、いいだけの話でした。

  1. contentfulのwebhook
  2. api gateway
  3. lambda (step functionsが欲しがっている形式に変換)
  4. step functions (5分くらいnetlifyのビルド完了を待つ)
  5. lambda (ツイートする)

こういう時、ピタゴラスイッチだと、ほとんど他の部分をいじらずに修正できるのがいいですね。

追加したLambda

追加したlambdaのコードです。

var aws = require('aws-sdk');
var sfn = new aws.StepFunctions();

exports.handler = function(event, context, callback) {
  event = JSON.stringify(event);

  let params = {
      input: event,
      stateMachineArn: "stepfunctionsのarn"
  };

  sfn.startExecution(params, function(err, data) {
      if (err) callback(err);
      else callback(null,event);
  });
};

注意点は、node.js 10系でないとうまくstep functions動いてくれません。そして、lambdaにstep functionsの権限与えてあげないと、stepfunctions動いてくれません。

ということで、今度こそビルド完了後にTwitterで自動投稿してくれるはず。

それではまたー。

← PrevNext →
  • @masayuki031