
HCP Webhook Service で HCP Packer のイベントを Slack に通知してみた。
はじめに
皆様こんにちは、あかいけです。
突然ですが、 HCP Webhook Service をご存知でしょうか?
私はHCPに入門してから知ったのですが、
これは HCP上のリソースのライフサイクルイベント(作成、削除、更新…etc)を外部システムに通知するWebhook を提供しています。
今回は HCP 活用の第一歩として、
HCP Webhook Service を利用して、HCP Packer のイベントを Slack に送信してみました。
なお現時点では HCP Webhook Service は以下サービスに対応しています。
- HCP Packer
- HCP Vault Secrets
構成
Lambda が Webhook の受け口となり、そこでメッセージを加工して Slack Webhook を利用して Slack に送信しています。
HCP Terraform の Workspace notifications では直接 Slack に送信できる機能がありますが、
HCP Webhook Service では Webhook 作成時に検証プロセスがあり、レスポンスとして ステータスコード 200-299 を返す必要があります。
そのため、今回はLambdaを利用して検証の処理とメッセージの加工を行っています。
事前準備
- HCP アカウント、プロジェクト 作成
- Slack Webhook URL (Incoming Webhooks) 作成
- Terraform、Packer、HCP CLI の実行環境を準備
作成方法
1.サービスプリンシパル作成
以下ドキュメントの手順を参考に、Packer 実行時に利用するサービスプリンシパルを作成してください。
プリンシパルのRoleは Contributor
を指定します。
その後プリンシパルのキーを作成して、
Client ID
とClient Secret
を取得してください。
2.Terraform 実行
次に Terraform で Lambda や HCP リソースを作成します。
リポジトリを clone します。
git clone https://github.com/Lamaglama39/hcp-packer-notify;
cd hcp-packer-notify;
クレデンシャル情報を設定するため、terraform.tfvars
を作成します。
slack_webhook_url
は取得した URL、
slack_channel
は送信先のチャネル名、
project_id
は HCP Packer を作成するHCPのプロジェクトIDに置き換えてください。
cat <<EOF >> ./terraform/terraform.tfvars
slack_webhook_url = "https://hooks.slack.com/services/XXX/XXX/XXX" # 取得したSlack Webhook URL
slack_channel = "#channel-name" # 通知先Slack Channel
app_name = "hcp-packer-notify" # アプリ名
aws_region = "ap-northeast-1" # 作成リージョン
project_id = "XXXX-XXXX-XXXX-XXXX-XXXX" # HCP プロジェクトID
EOF
ローカル環境のTerraformでHCP Packerを作成するため、
コマンドライン上でHCPへログインします。
hcp auth login;
terraform apply
でリソースを作成します。
cd ./terraform;
terraform init;
terraform apply;
3.Packer 実行
Terraform リソースの作成が完了したら、Packer でイメージを作成します。
まず以下コマンドで variables.auto.pkrvars.hcl
を作成します。
値は実際利用するものに修正してください。
cd ../;
cat <<EOF >> ./packer/variables.auto.pkrvars.hcl
region = "ap-northeast-1" # 作成リージョン
instance_type = "t3.micro" # インスタンスタイプ
bucket_name = "hcp-packer-notify-bucket" # HCP Packer バケット名
version = "1.0.0" # AMI名に付与するバージョン
EOF
次に取得したHCPのサービスプリンシパルを環境変数に追加します。
値は実際利用するものに修正してください。
export HCP_CLIENT_ID="XXXXXXXXXXXXX";
export HCP_CLIENT_SECRET="XXXXXXXXXXXXX";
packerのビルドを実行します。
cd ./packer;
packer build .;
HCP Packer 側でイベントが発生する度、以下のようなメッセージがSlackに通知されます。
ポイント
いくつかポイントとなる箇所を説明します。
HCP Webhook 設定
HCP PackerとWebhookの作成は以下で行なっています。
terraform/packer.tf
# HCP packer
resource "hcp_packer_bucket" "staging" {
name = "${var.app_name}-bucket"
project_id = var.project_id
}
# Webhook Config
resource "hcp_notifications_webhook" "example" {
name = "${var.app_name}-webhook"
description = "Notify for all of the events for all Packer artifact versions existing in the project."
project_id = var.project_id
config = {
url = aws_lambda_function_url.notify_slack.function_url
}
subscriptions = [
{
events = [
{
actions = ["*"]
source = "hashicorp.packer.version"
}
]
}
]
}
なおhcp_notifications_webhook.subscriptions
にて、
HCP Packerの全てのActionを通知対象にしています。
おそらく全てのActionは通知不要だと思うので、
実際に利用する場合は以下を参考に絞ってもいいかもしれません。
検証ペイロードとメッセージ加工
検証ペイロードとメッセージ加工はLambdaで行っております。
検証ペイロードは以下の箇所で処理しており、
今回は検証用のトークンは利用せず、ステータスコード200でレスポンスを返すだけにしています。
terraform/src/index.js
exports.handler = async (event) => {
console.log('Event received:', JSON.stringify(event, null, 2));
try {
const body = JSON.parse(event.body || '{}');
// HCP検証リクエストの処理
if (body.event_source === 'hashicorp.webhook.verification') {
console.log('Verification request received');
return createResponse(200, { message: 'Verification successful' });
}
メッセージの加工は以下のサンプルペイロードとイベントをもとに作成しています。
さいごに
以上、HCP Webhook Service で Slack に通知する方法でした。
複数のクラウドプロバイダーを利用するため少し下準備に時間がかかりますが、
実質的にどこでも通知先に指定できるので、工夫次第で様々な使い道がありそうです。
例えば HCP Terraform と連携してデプロイワークフローの一部に組み込んだり、または自動で terraform plan や apply に繋げたり…。
そういった込み入った使い方についても思いつき次第、また記事にしようと思います。