타사 서비스의 클러스터 업그레이드 알림 구성

사용자 또는 Google Kubernetes Engine(GKE)이 클러스터 업그레이드를 시작하면 제3자 메시지 서비스를 통해 이러한 변경사항 관련 알림을 수신할 수 있습니다.

Slack 같은 서비스는 앱의 메시지를 Slack에 게시하는 간단한 방법인 수신 웹훅을 제공합니다. Cloud Functions는 경량형 Compute Engine 솔루션으로, 서버 또는 런타임 환경을 관리할 필요 없이 Google Cloud 이벤트에 응답하는 것이 유일한 목적인 독립 실행형 함수를 만드는 데 사용됩니다. 알림이 전송되면 트리거Pub/Sub 메시지 전송 등의 작업을 실행하여 응답합니다.

IFTTT와 같은 애플리케이션 간 메시징 기능으로 구축된 많은 타사 서비스가 있습니다. 이 가이드를 이러한 서비스와 연결하는 템플릿으로 사용할 수 있습니다.

이 가이드에서는 Cloud Functions와 Pub/Sub를 사용하여 Slack을 통해 GKE 클러스터 업그레이드에 대한 알림을 전송하는 방법을 보여줍니다.

목표

  • GKE에서 오는 외부 알림을 수신하도록 Slack 애플리케이션을 배포합니다.
  • Slack으로 Pub/Sub 알림을 보내는 Cloud 함수를 작성합니다.

비용

이 가이드에서는 비용이 청구될 수 있는 다음과 같은 Google Cloud 구성요소를 사용합니다.

  • Cloud Functions
  • Pub/Sub
  • GKE

가격 계산기를 사용하여 예상 사용량을 기준으로 예상 비용을 산출합니다.

시작하기 전에

  1. Google Cloud 계정에 로그인합니다. Google Cloud를 처음 사용하는 경우 계정을 만들고 Google 제품의 실제 성능을 평가해 보세요. 신규 고객에게는 워크로드를 실행, 테스트, 배포하는 데 사용할 수 있는 $300의 무료 크레딧이 제공됩니다.
  2. Google Cloud Console의 프로젝트 선택기 페이지에서 Google Cloud 프로젝트를 선택하거나 만듭니다.

    프로젝트 선택기로 이동

  3. Cloud 프로젝트에 결제가 사용 설정되어 있는지 확인합니다. 프로젝트에 결제가 사용 설정되어 있는지 확인하는 방법을 알아보세요.

  4. Cloud Functions and Pub/Sub API를 사용 설정합니다.

    API 사용 설정

  5. Cloud SDK 설치 및 초기화
  6. gcloud 구성요소를 업데이트 및 설치합니다.
    gcloud components update &&
    gcloud components install alpha beta
  7. GKE 업그레이드 알림 사용 설정

Slack 알림

다음 섹션에서는 Slack 알림을 설정하는 방법을 안내합니다.

Slack 애플리케이션 준비

  1. 컴퓨터용 Slack을 다운로드합니다. 또한 이메일로 등록하거나 작업공간 관리자가 보낸 초대를 사용하여 Slack 작업공간에 합류해야 합니다.

  2. 작업공간 이름과 Slack 계정 사용자 인증 정보를 사용하여 Slack에 로그인합니다.

  3. 새 Slack 앱을 만듭니다.

    1. 앱의 이름과 Slack 작업공간을 선택합니다. Create App(앱 만들기)을 클릭합니다.
    2. Features(기능)에서 Incoming Webhooks(수신 웹훅)를 클릭합니다.
    3. Activate Incoming Webhooks(수신 웹훅 활성화)를 사용 설정합니다.
    4. Add New Webhook to Workspace(새로운 웹훅을 작업공간에 추가)를 클릭합니다. 승인 페이지가 열립니다.
    5. 드롭다운 메뉴에서 알림을 보낼 채널을 선택합니다.
    6. 설치를 클릭합니다.
    7. Slack 애플리케이션을 위한 웹훅이 생성되었습니다. 웹훅 URL을 복사하고 나중에 사용할 수 있도록 저장하세요.

Cloud 함수 작성

gke_slack이라는 새 디렉터리를 만든 후 이 위치로 디렉터리를 변경합니다.

mkdir ~/gke_slack
cd ~/gke_slack

그런 다음 gke_slack 디렉터리에 index.jspackage.json 파일을 만듭니다.

index.js

const { IncomingWebhook } = require('@slack/webhook');
const url = process.env.SLACK_WEBHOOK_URL;

const webhook = new IncomingWebhook(url);

// Optionally filter what notification types to forward to Slack.
// If empty, all types will be allowed.
const allowedTypeURLs = [];

// slackNotifier is the main function called by Cloud Functions
module.exports.slackNotifier = (pubSubEvent, context) => {
  const data = decode(pubSubEvent.data);

  // Send message to Slack.
  if (isAllowedType(pubSubEvent.attributes)) {
    const message = createSlackMessage(data, pubSubEvent.attributes);
    webhook.send(message);
  }
};

// decode decodes a pubsub event message from base64.
const decode = (data) => {
  return Buffer.from(data, 'base64').toString();
}

