microCMS の Webhooks と Lambda の連携方法

2023/09/03に公開

こんにちは!@Ryo54388667です。

今回は、microCMS の Webhook と Lambda を連携する手順を説明していきます!

https://twitter.com/Ryo54388667

🤔 背景

microCMSで記事を更新した際、特定のAPIを叩くユースケースがありました。
その際、Webhookの責務としてトリガーのみを担う場合、現状のmicroCMSのWebhookのみで事足ります。

しかし、トリガーだけではなく、APIのリクエストbodyのdataプロパティに特定のデータを格納する必要がありました。現在(2023/09)のmicroCMSのWebhookの仕様ではリクエストbodyにデータを格納することはできないようです。そのような背景から、microCMSのWebhookと何らかのAPIと連携する必要がありました。その結果、Lambdaとの連携が候補に挙がり、素振りを行いました。

Lambda以外でこういう方法で行っています!という方がいらしたら、コメントください🙏

 
 

📝 手順

構成図について

今回作成する構成の全体像は以下の通りです。

手順の概要は以下の通りです。

  • Lambda の作成および設定
  • API Gateway の作成および設定
  • microCMSのWebhookの設定

 
 

1.Lambdaを作成する

まず、AWSマネジメントコンソールからLambdaのページに遷移します。
そして下記の画像のボタンを押下し、関数を作成します。

 

ボタンの押下後、Lambdaの基本的な設定の画面に遷移します。
続いて、下記の画像の赤枠の箇所を選択します。

 

今回、ランタイムは「Node.js 18.x」を選択します。
ここはバージョン18以前でも全く問題ありませんが、Lambda内でAPIリクエストを行うので、その際に便利なfetchメソッドを利用するためにNode.js18を選択しました。

詳しくは下記の公式ドキュメントをご覧ください。Node.js18以前の時の方法も記載されています。
https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/nodejs-handler.html

 

その設定をした後、画面下部の「関数の作成」ボタンを押下します。
続いて、関数の作成後、画像の赤枠の「コード」のタブを確認します。

 

コードの箇所に下記のコードをコピー&ペーストします。
APIコールするエンドポイントとCMS側から渡されるデータの箇所を変更してください。

const url = "https://aws.amazon.com/"; // APIのエンドポイント

export const handler = async(event) => {
   console.log(“ログの確認用 :, JSON.stringify(event, null, 2))
    const data = event.data // CMSから渡されるデータを抽出
    try {
        // fetch is available with Node.js 18
        const res = await fetch(url, {
           method: "POST",
           body: JSON.stringify(data) // bodyに必要なデータを格納
        });
        console.info("status", res.status);
        return res.json();
    }
    catch (e) {
        console.error(e);
        return 500;
    }
};

コードを貼り付けた後、必ず保存(command + s) を行ってください。

 
 

2.API Gatewayの設定をする

ここで一度、Lambdaのページを離れ、AWSのAPI Gateway のページに遷移します。
一覧ページで「APIを作成」ボタンを押下します。

 

「統合」のセレクトボックスで「Lambda」を選択します。

統合って何なん?

APIが通信するバックエンドサービスを指定します。この指定は統合と呼ばれます。

接続先のことを指すようです。

 

すると、新たなセレクトボックスが表示され、Lambdaの箇所を選択すると、先ほど作成したLambda関数が候補として表示されます。該当するLambda関数を選択します。
そのあと、「API名」を決めます。こちらはダッシュボードに表示させるためのラベルなので、任意の命名で構いません。「次へ」ボタンを押下してください。

 

押下後、「ルートの設定」ページに遷移します。
このページでHTTP メソッドとエンドポイントのパスの設定を行います。

microCMSのWebhookはpostメソッドでアクセスする仕様なので、メソッドの箇所を「POST」と設定します。 リソースパスには、アクセスするためのエンドポイントの末尾(任意の文字列) を入力します。デフォルト値はAPI名です。ここは適宜変更してください。「次へ」ボタンを押下してください。

 

その後のページはデフォルト値で「次へ」を押下し、確認ページで「作成」を押下して、API Gatewayを完成させます。

ここでAPI Gateway のダッシュボードに戻り、作成した API を押下してください。
あとでエンドポイントとして利用する文字列を取得します。

画像の赤枠の箇所をコピーしておきます。

 
 

再度、先ほど作成したLambdaのページを開きます。
すると、下記の画像のように、LambdaとAPI Gateway が接続されています。

 

それが確認できた後、画像の「Deploy」ボタンを押下して公開します。
これで、LambdaとAPI Gateway で一連のAPIの完成です🎉

 
 

3.microCMSのWebhooksの設定

あとは、microCMSのWebhookの設定だけです!
microCMSのダッシュボードを開き、Webhookを作成したいAPIの設定画面を開きます。

 

Webhooks設定のモーダルが表示されるので、その中の「カスタム通知」を押下します。
Lambdaの連携はmicroCMS公式では行っていないからですね。

 

あとは、こちらの入力を行っていけば設定完了です。
留意する必要があるのは、URLの箇所です。

先ほど、API Gateway のページでコピーしておいたエンドポイントを利用します。
合わせて、こちらで設定したリソースパスも入力に必要です。ヘッダーに利用するデータをタグとして入力しても構いません。

(コピーしておいたエンドポイント) / (リソースパス)

 
 

👀 確認方法

設定としてはすでに完了していますが、一応確認したい場合もありますよね!
Webhookの通知が来ているかどうかを確認する方法があります。
まず、AWS のLambdaのページを開き、作成した関数のページに遷移します。

そして、下の画像の「モニタリング」タブを押下すると、「Cloudwatchログを表示」のボタンが表示されるので、そちらを押下します。

 

Cloudwatchのロググループのページが開きます。画像の赤枠の箇所のログストリームをどれか押下してください。Webhookが発火したであろう時刻のものを選ぶと良いと思います。

 

いくつかログが表示されているので、確認ができます!
ログが表示されるのは、Lambdaで下記のコードを書いているためです。

console.log(“ログの確認用 :, JSON.stringify(event, null, 2))

 

 

以上がmicroCMS の Webhook と Lambda を連携する手順です!

最後まで読んでいただきありがとうございます!
気ままにつぶやいているので、気軽にフォローをお願いします!🥺

https://twitter.com/Ryo54388667

Discussion