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

2019.08.13

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

コンニチハ、千葉です。

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を出力します。

```bash
cdk synth

デプロイします。

cdk deploy

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

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

最後に

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

参考