contentfulのwebhookをトリガーにブログ更新したよツイートを自動投稿する(完)
📅 October 23, 2020
•⏱️2 min read
どうも、ブログ更新したら自動でツイートしたいおじさんです。
何回目やねん!状態ですが、やっと今回で、自動ツイートするよ記事は終了のハズ。
前回までのおさらい。
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を挟む
今では、
- contentfulのwebhook
- api gateway
- step functions (5分くらいnetlifyのビルド完了を待つ)
- lambda (ツイートする) という構成で、挫折していたのですが、
よくよく考えると、間にもう一つ加工用のlambdaを挟んで渡すパラメーターを文字列に変換したら、いいだけの話でした。
- contentfulのwebhook
- api gateway
- lambda (step functionsが欲しがっている形式に変換)
- step functions (5分くらいnetlifyのビルド完了を待つ)
- 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で自動投稿してくれるはず。
それではまたー。