사설 인증서 만료 알림을 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로 대체해야 합니다)
# 메시지 내용
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을 통해 받는 알람