// isAllowedType can be used to filter out messages that don't match the
// allowed type URLs. If allowedTypeURLs is empty, it allows all types.
const isAllowedType = (attributes) => {
  if (allowedTypeURLs.length == 0) {
    return true;
  }
  for (var x in allowedTypeURLs) {
    if (attributes['type_url'] == allowedTypeURLs[x]) {
      return true;
    }
  }
  return false;
}

// createSlackMessage creates a message from a data object.
const createSlackMessage = (data, attributes) => {
  // Write the message data and attributes.
  text = `${data}`
  for (var key in attributes) {
    if (attributes.hasOwnProperty(key)) {
      text = text + `\n\t\`${key}: ${attributes[key]}\``
    }
  }
  const message = {
    text: text,
    mrkdwn: true,
  };
  return message;
}

SLACK_WEBHOOK_URL은 Slack 애플리케이션에서 생성된 웹훅 URL을 지정하는 Cloud Functions 환경 변수입니다. 이 환경 변수는 함수를 배포할 때 정의됩니다.

이 프로그램은 Slack의 웹훅을 사용하여 Cloud 함수에서 메시지를 수신합니다. 이벤트가 발생하면 메시지가 웹훅으로 전송된 다음 Slack으로 릴레이됩니다.

이 예시에서는 createSlackMessage 함수를 단순화하여 설명합니다. 텍스트 색상과 이미지를 비롯하여 더 많은 내용을 포함하도록 메시지를 확장할 수 있습니다.

isAllowedType 함수는 유형 URL에 따라 알림에 대한 기본 필터링을 사용 설정하기 위해 제공됩니다. allowedTypeURLs에서 허용할 유형 URL을 지정할 수 있습니다.

package.json

{
  "name": "gke-slack",
  "version": "0.0.1",
  "description": "Slack integration for GKE, using Cloud Functions",
  "main": "index.js",
  "dependencies": {
    "@slack/webhook": "5.0.1"
  }
}

package.json에서는 다음 주제에 대해 설명합니다.

  • 프로그램의 이름, 버전, 설명
  • 기본 런타임 파일
  • 종속 항목

이 파일은 믿기지 않을 정도로 간단합니다. 종속 항목, 요구사항, 기타 정보를 필요에 따라 추가할 수 있습니다.

이제 gke_slack 디렉터리에 index.jspackage.json이 있습니다.

Cloud 함수 배포

Pub/Sub 트리거로 slackNotifier 함수를 배포하려면 gke_slack 디렉터리에서 다음 명령어를 실행합니다.

gcloud functions deploy slackNotifier --trigger-topic topic-name \
  --runtime nodejs10 \
  --set-env-vars "SLACK_WEBHOOK_URL=https://hooks.slack.com/…"

각 항목의 의미는 다음과 같습니다.

  • SLACK_WEBHOOK_URL은 Slack 애플리케이션에서 생성된 웹훅 URL을 정의합니다. URL 형식은 https://hooks.slack.com/services/T…/B…/…입니다.
  • topic-nameGKE 업그레이드 알림을 사용 설정할 때 지정한 주제의 이름입니다.

다음과 같은 출력이 표시되어야 합니다.

Deploying function…
availableMemoryMb: 256
entryPoint: slackNotifier
environmentVariables:
  SLACK_WEBHOOK_URL: https://hooks.slack.com/services/…
eventTrigger:
  eventType: google.pubsub.topic.publish
  failurePolicy: {}
  resource: projects/[PROJECT-ID]/topics/[TOPIC-NAME]
  service: pubsub.googleapis.com
labels:
  deployment-tool: cli-gcloud
name: projects/[PROJECT-ID]/locations/us-central1/functions/slackNotifier
runtime: nodejs10
serviceAccountEmail: [PROJECT-ID]@appspot.gserviceaccount.com
sourceUploadUrl: https://storage.googleapis.com/…
status: ACTIVE
timeout: 60s
updateTime: 'YYYY-MM-DDThh:mm:ssZ'
versionId: '1'

Cloud 함수의 배포를 완료한 후 GKE에서 업그레이드 알림을 보내면 Slack 알림이 수신됩니다.

삭제

이 가이드에서 사용된 리소스 비용이 Google Cloud 계정에 청구되지 않도록 하려면 리소스가 포함된 프로젝트를 삭제하거나 프로젝트를 유지하고 개별 리소스를 삭제하세요.

프로젝트 삭제

비용이 청구되지 않도록 하는 가장 쉬운 방법은 가이드에서 만든 프로젝트를 삭제하는 것입니다.

프로젝트를 삭제하려면 다음 안내를 따르세요.

  1. Cloud Console에서 리소스 관리 페이지로 이동합니다.

    리소스 관리로 이동

  2. 프로젝트 목록에서 삭제할 프로젝트를 선택하고 삭제를 클릭합니다.
  3. 대화상자에서 프로젝트 ID를 입력한 후 종료를 클릭하여 프로젝트를 삭제합니다.

Cloud 함수 삭제

이 가이드에서 배포한 Cloud 함수를 삭제합니다.

gcloud functions delete slackNotifier

Google Cloud Console에서 Cloud Functions를 삭제할 수도 있습니다.

다음 단계