GitHub Webhooks와 AWS Lambda를 함께 사용하여 배포와 Slack 알림을 동시에 수행

소개



풀릭이 develop 브랜치에 병합되었을 때, 스테이징 환경에의 배치와 Slack 통지를 동시에 실시하는 기능을 이하의 구성(GitHub Webhooks, Slack Incomming Webhooks, API Gateway, Lambda, OpsWorks)로 구현했습니다.

각 설정에 대해 정리했으므로, 참고로 해 주시면 다행입니다(OpsWorks의 설정에 대해서는 기재하지 않습니다).

*Webhook은 웹 서비스가 서비스 내에서 일어난 이벤트를 트리거로, 소정의 URL에 파라미터를 건네주고 호출해 주는 기능입니다.


시행사항



1. Slack의 Incoming Webhooks에서 알림 대상 채널을 등록하고 Webhook URL을 발행합니다.
2. Lambda의 함수 코드에 OpsWorks 자동 배포 및 Slack 알림 내용을 설명합니다.
3. API Gateway에서 엔드포인트를 게시하고 Lambda를 등록합니다.
4. GitHub Webhooks에서 Git 푸시 이벤트가 발생했을 때 엔드포인트에 API 게이트웨이를 지정합니다.

Slack Incoming Webhook 설정



Slack 응용 프로그램에서 Incomming Webhooks를 선택합니다.
게시할 채널을 선택하고 Incomming Webhook 통합 추가를 누릅니다.


Webhook URL을 삼가합니다. Lambda 함수 코드에서 알림 대상을 지정할 때 사용합니다.


이름과 아이콘을 사용자 정의하여 설정을 저장합니다.


Lambda 함수 만들기



AWS Lambda에서 함수 생성을 클릭합니다.
함수 이름을 입력하여 기존 역할(lambda_basic_execution)을 연결하여 함수를 만듭니다.


아래의 화면이 되므로, 함수 코드에 실행하고 싶은 내용을 기술합니다.


Slack 에의 송신 내용에 대한 기술은 이 사이트 를 참고로 했습니다.
여기에서 Slack Incomming Webhooks 설정에서 얻은 Webhook URL을 작성합니다.
 let options = {
    host: "hooks.slack.com",
    path: "[Webhook URLのパス]",
    port: 443,
    method: "POST",
    headers: {
      "Content-Type": "application/json",
    },
  };

또한 postData에 대해 사용자 정의했습니다.
        fields: [
          {
            title: "Webhook Repository",
            value: repo,
            short: true,
          },
          {
            title: "Repository Branch",
            value: branch,
            short: true,
          },
          {
            title: "OpsWorks Stack",
            value: stack,
            short: true,
          },
        ],
        footer: "Pushed by " + uname,

배포할 소스 코드의 저장소와 분기를 StackId, StackName, AppId와 연결합니다.
var deployMap = {
  '[リポジトリ名]': {
    "refs/heads/[ブランチ名]": {
      StackId: '[StackId]',
      StackName: '[StackName]',
      AppId: '[AppId]',
    }
  },
};


아래에서 배포 및 Slack 알림을 실행합니다.
이벤트는 Git 푸시시 GitHub Webhooks에서 가져온 데이터입니다.
var opsworks = new aws.OpsWorks();

exports.handler = async (event, context, callback) => {
                      .
                      .
                      .
    const data = await opsworks.createDeployment(params).promise();

    let message = "デプロイするよ〜〜〜!!!";
    let repo    = event.repository.name;
    let branch  = event.ref;
    let stack   = deployMap[event.repository.name].StackName;
    let uname   = event.pusher.name;
    let log_url = '[log出力先URL]' + params.StackId + '/deployments/' + data.DeploymentId;

    await postToSlack( message, repo, branch, stack, uname, log_url );

API Gateway 설정



API Gateway에서 GitHub에서 푸시 이벤트가 POST되는 엔드포인트(WEB API를 사용할 때 URI)를 만듭니다.

자원을 작성합니다.


POST 메서드를 만들고 Lambda 함수의 이름을 입력하고 저장합니다.


마지막으로 리소스 작업에서 API 배포를 실행하여 엔드포인트를 만듭니다.
스테이지에서 URL이 생성되었는지 확인할 수 있습니다.


GitHub Webhooks 설정



리포지토리의 Settings → Webhooks에서 Add webhook을 누릅니다.


Webhooks를 설정합니다.
Payload URL에는 이전 단계에서 만든 엔드포인트의 URL을 입력하고 Content type에는 application/json을 선택합니다.


결론



이상의 설정을 실시하는 것으로, 배포와 동시에 이런 느낌으로 Slack에 통지를 날릴 수가 있습니다.
Lambda와 API Gateway를 사용한 것은 처음이었기 때문에 공부가되었습니다.

좋은 웹페이지 즐겨찾기