본문 바로가기

클라우드/GCP 자원 테라폼으로 관리해보기

(18) GCP 사설 SSL 인증서 만료 확인 및 자동 교체 설정 (Slack)

반응형

사설 인증서 만료 알림을 Slack으로 한달 전에 알림을 받아보는 방식으로 구현해보았다.

 

Slack 설정 

Slack 가입 방법에 대해서는 따로 작성하지 않고 채널 추가 후 webhook 하는 방법만 작성하도록 한다.

 

채널 추가를 통해 ssl-webhook 채널 추가

 

Webhook 설정 방법

1. api.slack.com 접속 후 Your apps 클릭

 

2. Create New App 클릭 후 From scratch 버튼 클릭 

3. App Name과 내 workspace 선택 후 Create App 클릭

 

4. 생성된 App (ssl-webhook) 클릭 후 Features - Incoming Webhooks 클릭 후 On으로 설정 후 하단에 생성된 Webhook URL 부분 확인 

 

 

Cloud function 설정

인증서 만료 한달 전 Slack으로 알람을 보내는 설정으로 python을 통해 구성하였다.

 

1. python 파일 정보

slack_webhook_url 부분에는 위에서 생성된 Webhook URL을 넣으면 된다.

import json
import requests

def send_slack_notification(request):
    # Slack 웹훅 URL (이 부분은 실제 URL로 대체해야 합니다)
    slack_webhook_url = "https://hooks.slack.com/services/"
   
    # 메시지 내용
    message = {
        "text": "인증서 만료 한달 전입니다."
    }
   
    # POST 요청을 통해 Slack에 메시지 전송
    response = requests.post(
        slack_webhook_url,
        data=json.dumps(message),
        headers={'Content-Type': 'application/json'}
    )
   
    # 요청 결과 출력 (디버깅용)
    if response.status_code != 200:
        raise ValueError(
            f"Request to Slack returned an error {response.status_code}, the response is:\n{response.text}"
        )
   
    return 'Notification sent successfully', 200

 

 

2. module로 cloud function 생성

cloud funtion 모듈 및 생성 정보는 해당 페이지에 기술되어 있어 자세한 설명은 하지 않는다. https://fanic2022.tistory.com/49

# 인증서 만료 function
module "ssl_function" {
  source = "./modules/cloud_function"

  # 소스 코드 저장  zip 파일로 저장
  object_name = "test/ssl.zip"
  bucket_name           = google_storage_bucket.function_bucket.name
  gcs_source ="./python/ssl/ssl.zip"


  function_version = 1
  function_name          = "slack-ssl-function"
  description            = "slack ssl notify"
  runtime                = "python39"
  entry_point            = "send_slack_notification"
  timeout                = 60
  region                 = "asia-northeast3"
  project                = "pjt-an3-dev-vm-2"
 
  trigger_http           = true
  available_memory_mb    = 256
  environment_variables  = {
    EXAMPLE_KEY = "example-value"
  }
  service_account_email  = module.svcacc_test_account_2.service_account_email
}

 

3. GCP 콘솔 내 생성 된 자원 정보

 

Cloud Scheduler 설정

 

스케줄러를 통해 내가 원하는 시간에 호출 가능하도록 구성하였다.

uri 부분에는 cloud funtion 에서 생성된 uri 정보를 넣어주면 된다.

resource "google_cloud_scheduler_job" "ssl_expiry_alert_job" {
  name        = "ssl-expiry-alert-job"
  description = "A job to check SSL certificate expiry dates and notify."
  schedule = "0 0 1 9 *"  
  project = "pjt-an3-dev-vm-2"

  http_target {
    http_method = "POST"
    headers = {
      "Content-Type" = "application/json",
      "User-Agent"  = "Google-Cloud-Scheduler",
      "Accept"  = "application/json"
    }
    oidc_token {
      service_account_email = "svcacc-test-2@pjt-an3-dev-vm-2.iam.gserviceaccount.com"
    }
  }

  time_zone =  "Asia/Seoul"
}

 

 

Shell script 구성

이 설정은 인증서 변경 후에 인증서 만료일 한달 전에 Cloud Scheduler가 동작할 수 있도록 설정하는 스크립트 파일이다.

인증서 이름만 변경 수동으로 변경 후 스크립트를 실행하면 등록된 인증서 만료일에서 한달 후를 계산 후 스케줄러에 넣고 스케줄러 리소스를 업데이트 해주게 되는 구조로 만들어 보았다.

#!/bin/bash

# 인증서 이름
CERT_NAME="hrc0303-ssl-cert"

# 현재 연도를 얻습니다.
CURRENT_YEAR=$(date +%Y)

# 인증서의 EXPIRE_TIME 값을 추출하고 MM-DD 형식으로 변환
EXPIRE_MMDD=$(gcloud compute ssl-certificates list --format=json | jq -r ".[] | select(.name==\"$CERT_NAME\") | .expireTime | .[5:10]")

# MM-DD 형식을 이용해 현재 연도와 함께 날짜를 생성합니다.
EXPIRE_DATE="${CURRENT_YEAR}-${EXPIRE_MMDD}"

# 날짜를 한 달 전으로 변경합니다.
ONE_MONTH_AGO=$(date -d "$EXPIRE_DATE -1 month" +"%m-%d")

# 한 달 전 날짜를 기반으로 월과 일 추출
# MONTH=$(echo $ONE_MONTH_AGO | cut -d '-' -f 1)
# DAY=$(echo $ONE_MONTH_AGO | cut -d '-' -f 2)

MONTH=$(echo $ONE_MONTH_AGO | cut -d '-' -f 1 | sed 's/^0//')  # '0'을 제거하여 9로 출력
DAY=$(echo $ONE_MONTH_AGO | cut -d '-' -f 2 | sed 's/^0//')    # '0'을 제거하여 1로 출력

# Cloud Scheduler의 스케줄 형식: "분 시 일 월 요일"
SCHEDULE="0 0 $DAY $MONTH *"

echo "Scheduling Cloud Scheduler job with the following schedule: $SCHEDULE"



original_file="../scheduler.tf"

sed -i -E "s/schedule\s*=\s*\"[^\"]*\"/schedule = \"$SCHEDULE\"/" "$original_file"


LS_OUTPUT=$(cd .. && terraform init && terraform  apply -auto-approve  -target google_cloud_scheduler_job.ssl_expiry_alert_job)
#LS_OUTPUT=$(cd .. && terraform init && terraform  apply  -target module.gke_cluster)
echo $LS_OUTPUT

echo "Cloud Scheduler job modify successfully."

 

 

 

테스트 호출 시 slack에 webhook을 통해 받는 알람

 

반응형