- ブリッジ兼ディレクター
- フロントエンジニアリーダー
- Webディレクター
- Other occupations (2)
- Development
- Business
こんにちは、システムエンジニアの朝日です。
今回の開発日誌では、AWS( API Gateway, Lamda ) を用いた、GitHub と Backlog の連携の仕方について解説をします!
弊社ではタスク管理のため、Githubのissues/Backlogのチケットを採用しています。しかし、2つの媒体でタスクを作成/更新するのは手間がかかるため、Backlogのチケット作成/更新は自動化し業務の効率化を図ることにしました。
以下が解説の内容になります。
- 処理フロー
- 処理フロー図
- GitHub Webhook とは
- API Gateway とは
- Lamda とは
- Backlog API とは
- 具体的な実装
- 終わりに
処理フロー
① githubでissueを作成/更新する。
② Github webhookで①を検知し、API GatewayのURLにリクエストを送信する。
③ API Gatewayでのリクエスト受信をトリガーに、Lamda関数を起動する。
④ Lamda関数からBacklog APIを叩き、チケットを作成/更新する。
処理フロー図
GitHub Webhook とは
Github Webhookは、GitHub上でリポジトリに対する特定のイベントが発生した際に、指定されたURLにHTTPリクエストを送信するための仕組みです。
特徴
1.イベントトリガーによる柔軟性
GitHub上で発生する、プルリクエストマージ/Issue作成/コードプッシュ等のイベントに対して、Webhookを作成してトリガーを設定することができます。これにより、開発者はGitHub上で発生する様々なアクションを監視し、自動化された処理をトリガーすることができます。
2.カスタムペイロードの送信
HTTP POSTリクエストを送信するだけでなく、カスタムペイロードを送信することもできます。カスタムペイロードを使用することで、開発者は自分たちのシステムに必要な情報を送信し、より効率的なワークフローを構築することができます。また、JSONやXMLなど、複数の形式でペイロードを送信することができるため、開発者は自分たちの要件に応じてペイロードを構築することができます。
API Gateway とは
API Gatewayは、クラウド上で簡単にAPIを作成、公開、管理するためのAWSサービスです。
特徴
1.APIの管理
クラウドネイティブアプリケーションにおいて、APIのエントリーポイントとして機能します。また、APIエンドポイント/HTTPメソッド/リクエスト/レスポンスパラメーター/API認証/監視などの設定を簡単に行えるため、ユーザーコストを軽減できます。
2. スケーラビリティと可用性
トラフィックを制御し、必要に応じて自動的にスケーリングすることができます。また、バックエンドのマイクロサービスやAWS Lamda関数との間で負荷を分散し、高可用性を実現します。CDNやキャッシュを使用することで、APIのレスポンスタイムを改善することも可能です。
3.セキュリティ
AWS WAFなどのセキュリティサービスとの統合をサポートし、APIのトラフィックを監視、不正なトラフィックをブロックします。また、APIの認証と認可をサポートし、OAuth、IAM、Cognitoなどの認証プロトコルをサポートします。更に、リクエスト/レスポンスのトランスフォーメーションや暗号化などのセキュリティ機能を提供します。
Lamda とは
Lamdaは、クラウド上でスケーラブルなコード実行環境を提供するAWSのサービスで、サーバーの管理やプロビジョニングなしでコードを実行できます。
特徴
1.サーバレス
Lamdaは、サーバーの管理やプロビジョニングを必要とせず、ユーザーが必要に応じてコードを実行するためのイベント駆動型のサーバーレスプラットフォームです。また、自動的にスケールし、トラフィックの増加に応じて必要なリソースを自動的に割り当てるため、ユーザーはコスト効率的に高スケーラビリティなアプリケーションを構築できます。
2.多言語サポート
AWS Lamdaは、複数のプログラミング言語(C、Java、Python、Node.js、Ruby、Goなど)をサポートしています。これにより、開発者は好きな言語を採用し(※今回はNode.jsを採用しました。)、Lamda関数を作成、AWSサービスとの統合を実現することができます。また、Lamda関数は、AWS SDKや外部ライブラリと統合することもできます。
3.イベントドリブン
AWS Lamdaは、S3、DynamoDB、Kinesis、SNS、SQS、API Gatewayなど、多くのAWSサービスと統合されています。これらのサービスからのトリガーにより、Lamdaは自動的に起動され、トリガーされたイベントを処理します。Lamda関数は、データの加工、ファイルの変換、データの集計、データの検証、監視の自動化など、多くの目的に使用できるため、開発者は、AWSサービスとのシームレスな統合を実現し、効率的にイベント駆動型のアプリケーションを構築できます。
Backlog API とは
Backlog APIは、プロジェクト管理ツール「Backlog」のためのAPIで、プログラマブルなインターフェースを提供することで、他のシステムとの連携やカスタマイズを可能にします。
Backlog APIを利用することで、プログラムからプロジェクト情報の取得/タスク登録/コメント投稿等を実行できます。RESTful APIを採用しており、データをJSON形式でやり取りします。
具体的な実装
下記の順に記載しています。
- Lamda
- API Gateway
- github webhook の設定
01 : Lamda
AWS Lamdaのコンソールを開いて、「関数の作成」をクリックします。
今回はNode.jsを採用。上記の様に設定し、「関数の作成」をクリックします。
設定タブから環境変数を追加。 ※API_KEYはBacklogから取得して下さい。
コードタブから index.jsを開き、編集していきます。
index.js
const axios = require('axios');
require('dotenv').config();
const main_url =https://${process.env.BACKLOG_DOMAIN}/api/v2
const project_id = process.env.PROJECT_ID; // プロジェクトID(システムタスク進捗管理)
const api_key = process.env.API_KEY;
const continuableUserIds = new Set([
111, // サトシ
222, // タケシ
333, // カスミ
]);
exports.handler = async (event) => {
let data = JSON.parse(event.body);
// 運用ルールに則らない場合は処理を終了
if (!data.issue.body.includes('(SYSTEM:') ||
!continuableUserIds.has(data.sender.id) ||
data.issue.assignee ||
(data.action !== 'opened' && data.action !== 'edited')) {
return;
}
// Backlogに追加するチケットの中身を定義
const requests = {
summary: data.issue.title,
description:${data.issue.body}\n${data.issue.html_url}
projectId: project_id,
priorityId: 3, // 優先度(中)
}
// GitHubでのアクションがissueの編集の場合は、Backlogから対象のチケットを探索/更新
if (data.action === 'edited') {
const issues = await getIssues();
const issue = issues.find(issue => issue.description.includes(data.issue.html_url));
if (issue) {
await updateIssue(issue.id, requests);
}
// 新規作成の場合は、issueの説明欄の情報からチケットの種別を決定し、チケットを作成
} else {
const issueTypes = await getParsedIssueTypes();
const regex = /(SYSTEM:([^)]+))/;
const issueTypeName = data.issue.body.match(regex)?.[1];
const matchedIssueType = issueTypes.find(issueType => issueType.name === issueTypeName);
if (matchedIssueType) {
requests.issueTypeId = matchedIssueType.id;
}
await postIssue(requests);
}
// 種別一覧の取得
async function getParsedIssueTypes() {
const response = await axios.get(main_url + '/projects/' + project_id + '/issueTypes?apiKey=' + api_key);
const issueTypes = response.data;
return issueTypes;
}
// 新規チケットを作成
async function postIssue(requests) {
const response = await axios.post(main_url + '/issues?apiKey=' + api_key, data=requests);
const issue = response.data;
return issue;
}
// チケット一覧の取得
async function getIssues() {
const response = await axios.get(main_url + '/issues?apiKey=' + api_key);
const issues = response.data;
return issues;
}
// チケット情報の更新
async function updateIssue(issueId, requests) {
const response = await axios.patch(main_url + '/issues/' + issueId + '?apiKey=' + api_key, data=requests);
const issue = response.data;
return issue;
}
};
02 : API Gateway
作成した関数を起動するためのトリガーを設定していきます。
「トリガーを追加」→ 「ソースの選択」→ API Gatewayを選択します。
下記の様に設定をし、「追加」をクリックします。
追加に成功すると、API GatewayとLamda関数が紐付きます。
API Gatewayのコンソールから、「testFunction-API」の詳細ページを開き、左メニューの「Routes」、真ん中の「ANY」を押した後、「編集」を押します。
開いた設定画面でANYをPOSTに変更し、「保存」をクリックします。
再度、Lamdaのコンソールに戻ります。APIエンドポイントをコピーし、GitHub Webhookに設定していきます。
Payload URLに貼り付けます。
今回はissuesの監視だけ行います。
設定が完了したら、「update」をクリックします。
以上の工程で、GitHubでのIssue作成/更新が、Backlogとシンクロしました。
終わりに
現代のアプリケーションは、クラウド環境で実行されることが多くなっており、その中でもサーバーレスアーキテクチャーが注目を集めています。サーバーレスアーキテクチャーを採用することで、インフラストラクチャーやサーバーの管理が不要になり、コストを削減することができます。API GatewayとLamdaは、このサーバーレスアーキテクチャーを実現するための技術であり、多くの企業が採用しています。
また、API GatewayとLamdaを使用することで、開発者はアプリケーションの開発速度を向上させることができます。API Gatewayがリクエストをルーティングすることで、開発者が複雑なバックエンドインフラストラクチャーを構築する必要がなくなるためです。また、Lamdaは、必要に応じてスケールアップ/ダウンするため、コスト効率的なアプリケーションを構築することができます。
さらに、セキュリティやコンプライアンスの要件が増加する中、API GatewayとLamdaは、これらの要件を満たすための強力なインフラストラクチャーとなリマす。API Gatewayは、認証やアクセス制御を設定するための機能を提供しており、Lamdaは、様々なセキュリティ対策を実装することができます。
当記事の投稿者はインフラがメインの担当ではないですが、サクッと実装することができてしまいました!クラウドインフラは一見敷居が高そうですがオンプレに比べるととても簡単です。是非一度体験してみて下さい★★