😽

CloudWatchでACMな証明書の期限をチェックするのを terraform で書いてみる

2021/03/14に公開
3

https://aws.amazon.com/jp/about-aws/whats-new/2021/03/aws-certificate-manager-provides-certificate-expiry-monitoring-through-amazon-cloudwatch/

AWS Certificate Manager が Amazon CloudWatch を介した証明書の有効期限の監視の提供を開始
というわけで、さっそく?試してみることに。

そういえば、過去にCloudFront用にACM使って証明書作ったのがあったからそれを使うか…

あれー、ないなー、なんでだー

と思ったら、us-east-1 にありました。

なんでだとーと思って色々見てたら

CloudFrontで指定するACMは us-east-1 にないとだめなのですねぇ…
そりゃ東京にはないわ

CloudFrontの設定画面のとこにちゃんと書いてありました。
作った時に脳死でやってしまったようだ。ちゃんと説明は読もう…。

というわけで、ACMが us-east-1 にあるので、CloudWatch の方も us-east-1 で設定する必要が。
東京でもメトリクスは表示できるけど、アラームが作成できないですね。。。

まぁ細かいとこは後でやるとして、どんな感じか見ておこう。

なるほどなるほど。

ぽちぽちやってってもいいんですが、せっかくなので terraform cloud でやってみることにします。AWSなterraformはあまり書いたことがないので練習も兼ねて。

SNS topic はWebコンソールで us-east-1 に作ったのでそれを、ACMのarnは引っ張ってくることにしました。
SNS topic -> chatbot で slack 投稿にしてるので、topic 作るあたりは terraform ではうまく出来ないかも?
see also https://github.com/hashicorp/terraform-provider-aws/issues/12304

terraform {
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 3.0"
    }
  }
}

provider "aws" {
  region = "us-east-1"
}

data "aws_sns_topic" "acm-useast1" {
  name = "cloudwatch-useast1"
}

data "aws_acm_certificate" "example-jp" {
  domain       = "example.jp"
}

resource "aws_cloudwatch_metric_alarm" "example-certificate-check" {
  alarm_name                = "certificate_days_to_expiry"
  threshold                 = "30"
  comparison_operator       = "LessThanThreshold"
  evaluation_periods        = "1"
  datapoints_to_alarm       = "1"
  alarm_description         = "This metric monitors example.jp DaysToExpiry"
  alarm_actions             = [data.aws_sns_topic.acm-useast1.arn]
  ok_actions                = [data.aws_sns_topic.acm-useast1.arn]

  metric_name   = "DaysToExpiry"
  namespace     = "AWS/CertificateManager"
  period        = "86400"
  statistic     = "Average"  
  unit          = "Count"
  dimensions    = {
    CertificateArn = data.aws_acm_certificate.example-jp.arn
  }
}

コンソールの画像では「以下」になってるけど、terraform側は「より低い」です。特に理由はないです。後で違うことに気付きました。

途中なかなかうまくいかなくて、よーく見たらtypoでした。これのせいで1時間は損した!!
パラメータ系はコピペ大事ですね…orz

Terraform will perform the following actions:

  # aws_cloudwatch_metric_alarm.example-certificate-check will be updated in-place
  ~ resource "aws_cloudwatch_metric_alarm" "example-certificate-check" {
      ~ dimensions                = {
          + "CertificateArn" = "arn:aws:acm:us-east-1:XXXXXXXXX:certificate/13ffbdc7-7592-4c81-baaf-XXXXXXXXX"
          - "CretificateArn" = "arn:aws:acm:us-east-1:XXXXXXXXX:certificate/13ffbdc7-7592-4c81-baaf-XXXXXXXXX" -> null
        }
        id                        = "certificate_days_to_expiry"
        tags                      = {}
        # (17 unchanged attributes hidden)
    }

Plan: 0 to add, 1 to change, 0 to destroy.

commitのコメント適当すぎなので次からは気を付ける…かもしれない

ちょっと閾値変更したりしてテストして、slack に通知されることを確認。

とりあえず今回は完了と…。

Discussion

waddy_uwaddy_u

記事のタグについて、 terraform と修正していただけるでしょうか。ご検討よろしくお願いいたします。

noriko3noriko3

typoしてましたね!ご指摘ありがとうございます。修正しましたー