CodeBuild의 Slack 알림을 Terraform에서 빨리 설정합니다.
거기서 좋은 통지를 하려고 해도, 바로 이것이라고 하는 Terraform Module이 없었기 때문에 module를 만들어 보았습니다.
en30/codebuild-to-slack/aws | Terraform Module Registry
이를 통해 CodeBuild에서 다음 이벤트를 Slack에 쉽게 알릴 수 있습니다.
IN_PROGRESS
: 시작 SUCCEEDED
: 성공 FAILED
: 실패 FAULT
: AWS측으로 인한 실패? TIMED_OUT
: 타임 아웃 STOPPED
: 중지 실제 알림 예
사용법
main.tf
variable "encrypted_slack_webhook_url" {}
resource "aws_kms_key" "slack_webhook_url" {
description = "Key for Slack Webhook URL"
}
module "codebuild_notification" {
source = "en30/codebuild-to-slack/aws"
version = "0.0.1"
encrypted_slack_webhook_url = "${var.encrypted_slack_webhook_url}"
slack_channel = "#app"
kms_key_arn = "${aws_kms_key.slack_webhook_url.arn}"
}
encrypted_slack_webhook_url
는 다음과 같이 AWS CLI를 사용하여 얻을 수 있습니다.$ aws kms encrypt --key-id $AWS_KMS_KEY_ID --plaintext $SLACK_WEBHOOK_URL --query CiphertextBlob --output text
$AWS_KMS_KEY_ID
는 module에 kms_key_arn
로 배달해 key id, $SLACK_WEBHOOK_URL
는 Slack의 Incoming Webhook URL입니다.위의 예와 같이 키도 Terraform으로 만들려고하면
aws_kms_key
의 작성 ( terraofmr apply
①) terraofrm apply
②) 그리고
terraform apply
로 한발로 갈 수 없는 것이 기분 나쁜 곳입니다만, 좋으면 사용해 보세요!내용의 간략한 설명
하고 있는 일로
입니다. Lambda에 Ruby Runtime도 들어간 것이며, 나는 Ruby를 좋아해서 Lambda는 Ruby로 썼습니다.
그렇게 재미있는 곳이 있는 것은 아니지만, Lambda의 배치를 간단하게 하기 위해서, 표준 라이브러리, Lambda의 환경에 원래 들어 있는
aws-sdk
뿐으로 끝내도록(듯이) 하고 있습니다.notify_slack.rb
require "uri"
require "net/http"
require "json"
require "base64"
require "aws-sdk"
COLORS = {
"SUCCEEDED" => "good",
"FAILED" => "danger",
"FAULT" => "danger",
"TIMED_OUT" => "danger",
"STOPPED" => "warning",
}.freeze
def decrypt(encrypted_url)
client = Aws::KMS::Client.new
client.decrypt(ciphertext_blob: Base64.decode64(encrypted_url)).plaintext
end
def build_url(region, project, slug)
region, project, slug = [region, project, slug].map(&URI.method(:encode_www_form_component))
"https://#{region}.console.aws.amazon.com/codesuite/codebuild/projects/#{project}/build/#{slug}/log"
end
def format(event) # rubocop:disable Metrics/MethodLength
project = event["detail"]["project-name"]
status = event["detail"]["build-status"]
slug = event["detail"]["build-id"].split("/").last
{
attachments: [
{
color: COLORS[status],
title: slug,
title_link: build_url(event["region"], project, slug),
fallback: status,
fields: [
{
title: "Status",
value: status,
short: true,
},
{
title: "Initiator",
value: event["detail"]["additional-information"]["initiator"],
short: true,
},
],
},
],
}
end
def notify_slack(slack_url, payload)
Net::HTTP.post_form(URI.parse(slack_url), payload: JSON.dump(payload))
end
def lambda_handler(event:, context:)
slack_url = decrypt(ENV["ENCRYPTED_SLACK_WEBHOOK_URL"])
payload = {
channel: ENV["SLACK_CHANNEL"],
username: ENV["SLACK_USERNAME"],
icon_emoji: ENV["SLACK_EMOJI"],
}.merge(format(event))
notify_slack(slack_url, payload)
end
이상입니다.
AWS도 Terraform도 사용하기 시작해 날이 얕기 때문에, 뭔가 조금이라도 신경이 쓰이는 부분이 있으면 부담없이 코멘트나 Issue 작성을 부탁합니다.
참고
Reference
이 문제에 관하여(CodeBuild의 Slack 알림을 Terraform에서 빨리 설정합니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/en30/items/c6e40e3294c3dc6e0bef텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)