【问题标题】:azure logic apps: waiting for an ACI container to terminate to get its logs天蓝色逻辑应用程序:等待 ACI 容器终止以获取其日志
【发布时间】:2019-12-24 09:37:24
【问题描述】:

我有一个正确创建 Azure 容器实例的 Azure 逻辑应用。容器启动、完成其工作并终止。我需要使用适当的连接器收集它的日志并将它们写入一个 azure blob。

我已准备好所有部件,但我不知道如何在使用“获取容器日志”连接器收集日志之前等待容器终止。

如果容器作业会持续一段可预测的时间,我可以在获取日志之前使用延迟连接器,这样就足够了(我尝试过短作业并且效果很好)。 但是我的工作可能会持续几个小时,这取决于一些外部因素,因此延迟技术不起作用。

我已经尝试使用“直到”连接器,以及延迟和“获取容器组的属性”容器等到容器的状态不是“终止”,但没有成功(也许我做到了错误的)。无论如何,这可能非常昂贵,因为每张“支票”都是收费的。

如何在请求其日志之前等待容器终止?

谢谢。

【问题讨论】:

    标签: azure docker azure-logic-apps azure-container-instances


    【解决方案1】:

    从Charles Xu的回答开始,设置变量时的正确顺序是

    这使用“状态”容器实例变量而不是“供应状态”。后者是关于容器组的创建,第一个是关于容器实例的状态,这是我需要的。 我添加了延迟以减少连接器的(付费)运行次数。

    【讨论】:

    • 为什么不接受我的答案而不是复制解决方案,而它可以帮助您解决问题?!
    • 因为它不完整且无法正常工作。如果您对其进行编辑并使其按预期工作,例如使用正确的参数(状态)和强制的 foreach,我将很高兴接受您的回答。只有一个完整的答案肯定会对社区更有用,这是最重要的。谢谢。
    • 为什么不起作用?如果您只创建一个实例,它会运行良好。我不知道你真正想要的所有信息,除了你没有人会知道。在 SO 中,社区只能提供解决问题的想法,而不是完整的答案。
    • 对不起@CharlesXu,但这就是我需要的:“我不知道如何等待容器终止”。您有用的答案会告诉容器何时正确部署,而不是何时终止执行。事实上,您查询的是“provisioningState”属性,而不是“state”属性。第一个保持配置状态,后者保持执行状态。
    【解决方案2】:

    如果你想获取一个容器组的日志并且没人知道它什么时候可以终止。在逻辑应用中,您可以使用变量来存储容器组的状态,然后使用 until 控制循环,该循环将终止容器组,直到它变为真。

    步骤如下:

    1. 创建容器组;
    2. 获取容器组的供应状态;
    3. 初始化一个变量来存储容器组的供应状态;
    4. 在unille中,获取容器组的provision状态,直到状态等于terminate;
    5. 获取容器组的日志。

    整体结构:

    初始化变量和直到步骤:

    【讨论】:

    • 这是一个很好的起点,尽管它并不完全符合我的目标。详情请参考我的回答。谢谢。
    【解决方案3】:

    由于您提到在逻辑应用中使用“Until”可能很昂贵,因此我在这里提供另一种解决方案供您参考。

    我们可以创建一个time trigger azure function并设置每1分钟的cron表达式,create a service plan(free tier)为函数,所以我们不需要支付函数的运行成本(但可能会支付存储的函数)。

    该函数将每 1 分钟运行一次。在函数中我们需要通过thisrest api获取容器的属性,然后如果状态为“终​​止”,则调用逻辑应用请求触发逻辑应用(逻辑应用应创建为“When a HTTP request is received ")。

    函数代码(在本地,部署到azure之前)应该如下:

    using System;
    using Microsoft.Azure.WebJobs;
    using Microsoft.Azure.WebJobs.Host;
    using Microsoft.Extensions.Logging;
    
    namespace hurytimeFun
    {
        public static class Function1
        {
            [FunctionName("Function1")]
            public static void Run([TimerTrigger("0 */1 * * * *")]TimerInfo myTimer, ILogger log)
            {
                log.LogInformation($"C# Timer trigger function executed at: {DateTime.Now}");
    
                //1. using rest api to get the properties of your container
    
                //2. if the state is "terminated"
                    // call the logic app request to trigger the logic app
            }
        }
    }
    

    希望对你的问题有所帮助~

    【讨论】:

    • 这种方法一般来说很酷且有效,但对我而言,它不适用,因为我以编程方式提供了许多逻辑应用程序,您的回答需要额外的协调工作。谢谢。
    【解决方案4】:

    一旦容器终止,一切都将丢失。您可以从 Azure 市场安装 log-analytics-containers 以在容器终止之前进行日志记录和记录

    【讨论】:

    • 当容器终止时,不会丢失任何东西:您可以轻松读取其日志,例如,如果您不删除容器组。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-07
    • 2016-03-25
    • 2021-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多