この記事は公開されてから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をばんばかたてても自動で共通のアラームを設定することもできます。可能性無限大です。