背景

ACMで発行しているサーバ証明書は自動で更新してくれることもあり、有効期限などはそれほど意識することはありません。

一方、他のサービスで発行したサーバ証明書は自分で再登録して、サーバ証明書を適用する必要があります。とはいうものの、有効期限って忘れがちです。1年に1回の更新になるので、有効期限がいつかのチェックそのものも忘れがちです。

そこで、有効期限をチェックして、期限が近づいたらslackに通知するようにします。

仕組み

以下のようにサービスを組み合わせてslackに通知します。

AWS Config → EventBridge → SNS → AWS Chatbot → Slack

terraformで実装

自分の環境はConfigからSecurityHubを経由してSNS→Chatbot→slackの流れがありました。

そのため、追加でEventBridgeの部分を作り込みました。

まずはconfigルールを作ります。ここでは45日前にチェックするようにします。

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

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

  # パラメータ: 45日。ここは変更可能
  input_parameters = jsonencode({
    daysToExpiration = "45"
  })

  depends_on = [aws_config_configuration_recorder.main]
}
terraform

次にEventBridgeでNON_COMPLIANTをSNSに通知します。

resource "aws_cloudwatch_event_rule" "config_noncompliant" {
  name        = "ConfigACMCertNonCompliant"
  description = "Import cert 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
}
terraform

運用

上記のterraformをapplyしたらすぐに通知がきました。