CloudWatch Alarm(Lambda ERRORメトリクス)が存在しないLambdaを調べる

うっかりCloudWatch Alarmの作成を忘れても、調べて把握して対応できます。
2023.10.26

作成したLambdaに対して、ERRORを監視するCloudWatch Alarmを作成することがあります。 たくさんのLambdaを作成していると、CloudWatch Alarmの作成を忘れることもあります。 そこで、CloudWatch Alarm(Lambda ERRORメトリクス)が存在しないLambdaを調べるスクリプトを作成してみました。

おすすめの方

  • CloudWatch Alarm(ERROR)が存在しないLambdaを調べたい方

CloudWatch Alarm(ERROR)が存在しないLambdaを調べるスクリプト

デプロイされているLambdaの関数名を取得し、下記のすべてを満たすCloudWatch Alarmがあるかを調べています。

  • Lambdaに対するCloudWatch Alarmであること(Namespace)
  • ERRORに対するCloudWatch Alarmであること(MetricName)
  • DimensionsのFunctionNameが一致すること

なお、Lambdaのバージョンやエイリアス名は考慮していません。必要に応じてカスタマイズしてください。

app.py

import boto3

lambda_client = boto3.client("lambda")
cloudwatch_client = boto3.client("cloudwatch")


def main():
    lambda_function_names = get_lambda_function_names()

    cloudwatch_alarms = get_cloudwatch_alarms()

    for item in lambda_function_names:
        if not is_exist_cloudwatch_alarm(item, cloudwatch_alarms):
            print(item)


def get_lambda_function_names() -> set:
    items = []
    options = {}

    while True:
        resp = lambda_client.list_functions(**options)

        items += [item["FunctionName"] for item in resp["Functions"]]
        next_marker = resp.get("NextMarker")

        if next_marker is None:
            break
        options["Marker"] = next_marker

    return set(items)


def get_cloudwatch_alarms() -> list[dict]:
    items = []
    options = {
        # 今回、 CompositeAlarms は、考慮しない
        "AlarmTypes": ["MetricAlarm"],
    }

    while True:
        resp = cloudwatch_client.describe_alarms(**options)

        items += resp["MetricAlarms"]
        next_token = resp.get("NextToken")

        if next_token is None:
            break
        options["NextToken"] = next_token

    return items


def is_exist_cloudwatch_alarm(
    lambda_function_name: str, cloudwatch_alarms: list[dict]
) -> bool:
    for alarm in cloudwatch_alarms:
        if alarm.get("Namespace") != "AWS/Lambda":
            continue
        if alarm.get("MetricName") != "Errors":
            continue
        for dimension in alarm["Dimensions"]:
            if dimension.get("Name") == "FunctionName":
                if lambda_function_name in dimension["Value"]:
                    return True
    return False


if __name__ == "__main__":
    main()

スクリプトを実行する

python app.py

CloudWatch Alarm(ERROR)が存在しないLambdaがあれば、次のようにLambda関数名が表示されます。

test-manual-arm64-function
sqs-test-function

さいごに

CloudWatch Alarm(ERROR)が存在しないLambdaを調べるスクリプトを作成してみました。 おまけ的な結果として、「DimensionsのFunctionNameを間違えていたので、CloudWatch Alarmが無かった」みたいなことも分かるかもしれません。

参考