当 Azure 容器实例 Succeeds/Fails 时发送电子邮件 Alerts/Logs

Email Alerts/Logs when Azure Container Instance Succeeds/Fails

有没有什么方法可以设置电子邮件警报,以便在单个 Azure 容器实例成功或失败(或基本上改变状态)时发出警报?我有一些 运行-once 容器,我会定期启动,并希望在它们完成时收到通知以及完成状态。如果电子邮件也可以包含来自容器的日志,那就更好了。这可以使用内置警报吗?

到目前为止,我还不能让它与提供的信号一起工作。

不要相信有一种自动方法,所以我所做的是创建一个基于计时器的小函数,该函数每 5 分钟运行一次并获取所有容器的列表并检查状态。如果有任何处于失败状态,它会使用 SendGrid 发送警报电子邮件。

丹更新

我在我的函数中使用托管服务身份,所以我有一个容器任务 class 如下所示,不记得我在哪里得到帮助来生成 GetAzure 函数,就像在进行本地调试时一样明显无法使用 MSI 凭据,Visual Studio 上的本地帐户似乎无法正常工作。但是我认为它可能已经在这里 - https://github.com/Azure/azure-sdk-for-net/issues/4968

public static class ContainerTasks
{
    private static readonly IAzure azure = GetAzure();

    private static IAzure GetAzure()
    {
        var tenantId = Environment.GetEnvironmentVariable("DevLocalDbgTenantId");
        var clientId = Environment.GetEnvironmentVariable("DevLocalDbgClientId");
        var clientSecret = Environment.GetEnvironmentVariable("DevLocalDbgClientSecret");
        AzureCredentials credentials;

        if (!string.IsNullOrEmpty(tenantId) &&
            !string.IsNullOrEmpty(clientId) &&
            !string.IsNullOrEmpty(clientSecret))
        {
            var sp = new ServicePrincipalLoginInformation
            {
                ClientId = clientId,
                ClientSecret = clientSecret
            };
            credentials = new AzureCredentials(sp, tenantId, AzureEnvironment.AzureGlobalCloud);
        }
        else
        {
            credentials = SdkContext
                .AzureCredentialsFactory
                .FromMSI(new MSILoginInformation(MSIResourceType.AppService), AzureEnvironment.AzureGlobalCloud);
        }
        var authenticatedAzure = Azure
            .Configure()
            .WithLogLevel(HttpLoggingDelegatingHandler.Level.Basic)
            .Authenticate(credentials);
        var subscriptionId = Environment.GetEnvironmentVariable("DevLocalDbgSubscriptionId");
        if (!string.IsNullOrEmpty(subscriptionId))
            return authenticatedAzure.WithSubscription(subscriptionId);
        return authenticatedAzure.WithDefaultSubscription();
    }

    public static IEnumerable<IContainerGroup> ListTaskContainers(string resourceGroupName, ILogger log)
    {
        log.LogInformation($"Getting a list of all container groups in Resource Group '{resourceGroupName}'");

        return azure.ContainerGroups.ListByResourceGroup(resourceGroupName);
    }
}

那我的监听功能就简单了

public static class MonitorACIs
{
    [FunctionName("MonitorACIs")]
    public static void Run([TimerTrigger("%TimerSchedule%")]TimerInfo myTimer, ILogger log)
    {
        log.LogInformation($"MonitorACIs Timer trigger function executed at: {DateTime.Now}");
        foreach(var containerGroup in ContainerTasks.ListTaskContainers(Environment.GetEnvironmentVariable("ResourceGroupName"), log))
        {
            if(String.Equals(containerGroup.State, "Failed"))
            {
                log.LogInformation($"Container Group {containerGroup.Name} has failed please investigate");
                Notifications.FailedTaskACI(containerGroup.Name, log);
            }
        }
    }
}

Notifications.FailedTaskACI 只是一种 class 方法,它向我们的 Teams 频道之一发送电子邮件

它并不完美,但它现在可以完成工作!