はじめに
複数環境への横展開を目的としてCloudWatchアラームをCloudFormationを用いて作成する機会があったので、備忘録として残そうと思います。
CloudWatchアラームに関する知識はあるが、CloudFormationを用いてアラームのリソースを作成したことがない方へ向けての内容になります。
CloudWatchアラームとは?という方は以下をご参照ください。
https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/AlarmThatSendsEmail.html
また今回はCloudFormationのテンプレートをYAML形式で作成していますが、Visual Studio CodeのプラグインでYAML⇔JSON変換もできるそうなので(試してはいません)、JSON派の方も参考にしていただければと思います。
https://bsblog.casareal.co.jp/archives/4936
早速作ってみる
Lambdaのエラーを検知するCloudWatchアラームとそれを通知するためのSNSトピックを作成します。
環境ごとにリソース名を変える為に、環境識別子をパラメータにとり各リソース名の頭につけます。
以下がCloudFormationのテンプレートになります。
AWSTemplateFormatVersion: 2010-09-09
Parameters:
# 環境識別子毎にリソースの名前を変える必要があるので、環境識別子をパラメータとして用意
EnvironmentIdentifier:
Description: Environment Identifier
MaxLength: 15
Type: String
Resources:
# SNS Topic (エラーアラームの通知用)
TopicError:
Type: AWS::SNS::Topic
Properties:
TopicName:
Fn::Join:
- "-"
- - Ref: EnvironmentIdentifier
- topic-error
Subscription:
- Protocol: email
Endpoint: xxxx@example.com
# CloudWatchアラームのリソース
AlarmLambdaError:
Type: AWS::CloudWatch::Alarm
Properties:
AlarmName:
Fn::Join:
- "-"
- - Ref: EnvironmentIdentifier
- alarm-lambda-error
AlarmDescription: Alarm for Lambda Error
# アラームのアクションとしてSNSのTopicを指定
AlarmActions:
- Fn::Join:
- ":"
- - 'arn:aws:sns:ap-northeast-1'
- Ref: 'AWS::AccountId'
- Fn::Join:
- "-"
- - Ref: EnvironmentIdentifier
- topic-error
ComparisonOperator: GreaterThanThreshold
MetricName: Errors
Namespace: AWS/Lambda
DatapointsToAlarm: '1'
EvaluationPeriods: '1'
Period: '300'
Statistic: Sum
Threshold: '0'
CloudFormationスタックの作成
CloudFormationの「スタックの作成」からスタックの作成をします。
まとめ
今回のシステムでは多い時で10環境程度あり、1環境に100個弱のアラームが存在していたため、コンソールからアラームを作成していたのではとても間に合いませんでした。
CloudFormationによってリソースをIaC化することにより、横展開の工数を大幅に削減することに成功しました。
皆様も環境数の多いシステムではIaC化を検討されてはいかがでしょうか。