背景
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したらすぐに通知がきました。