🔔
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
証明書更新後の対応
証明書を更新(再インポート)すると:
- AWS Configが次回チェック時に
COMPLIANTを検出 - コンプライアンス状態が
NON_COMPLIANT→COMPLIANTに変化 - 通知は停止される
Discussion