如何在Azure容器实例内命令失败时触发告警邮件?
解决ACI命令执行失败的邮件告警方案
方案一:用Azure Function(替换AZ CLI为官方SDK)
不用在Function里运行AZ CLI,直接通过Azure官方SDK调用API获取ACI日志,步骤如下:
- 给Function的系统分配身份添加ACI的
读取者或容器实例参与者权限(在Azure门户的Function身份设置页配置) - 用对应语言的SDK编写核心逻辑,比如Python示例(依赖
azure-mgmt-containerinstance库):from azure.identity import DefaultAzureCredential from azure.mgmt.containerinstance import ContainerInstanceManagementClient import sendgrid from sendgrid.helpers.mail import Mail # 初始化ACI管理客户端 credential = DefaultAzureCredential() client = ContainerInstanceManagementClient(credential, "你的订阅ID") # 拉取目标容器日志 logs = client.container.list_logs("资源组名称", "ACI组名称", "容器名称") log_content = logs.content # 检查错误字符串并发送邮件 if "你要检测的错误字符串" in log_content: sg = sendgrid.SendGridAPIClient(api_key="你的SendGrid密钥") message = Mail( from_email="告警发送邮箱", to_emails="接收告警的邮箱", subject="ACI命令执行失败告警", plain_text_content=f"检测到错误日志内容:\n{log_content}" ) sg.send(message) - 配置Timer Trigger的CRON表达式:
0 */30 0-1 * * *(对应UTC时间00:00-02:00期间每30分钟执行一次)
方案二:用Azure Monitor告警(最适合新手,零代码)
这是最省心的原生方案,无需编写代码:
- 第一步:开启ACI日志收集到Log Analytics工作区
在ACI的门户页面进入日志选项卡,按照提示关联Log Analytics工作区 - 第二步:编写日志查询筛选错误
在Log Analytics中创建查询,示例如下:ContainerInstanceLog | where ResourceGroup == "你的资源组名称" | where ContainerName == "你的容器名称" | where Message contains "你要检测的错误字符串" - 第三步:创建告警规则
点击查询页面的新建告警规则,完成以下配置:- 触发条件:设置为查询返回行数>0时触发
- 动作组:添加
电子邮件/短信/推送/语音,填写接收告警的邮箱 - 时间窗口:在
高级设置的计划中,配置仅在UTC 00:00-02:00期间评估告警
- 配置完成后,只要日志中出现指定错误字符串,就会自动发送告警邮件
方案三:关于Azure Batch的可行性(不推荐新手)
你确实可以创建基于自定义镜像的Batch池,但该方案复杂度高、维护成本大,远不如前两个方案实用:
- 需要打包包含AZ CLI、邮件工具(如sendmail)的自定义镜像
- 配置Batch池的自动缩放规则,仅在UTC 00:00-02:00启动计算节点
- 创建定时作业,每30分钟运行任务,执行
az container logs拉取日志,检查错误后发送邮件 - 除非有特殊场景需求,否则不建议新手采用该方案
内容的提问来源于stack exchange,提问作者João Valente
相关产品推荐
相关产品推荐

