CloudWatch Alarm(Lambda ERRORメトリクス)が存在しないLambdaを調べる
作成した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のバージョンやエイリアス名は考慮していません。必要に応じてカスタマイズしてください。
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が無かった」みたいなことも分かるかもしれません。