今回はterraformでCloudFrontにAlarmを設定してみます。
対象として、前回の記事で作成したCloudFront+S3の環境に対して設定してみます。
#providerのaliasの設定
今回CloudFrontにAlarmを設定しますが、注意点としてCloudFrontのメトリクスは"us-east-1"のリージョンにしか送信されません。
このため、Alarmやその送信先のSNS Topicについてもus-east-1で作成を行う必要があります。
terraformではaliasのパラメータを付けることで、別の設定を持つProviderを設定できるのでus-east-1のProviderを作成しておきます。
provider "aws" {
alias = "global"
access_key = var.aws_access_key
secret_key = var.aws_secret_key
region = "us-east-1"
}
ここでは"global"というalias名で設定しています。
#通知先の作成
SNS Topicの作成
まずはAlarm状態になった際の通知先(SNS Topic)を作成しておきます。
前述したように、us-east-1のリージョンに作成しないと動作しない為、providerパラメータに先ほど作成したglobalのproviderを設定しています。
resource "aws_sns_topic" "tfNotificationGlobalTopic" {
provider = aws.global
fifo_topic = false
name = "tfNotificationGlobalTopic"
}
サブスクリプションの登録
次に実際に通知される宛先を登録します。
今回emailを通知先として登録しています。
※登録後に宛先のメールアドレスに確認のメールが飛んできますので、忘れず確認しておいてください。
resource "aws_sns_topic_subscription" "subscription1" {
provider = aws.global
topic_arn = aws_sns_topic.tfNotificationGlobalTopic.arn
protocol = "email"
endpoint = var.notification_mailaddress
}
※notification_mailaddress(通知先のメールアドレス)はtfvarsで定義しています。
#Alarmの作成
今回は500系エラーの5分間の平均が30%以上になった場合にalarm状態にします。
対象として、前回の作成したcloudfrontのdistibutionを設定し、alarm時のアクションに先ほど作成したtopicを設定しています。
resource "aws_cloudwatch_metric_alarm" "tfWatchAlarm" {
provider = aws.global
namespace = "AWS/CloudFront"
alarm_name = "tfWatchAlarm"
metric_name = "5xxErrorRate"
comparison_operator = "GreaterThanOrEqualToThreshold"
evaluation_periods = "1"
period = "300"
statistic = "Average"
threshold = "30"
dimensions = {
DistributionId = aws_cloudfront_distribution.distribution.id
Region = "Global"
}
actions_enabled = true
alarm_actions = [aws_sns_topic.tfNotificationGlobalTopic.arn]
}
#まとめ
これらの設定で、CloudFrontに対してAlarmの設定が行えます。
今回はCloudFront+S3の環境に対して設定しており、まず発生することはありませんが、
これらの設定はCloudFrontDistribution全般に対して有効なはずです。
注意点としては、us-east-1のリージョンで設定が必要というところになると思います。
※最終的なコードこちら。
Github - terraform_cfs3_cloudwatch