作成した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が無かった」みたいなことも分かるかもしれません。