AWSで、CloudWatchアラームのメッセージをSNSトピックかましてメール送信。昔からよくあるオーソドックスなパターンだが、しばらく縁がなかったので記憶がかすんでいる。過去に構築した時の記録を掘り返してみる。

数年前、CloudFormation(CFn)で環境構築したのだが(主担当は別のメンバー)、CWアラーム作成はCFnで作るのに不向きということでAWS CLIで作成していた。何故CFnが不向きなのか、理由は何だったか思い出せない。以下の記事を見ると普通にCFnでアラーム作成しているから問題なさそうではあるのだが…

CloudFormationでCloudWatchAlermを作成する

 

ここで、書いていてうっすら思い出した。過去事例ではオートスケールのアラームだったが、その場合は他のアラームと異なるのかもしれない。(つまりオートスケールのアラームはポリシーを別出しにする)確かASG(オートスケーリンググループ)自体もCFnで作るのは不向きということでCLIで作成してた。CFnだと勝手に変な名前付けられるから、って理由だったかな。しかしハッキリとは思い出せない。

もやもや感が払拭しきれないが、とりあえず過去のメモ書きをのせておく。

 

ここから。

オートスケーリンググループのCloudWatchアラーム作成時のポイントは、先にSNSトピック、ポリシーを作成する。ポリシー作成のCLIを実行するとARNが出力されるので、その値を定義してアラームを作成する。SNSトピック自体はCFnで作成していた。サブスクリプション作成はコンソールからやったような。グダグダな記憶だが、メールアドレスをサブスクライブする時に手動での承認が発生するのは確か。(設定したメールアドレスに届いたメール内のリンクを押下すると承認が完了する)

サブスクリプション承認は手動になるが、アラーム作成時に指定するのはトピックARN。承認しないと後続作業ができないわけではない、と思われる。(ただし承認対応は3日以内に実施すること)

以下、ec2オートスケーリングのスケールアウト/インポリシー作成CLIの例。ec2のオートスケールってパターンもすでにオールドファッション化しているけど…、数年前の事例なので。

スケールアウトポリシー

$ aws autoscaling put-scaling-policy \
 --auto-scaling-group-name test-web-asg \
 --policy-name test-web-scaleout-policy \
 --scaling-adjustment 2 \
 --adjustment-type ChangeInCapacity \
 --cooldown 300 \
 --region ap-northeast-1

 

スケールインポリシー

$ aws autoscaling put-scaling-policy \
 --auto-scaling-group-name test-web-asg \
 --policy-name test-web-scalein-policy \
 --scaling-adjustment -2 \
 --adjustment-type ChangeInCapacity \
 --cooldown 600 \
--region ap-northeast-1

 

この後、以下のCLIを実行。スケールアウトアラーム作成CLI例。--alarm-actions オプションで 先に作成しておいた$snstopic, $scaleoutpolicy の値を指定している。

snstopic="arn:aws:sns:ap-northeast-1:[AWSアカウントID]:test-alert-mail"
scaleoutpolicy="arn:aws:autoscaling:ap-northeast-1:[AWSアカウントID]:scalingPolicy:[ランダム値]:autoScalingGroupName/test-web-asg:policyName/test-web-scaleout-policy"


$ aws cloudwatch put-metric-alarm \
 --alarm-name "test-web-scaleout-alarm" \
 --alarm-description "Alarm when CPU exceeds 70%" \
 --metric-name CPUUtilization \
 --namespace AWS/EC2 \
 --statistic Average \
 --period 60 \
 --threshold 70 \
 --comparison-operator GreaterThanThreshold \
 --dimensions  Name=AutoScalingGroupName,Value="test-web-asg" \
 --evaluation-periods 4 \
 --alarm-actions $scaleoutpolicy $snstopic \
 --unit Percent \
 --region ap-northeast-1

 

スケールイン時のアラームも同様に作成する。

 

以下備忘録。静観対応をどうするか
CloudWatch アラームのダウンタイム(特定期間の発報抑止)を Metric Math を使用して実現してみた


関連がありそうな記事