🍷

AWSの全サービスの中からクォータがひっ迫しているものを抽出する。

2023/10/26に公開

初めに

AWSの全サービスの中からクォータがひっ迫しているものを抽出する方法を紹介します。
皆様の中には気づかないうちにクォータを超えてしまい、エラーが出てしまうということを経験したかたがいらっしゃると思います。
クォータの中の使用量は基本的にCloudWatchのメトリクスで確認できますが、多すぎるので全てを確認するのが辛いです。
そこでスクリプトを作成しました。

code

import datetime

import boto3

#確認する期間
check_range_day = 7
now = datetime.datetime.now()
start_date = (now - datetime.timedelta(days=check_range_day)).strftime("%Y-%m-%dT%H:%M:%SZ")
now_str = now.strftime("%Y-%m-%dT%H:%M:%SZ")

reagion_name = "ap-northeast-1"

client = boto3.client("service-quotas", reagion_name=reagion_name)


def get_all_services()->list:
    # すべてのサービスを取得
    paginator = client.get_paginator("list_services")
    all_services = []
    for page in paginator.paginate():
        all_services.extend(page["Services"])

    return all_services


def get_high_usage_quotas(threshold=0.8)->list:
    cw_client = boto3.client("cloudwatch", reagion_name=reagion_name)

    high_usage_quotas = []

    for service in get_all_services():
        service_code = service["ServiceCode"]

        # 対象サービスのクオータ一覧を取得
        paginator_quotas = client.get_paginator("list_service_quotas")
        all_quotas = []
        for page in paginator_quotas.paginate(ServiceCode=service_code):
            all_quotas.extend(page["Quotas"])

        for quota in all_quotas:
            ## クォータの使用率を取得
            if "UsageMetric" in quota:
                response = cw_client.get_metric_statistics(
                    Namespace=quota["UsageMetric"]["MetricNamespace"],
                    MetricName=quota["UsageMetric"]["MetricName"],
                    Dimensions=[
                        {"Name": key, "Value": value}
                        for key, value in quota["UsageMetric"][
                            "MetricDimensions"
                        ].items()
                    ],
                    StartTime=start_date,
                    EndTime=now_str,
                    Period=60 * 60 * 24 * check_range_day,
                    Statistics=["Maximum"],
                )
                if len(response["Datapoints"]) > 0:
                    if (
                        response["Datapoints"][0]["Maximum"] / quota["Value"]
                        > threshold
                    ):
                        print(
                            f'Quota Name : {quota["QuotaName"]}',
                            f'Quota Rate : {response["Datapoints"][0]["Maximum"] / quota["Value"]}',
                            f'Max Usage : {response["Datapoints"][0]["Maximum"]}',
                            f'Limit : {quota["Value"]}',
                        )
                        high_usage_quotas.append(quota)
    return high_usage_quotas


quotas = get_high_usage_quotas(threshold=0.5)


終わりに

  • なんかいい方法有ったら教えてください
  • 全部の cloud watch metrics にアラーム付ける方がなんかいい気がしてきた・・・

Discussion