Amplify Slack 알림 발송하기

Amplify 가이드북 | Amplify Slack Notification
이민석's avatar
Sep 05, 2024
Amplify Slack 알림 발송하기

Amplify 알림 발송하기

Amplify 내장 알림 기능을 통해서 Email, Slack 알림을 받을 수 있습니다.

Amplify 배포를 위한 사전 지식

Email & Slack 알림

Amplify는 내장 빌드 알림 기능을 지원합니다.
해당 기능으로 개인 이메일 혹은 Slack 이메일 앱으로 알림 메일을 받을 수 있습니다.
AWS Amplify 빌드 알림 슬랙 연동하기를 참고하여 알림 실습이 가능합니다.

배포 단계는 PENDING*, RUNNING*, SUCCEED*, FAILED, CANCELLED*로 구분되며 각 단계 마다 빌드 알림이 발송됩니다. 이 알림은 아래처럼 구성되어 있습니다.

"Build notification from the AWS Amplify Console for app: https://<BRANCH_NAME>>.<AMPLIFY_APP_ID>.amplifyapp.com/. Your build status is STARTED. Go to https://console.aws.amazon.com/amplify/apps/<AMPLIFY_APP_ID>/branches/<BRANCH_NAME>>?region=<REGION>> to view details on your build. "

--
If you wish to stop receiving notifications from this topic, please click or visit the link below to unsubscribe:
https://sns.<REGION>>.amazonaws.com/unsubscribe.html?SubscriptionArn=arn:aws:sns:<REGION>>:<ACCOUNT_ID>>:<SNS_TOPIC_NAME>:<__...__>&Endpoint=<EMAIL>

Please do not reply directly to this email. If you have any questions or comments regarding this email, please contact us at https://aws.amazon.com/support

하지만 알림 메일 어디에도 배포 단계에 대한 정보가 없습니다.
따라서 Amplify appId, buildBranch, accountId, region 등의 값을 기반으로
Amplify Console에서 배포 단계를 직접 확인해야 하는 한계가 있습니다.

Amplify 빌드 알림 시스템

Amplify 빌드 알림에서는 브랜치 전송 대상을 설정할 수 있습니다.

설정한 브런치의 종류에 맞춰 SNS Topic이 늘어나며
각 브런치에 있는 전송 대상의 종류에 맞춰 SNS Subscription이 늘어납니다.

SNS Subscription에서는 EMAIL 프로토콜을 기반으로 메일을 전송합니다.
이 경우 메일 본문을 수정하지 못하며 단순히 고정된 내용만 반환합니다. [Ref]

Amplify Custom 알림 발송하기

SNS Topic*에서 전달하는 본문은 항상 아래와 같은 형태를 유지합니다. — [Ref]

"Build notification from the AWS Amplify Console for app: https://<buildBranch>.<appId>.amplifyapp.com/. Your build status is STARTED. Go to https://console.aws.amazon.com/amplify/apps/<appId>/branches/<buildBranch>>?region=<region> to view details on your build. "

--
If you wish to stop receiving notifications from this topic, please click or visit the link below to unsubscribe:
https://sns.<region>>.amazonaws.com/unsubscribe.html?SubscriptionArn=arn:aws:sns:<region>>:<accountId>:<snsTopicName>:<__...__>&Endpoint=<email>

Please do not reply directly to this email. If you have any questions or comments regarding this email, please contact us at https://aws.amazon.com/support

따라서 RegExp로 appId, buildBranch, accountId, region을 추출할 수 있습니다.
 

AWS-CLIv2 PoC

Amplify Application, Branches, Jobs (deploy)와 관련된 정보를 AWS-CLIv2로 조회를 할 수 있습니다.

# Apps
aws amplify list-apps
aws amplify get-app --app-id <appId>

# Branches
aws amplify list-branches --app-id <appId>
aws amplify get-branch --app-id <appId> --branch-name <buildBranch>

# Jobs (deploy)
aws amplify list-jobs --app-id <appId> --brnach-name <buildBranch>
aws amplify get-job --app-id <appId> --branch-name <buildBranch> --job-id <jobId>

AWS-SDKv3 for JavaScript

AWS SDKv3 for JavaScript를 사용하여 App, Branch, Job 조회를 할 수 있습니다.
아래 명령어를 통해서 @aws-sdk/client-amplify를 설치할 수 있습니다.

yarn add @aws-sdk/client-amplify

  • Amplify Application 정보 조회

    import { AmplifyClient, GetAppCommand } from "@aws-sdk/client-amplify";
    
    const amplifyClient = new AmplifyClient();
    
    const getAppCommand = new GetAppCommand({ appId, brnachName });
    const getAppResponse = await amplifyClient.send(getAppCommand);
  • Amplify Jobs 정보 조회

    import { AmplifyClient, ListJobsCommand } from "@aws-sdk/client-amplify";
    
    const amplifyClient = new AmplifyClient();
    
    const listAppCommand = new ListJobsCommand({ appId, branchName });
    const listJobResponse = await amplify.send(listAppCommand);

다만 jobId가 없기 때문에 최근 전체 jobs를 집계해서 amplifyName, deployList 등을 구할 수 있습니다.

import { AmplifyClient, GetAppCommand } from "@aws-sdk/client-amplify";

const amplifyClient = new AmplifyClient();
const listJobCommand = new ListJobsCommand({ appId, branchName  });
const getAppCommand = new GetAppCommand({ appId });

const listJobResponse = await amplifyClient.send(listJobCommand);
const getAppResponse = await amplifyClient.send(getAppCommand);

const pendingDeployList = listJobResponse.jobSummaries.filter(job => job.status === "PENDING");
const runningDeploy = listJobResponse.jobSummaries.find(job => job.status === "RUNNING");
const lastDeploy = listJobResponse.jobSummaries.find(job => job.status === "SUCCEED"
                                                            || job.status === "FAILED"
                                                            || job.status === "CANCELLED");

// Outputs
const amplifyName = getAppResponse.app.name;
const deployList = [
    ...pendingDeployList,
    ...(runningDeploy ? [runningDeploy] : []),
    ...(lastDeploy ? [lastDeploy] : [])
];

@slack/web-api

추출한 데이터를 @slack/web-api로 지정된 슬랙 채널로 보내고자 합니다.

yarn add @slack/web-api

import { WebClient } from '@slack/web-api';

const webClient = new WebClient("xoxb-*************-*************...');

await webClient.chat.postMessage({
  channel: 'channelName',
  text: 'notificationMessage',
  attachments: 'attachments'
});
Share article
RSSPowered by inblog