はじめに
こんにちは!
株式会社BFT名古屋支店・インフラ女子(?)のやまぐちです。
2022年8月にAmazon EventBridgeがWebhookを介したGithub, Stripe, Twilioとの統合に対応しました。
Webhook を使用した GitHub、Stripe、Twilio からのイベント受信に Amazon EventBridge が対応
これによりGithubのイベントをEventBridgeで検知できるようになったのですが、問題はどうやってGithubのイベントをEventBridgeに伝えるか、というところです。
今回はこの仕組みを詳しく説明するのではなく、解決したGithubのエラー「401 Invalid Signature」への対応を記載したいと思います。
「401 Invalid Signature」でAWS側へ連携できないを解決する!
やりたいこと
平たく言うと、以下図のようにしたいわけです。この図ではEventBridgeが最後ですが、この後イベントをトリガーにオンプレミスのラズパイでコマンドを実行してGithubからコードをpullするというCD(継続的デリバリー)を実装しています。
前提条件
GithubからLambda関数URLsを実行するにはGithubで作成したSecretをLambdaと共有します。とはいえAWS側は簡単で、EventBridgeのクイックスタートを実施すると、裏でCloudFormationが動いて必要なリソースを作成してくれます。神です。
前提条件は以下の通り。
- Github
- リポジトリがあること
- Secretが作成済で期限内であること
- Lambda関数URLsへのWebhookが設定済であること
- AWS
- EventBridgeのクイックスタートでGithub連携が設定済であること
上記の設定方法は次回記載します(予定)。
エラーの内容
さて、「401 Invalid Signature」とはGithubのWebhookのエラーです。
ユーザからのpushを受けてLambda関数URLsのエンドポイントに向けてJSONを投げた際に、上図のようにレスポンスコードが401、Bodyには"Invalid Signature"と表示されます。
ちなみにこれはLambdaが返しているので、コードを見ると確認できます。この部分ですね。
解決:Secretの修正
Githubのドキュメントを読み返すとSecretのフォーマットが以下のように記載されていました。
https://docs.github.com/ja/actions/security-guides/encrypted-secrets
当初作成したSecretは最初の文字が数字になっていました…。凡ミスで泣きたくなります。
なお、AWS側のSecret修正はCloudFormation(CFn)か実際に値が格納されているSecrets ManagerのSecretで行います。私はCFn大好き人間なのでもちろんCFnを更新です。
更新した後にコードをpushすると問題なくAWSへ通知できた模様です!感激!
終わりに
今回公式の手順を参考にしたはいいものの、Githubの扱いに慣れていなくて少し解決に時間がかかってしまいました。この後は通知されたイベントを元にSystems ManagerのRunCommandを使ってマネージドインスタンスであるラズパイでコマンドを実行しソースコードを更新するのですが、その話は次の次あたりで。
ここまで読んでいただきありがとうございました~ ^ ^
参考:
AWS Lambda 関数 URL を使用してイベントを受け取る - Amazon EventBridge https://docs.github.com/en/developers/webhooks-and-events/webhooks/creating-webhooks https://docs.github.com/ja/actions/security-guides/encrypted-secrets