BacklogのGitリポジトリに、コミットメッセージに課題キーを書いてプッシュすると、課題にプッシュされたことが自動でコメントされる機能があります。
■意外と便利?課題キーリンク
https://backlog.com/ja/blog/issue-key-link/#commit
この機能、大変便利なのですが、案件の仕様上、BacklogのGitリポジトリが使えないことがままあります。
そこで、今回はGitHubリポジトリのwebhook機能とAWS Lambdaを使って、同様の機能を実現してみたいと思います。
<目次>
(1)AWS LambdaとAmazon API Gatewayの設定をする
(6)AWS使用料について(後編)
(0)準備するもの
・AWSのアカウント
・Backlogのアカウント
・GitHubのアカウント
(1)AWS LambdaとAmazon API Gatewayの設定をする
■基本的なウェブアプリケーションを構築する - モジュール 2: サーバーレス関数を構築する
https://aws.amazon.com/jp/getting-started/hands-on/build-web-app-s3-lambda-api-gateway-dynamodb/module-two/?e=gs2020&p=build-a-web-app-intro
基本的には上記のチュートリアルに沿って進めます。
AWS Lambdaのコンソールを開いて、「関数の作成」をクリック。
関数名:commentBacklogWithGithubCommit
ランタイム:Node.js 14.x
とします。
これで、リクエストに対して、下記のようなレスポンスを返す関数ができました
{
statusCode: 200,
body: JSON.stringify('Hello from Lambda!'),
}
ただ、この時点では、この関数にリクエストを送るurlがない状態です。
次は、urlを作ります。
AWS Lambdaのダッシュボードから、先ほど作成した「commentBacklogWithGithubCommit」の詳細を開きます。
「トリガーを追加」を押して、下記の設定で、API Gatewayを追加します。
Cross-origin resource sharing(CORS)にチェックを必ず入れましょう。
これで、AWS Lambdaの関数を呼び出すためのURL(エンドポイント)が作成されました。
トリガーの「APIエンドポイント」を開くと、「"Hello from Lambda!"」と表示されます。
次に、現在、エンドポイントでANYメソッドが設定されていますが、GitHubのwebhookではPOSTメソッドで呼ばれるため、修正します。
Amazon API Gatewayのコンソールから、「commentBacklogWithGithubCommit-API」の詳細ページを開き、左メニューの「ルート」、真ん中の「ANY」を押した後、「編集」を押し、開いた設定画面でANYをPOSTに変更します。
これで、getでアクセスすると、internal server errorが、POSTでアクセスすると、「Hello from Lambda!」が返ってくるようになりました。
なお、POST送信のテストはPostmanを使いましたが、Postmanの説明に関しては割愛します。
(2)GitHubのwebhook設定
GitHubで、webhookの設定をします。
GitHubのリポジトリページで、「設定」「Webhooks」を選び、「Add webhook」を押します。
Payload URLに先ほどのAPI GatewayのAPI エンドポイントを、
Content typeは、「application/json」を選択、
Secretは、ランダムな文字列を入力します。
あとは、デフォルトの設定で、「Add webhook」を押せば設定完了です。
設定後、このリポジトリに何か変更をプッシュすると、APIエンドポイントに自動でリクエストが飛びます。
飛んだリクエストの履歴は、該当webhookの詳細ページのタブ「Recent Deliveries」から確認でき、また、Redeliverのボタンを押すことで、繰り返しリクエストを送ることができます。以後、このRedeliverで、テストしていきます。
(3)AWS LambdaでのGitHub認証
次に、AWS Lambda側でリクエストを受け取った際に、ほんとうにGitHubからのwebhookリクエストかどうかを認証する仕組みを追加します。
関数「commentBacklogWithGithubCommit」の詳細ページで、
「設定」タブの「環境変数」から、「GITHUB_SECRET」という名前で登録します。
次にコードに認証する機能を実装します。
exports.handler = async (event) => {
// ヘッダ取得
const headers = event.headers;
// ボディ取得
const body = event.body;
// バリデーション実行、およびエラー時の処理
if (! isValid(body, headers)) {
// エラーの返却
const response = {
statusCode: 500,
body: 'Given signatue is invalid',
};
return response;
}
// 正常なレスポンスの返却
const response = {
statusCode: 200,
body: JSON.stringify('Hello from Lambda!'),
};
return response;
function isValid (body, headers) {
const crypto = require('crypto');
const hmac = crypto.createHmac('sha1', process.env.GITHUB_SECRET);
hmac.update(body, 'utf8');
const signature = 'sha1=' + hmac.digest('hex');
return signature === headers['x-hub-signature'];
}
};
これで、GitHubのwebhookからのリクエストのみ、受け付けるようになりました。
長くなってきたので、前半はここまで。
後半に続きます。
■GitHubにプッシュしたときに、Backlogにコメントを書き込む仕組みの作り方(AWS Lambda使用)【後編】
https://fourmix-blog.myshopify.com/blogs/aws/220118_2