HCP Webhook Service で HCP Packer のイベントを Slack に通知してみた。

HCP Webhook Service で HCP Packer のイベントを Slack に通知してみた。

Clock Icon2025.05.19

はじめに

皆様こんにちは、あかいけです。

突然ですが、 HCP Webhook Service をご存知でしょうか?
私はHCPに入門してから知ったのですが、
これは HCP上のリソースのライフサイクルイベント(作成、削除、更新…etc)を外部システムに通知するWebhook を提供しています。

https://developer.hashicorp.com/hcp/api-docs/webhook

今回は HCP 活用の第一歩として、
HCP Webhook Service を利用して、HCP Packer のイベントを Slack に送信してみました。

なお現時点では HCP Webhook Service は以下サービスに対応しています。

  • HCP Packer
  • HCP Vault Secrets

構成

architecture.drawio

Lambda が Webhook の受け口となり、そこでメッセージを加工して Slack Webhook を利用して Slack に送信しています。

HCP Terraform の Workspace notifications では直接 Slack に送信できる機能がありますが、
HCP Webhook Service では Webhook 作成時に検証プロセスがあり、レスポンスとして ステータスコード 200-299 を返す必要があります。

そのため、今回はLambdaを利用して検証の処理とメッセージの加工を行っています。

https://developer.hashicorp.com/hcp/docs/hcp/admin/projects/webhooks
https://developer.hashicorp.com/terraform/cloud-docs/workspaces/settings/notifications

事前準備

作成方法

1.サービスプリンシパル作成

以下ドキュメントの手順を参考に、Packer 実行時に利用するサービスプリンシパルを作成してください。
プリンシパルのRoleは Contributor を指定します。

https://developer.hashicorp.com/hcp/docs/hcp/iam/service-principal

その後プリンシパルのキーを作成して、
Client IDClient 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に通知されます。

notify-image

ポイント

いくつかポイントとなる箇所を説明します。

HCP Webhook 設定

HCP PackerとWebhookの作成は以下で行なっています。

terraform/packer.tf
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は通知不要だと思うので、
実際に利用する場合は以下を参考に絞ってもいいかもしれません。
https://developer.hashicorp.com/hcp/docs/packer/reference/webhook

検証ペイロードとメッセージ加工

検証ペイロードとメッセージ加工はLambdaで行っております。

検証ペイロードは以下の箇所で処理しており、
今回は検証用のトークンは利用せず、ステータスコード200でレスポンスを返すだけにしています。

terraform/src/index.js
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' });
    }

https://developer.hashicorp.com/hcp/docs/hcp/admin/projects/webhooks#verification-payload

メッセージの加工は以下のサンプルペイロードとイベントをもとに作成しています。

https://developer.hashicorp.com/hcp/docs/hcp/admin/projects/webhooks
https://developer.hashicorp.com/hcp/docs/packer/reference/webhook

さいごに

以上、HCP Webhook Service で Slack に通知する方法でした。

複数のクラウドプロバイダーを利用するため少し下準備に時間がかかりますが、
実質的にどこでも通知先に指定できるので、工夫次第で様々な使い道がありそうです。

例えば HCP Terraform と連携してデプロイワークフローの一部に組み込んだり、または自動で terraform plan や apply に繋げたり…。
そういった込み入った使い方についても思いつき次第、また記事にしようと思います。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.