[CDK]EC2リストを取得して全台にCloudWatchアラームを設定する

2019.08.13

コンニチハ、千葉です。

CDK便利ですね。今回はEC2の一覧を取得し、一括でCloudWatchアラームを仕掛けてみたいと思います。具体的には、boto3でEC2の一覧を取得し、対象のEC2に共通のアラームをばんばか設定してみたいと思います。共通の設定する場合に、対象リストを取得して、それを元に設定ができると楽そうですね。

やってみた

今回CDKはPythonを利用します。はじめに、boto3とaws_cdk.aws_cloudwatchをインストールします。

pip install aws_cdk.aws_cloudwatch boto3

EC2の一覧を取得してくる部分のコードです。ここは普通にboto3を使って取得します。

import boto3

client = boto3.client('ec2', 'ap-northeast-1')
responce = client.describe_instances()
all_list = []
for reservation in responce['Reservations']:
for instance in reservation['Instances']:
all_list.append(instance['InstanceId'])
print(all_list)

取得したEC2リストを元に、CloudWatchアラームをループで設定する処理です。

from aws_cdk import (
aws_cloudwatch as cw,
core
)

for ec2_id in all_list:
metric = cw.Metric(
namespace = 'AWS/EC2',
metric_name = 'CPUUtilization',
dimensions = {"InstanceId": ec2_id}
)

alarm = cw.Alarm(self, 'cpu-alarm-' + ec2_id,
metric = metric,
threshold = 80,
evaluation_periods = 2
)

こちらのコードが最終形です。

from aws_cdk import (
aws_cloudwatch as cw,
core
)
import boto3

class CdkMultiSampleStack(core.Stack):

def __init__(self, scope: core.Construct, id: str, **kwargs) -> None:
super().__init__(scope, id, **kwargs)

# EC2の一覧を取得
client = boto3.client('ec2', 'ap-northeast-1')
responce = client.describe_instances()
all_list = []
for reservation in responce['Reservations']:
for instance in reservation['Instances']:
all_list.append(instance['InstanceId'])
print(all_list)

# アラームを設定
for ec2_id in all_list:
metric = cw.Metric(
namespace = 'AWS/EC2',
metric_name = 'CPUUtilization',
dimensions = {"InstanceId": ec2_id}
)

alarm = cw.Alarm(self, 'cpu-alarm-' + ec2_id,
metric = metric,
threshold = 80,
evaluation_periods = 2
)

CloudFormationを出力します。

cdk synth

デプロイします。

cdk deploy

CloudWatchアラームの設定を見てみます。

EC2を3台起動していたのですが、3台分設定されていました!!

最後に

対象の一覧を取得し、CloudFormationを設定してみました。応用の幅が広く、かなり柔軟に書けました。コード化が捗りますね。 今回のCDKを定期的に実行すると、EC2をばんばかたてても自動で共通のアラームを設定することもできます。可能性無限大です。

参考