我正在使用Redshift调度查询来运行UNLOAD命令。如果查询失败,我希望收到通知。我启用了SNS,但无论作业成功还是失败,消息都是一样的。只有在作业失败的情况下,我才能收到通知?
更新:我可以使用以下命令得到错误消息的响应。我如何设置CloudWatch或其他服务来对此进行监控并发送通知?
aws redshift-data describe-statement --id {id} --region us-west-2
有几个选项可供选择:
-
您可以在boto3中使用lambda函数来检查红移上的查询是否成功运行
-
您还可以使用lambda函数来检查cloudwatch中的日志
这可以使用AWS事件桥规则来完成。创建具有以下模式的规则:
{ "source": [ "aws.redshift-data" ], "detail-type": [ "Redshift Data Statement Status Change" ], "detail": { "state": [ "FAILED" ] } }
只要计划的查询失败,就会触发此规则。您可以将此规则的目标设置为SNS主题,该主题可以将事件负载转发到您的电子邮件。以下是在计划查询失败的情况下可以预期的示例负载:
{"版本":"0","id":"64207b01-e97e-b05a-c090-1ba0c3eee01f","细节类型":"红移数据语句状态"改变"源":"aws.redshift数据"账户":"xxxxxx"时间":"2023-04-13T11:04:38Z""区域":"eu-central-1"资源":["arn:aws:redshift:eu-central-1:xxxxxx:cluster:xxxx cluster"],";细节":{"主体":"arn:aws:sts::xxxx:假定角色/RedshiftScheduler/xxxxx","语句名称":"xxxxx"、"语句Id":"65ecdd43-5c0e-4507-841d-5857c6835b1f"、"redshiftQueryId":1.6043919E7、"状态":"失败"、"行";:-1.0,"expireAt":1.681642837E9}}
希望它能有所帮助。
我们在python lambda函数中实现的解决方案:
- 列出所有EventBridge规则:
aws events list-rules
- 对于每个规则,获取目标并筛选那些具有Redshift集群目标的规则:
aws events list-targets-by-rule
- 对于每个Redshfit目标,通过将SQL语句和CRON定义与列
querytxt
和starttime
相匹配,尝试在STL_QUERY
中找到它。您可以使用pyawscron将您的CRON转换为时间戳 - 如果记录不存在,则发出警报
此解决方案可以根据您的需要轻松增强。
便于在STL_QUERY
中查找的提示:为您的计划查询使用特定的user
。
希望能有所帮助。