🔔

ACMインポート証明書の有効期限をSlack通知する仕組みをTerraformで構築

に公開

背景

AWS Certificate Manager(ACM)には以下の2種類の証明書があります。

ACM発行の証明書

  • AWSが自動で発行・更新してくれる
  • 有効期限を気にする必要がない
  • 無料で利用可能

インポート証明書(外部で発行した証明書)

  • Let's EncryptやDigiCertなど、外部で発行した証明書をACMにインポートしたもの
  • 自動更新されない
  • 有効期限前に手動で再インポートが必要

問題は、インポート証明書の有効期限管理です。年1回の更新作業のため、有効期限のチェック自体を忘れがちになります。

そこで、有効期限が近づいたら自動的にSlackに通知する仕組みを構築します。

アーキテクチャ

以下のAWSサービスを組み合わせて、証明書の有効期限をSlackに通知します。

AWS Config → EventBridge → SNS → AWS Chatbot → Slack

各サービスの役割

サービス 役割
AWS Config ACM証明書の有効期限を定期的にチェック。有効期限が指定日数以内になるとNON_COMPLIANTを検出
EventBridge AWS ConfigのNON_COMPLIANTイベントを検知してSNSにルーティング
SNS 通知メッセージをAWS Chatbotに配信
AWS Chatbot SNSトピックからのメッセージをSlackに転送
Slack 最終的な通知先。証明書更新が必要なことを通知

Terraformで実装

前提条件

この実装では、以下がすでに構築されている前提です:

  • AWS Configが有効化されている
  • SNSトピック(aws_sns_topic.chatbot)が作成済み
  • AWS ChatbotとSlackの連携が設定済み

私の環境では、Config → SecurityHub → SNS → Chatbot → Slackの流れがすでにありました。今回はそこにEventBridgeを追加する形で実装します。

ステップ1: AWS Config ルールの作成

ACM証明書の有効期限をチェックするConfigルールを作成します。ここでは45日前に通知するように設定します。

resource "aws_config_config_rule" "acm_expire" {
  name = "acm-certificate-expiration-check"

  source {
    owner             = "AWS"                     # AWSマネージドルール
    source_identifier = "ACM_CERTIFICATE_EXPIRATION_CHECK"
  }

  # パラメータ: 有効期限の何日前から通知するか
  input_parameters = jsonencode({
    daysToExpiration = "45"  # 45日前から通知(変更可能)
  })

  depends_on = [aws_config_configuration_recorder.main]
}

ポイント:

  • ACM_CERTIFICATE_EXPIRATION_CHECKはAWSが提供するマネージドルール
  • daysToExpirationで通知するタイミングを調整可能(デフォルトは14日)
  • 45日前に通知することで、余裕を持って証明書を更新できる

ステップ2: EventBridge ルールとターゲットの作成

AWS ConfigがNON_COMPLIANT(コンプライアンス違反)を検出したら、SNSに通知するEventBridgeルールを作成します。

resource "aws_cloudwatch_event_rule" "config_noncompliant" {
  name        = "ConfigACMCertNonCompliant"
  description = "Notify when ACM import certificate is about to expire"

  event_pattern = <<PATTERN
{
  "source": ["aws.config"],
  "detail-type": ["Config Rules Compliance Change"],
  "detail": {
    "messageType": ["ComplianceChangeNotification"],
    "configRuleName": ["acm-certificate-expiration-check"],
    "newEvaluationResult": { "complianceType": ["NON_COMPLIANT"] }
  }
}
PATTERN
}

resource "aws_cloudwatch_event_target" "to_sns" {
  rule      = aws_cloudwatch_event_rule.config_noncompliant.name
  target_id = "SendToSNS"
  arn       = aws_sns_topic.chatbot.arn
}

ポイント:

  • EventBridgeは、AWS ConfigからのNON_COMPLIANTイベントのみをフィルタリング
  • configRuleNameで対象ルールを指定
  • SNSトピック(aws_sns_topic.chatbot)にイベントを転送

運用

初回適用時の挙動

上記のTerraformコードをterraform applyすると、すぐに通知が来ることがあります。

これは、既存のインポート証明書が以下のいずれかの状態にある場合です。有効期限が間近だったため、私は通知がきました。

  • すでに有効期限が45日以内に迫っている
  • 有効期限が切れている

Slack通知の例

通知が来ると、Slackには以下のような情報が表示されます:

  • イベントタイプ: Config Rules Compliance Change
  • ルール名: acm-certificate-expiration-check
  • コンプライアンス状態: NON_COMPLIANT
  • 対象リソース: 証明書のARN

証明書更新後の対応

証明書を更新(再インポート)すると:

  1. AWS Configが次回チェック時にCOMPLIANTを検出
  2. コンプライアンス状態がNON_COMPLIANTCOMPLIANTに変化
  3. 通知は停止される
GitHubで編集を提案

Discussion