BFT名古屋 TECH BLOG

日々の業務で得た知識を所属するエンジニアたちがアウトプットしていきます。

【Github・Lambda関数URLs】「401 Invalid Signature」でAWS側へ連携できないを解決する!

はじめに


こんにちは!
株式会社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のフォーマットが以下のように記載されていました。

  • シークレット名には、英数字 ([a-z]、[A-Z]、[0-9]) またはアンダースコア (_) のみを含めることができます。 スペースは使用できません。
  • シークレット名の最初を GITHUB_ プレフィックスにすることはできません。
  • シークレット名の最初を数字にすることはできません。
  • シークレット名は大文字と小文字を区別しません。
  • シークレット名は、作成されたレベルで一意である必要があります。

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