【问题标题】:How to get logs from Docker image running in AWS Lambda function?如何从在 AWS Lambda 函数中运行的 Docker 映像获取日志?
【发布时间】:2021-09-20 16:35:51
【问题描述】:

我正在尝试调试使用 Docker 映像的 AWS Lambda 函数,如 here 所述。我正在使用库存的 AWS Python 图像:public.ecr.aws/lambda/python:3.8

我可以按照上面链接中描述的步骤在本地测试我的功能,它工作得很好: docker run -p 9000:8080 hello-world,然后是 curl -XPOST "http://localhost:9000/2015-03-31/functions/function/invocations" -d '{}' 在另一个终端窗口中正确执行我期望的功能。但是,一旦它在 Lambda 中运行,在成功标记图像并将其推送到 AWS ECR 后,该功能似乎无法正常工作,我无法找到任何日志来调试失败/丢失的执行。

对于这些日志的存储位置和/或将这些日志导入 CloudWatch 或类似的东西可能缺少什么配置,我有点不知所措。我在哪里可以找到这些日志来进一步调试我的 lambda 函数?

【问题讨论】:

    标签: python amazon-web-services docker aws-lambda amazon-ecr


    【解决方案1】:

    因此,使用 lambda 编译到 zip 或 s3 中的代码的 docker 镜像在技术上没有区别。至于日志,根据 AWS 文档(这是直接来自文档的描述):

    AWS Lambda 会代表您自动监控 Lambda 函数,并通过 Amazon CloudWatch 报告指标。为了帮助您解决函数中的故障,Lambda 会记录您的函数处理的所有请求,并通过 Amazon CloudWatch Logs 自动存储您的代码生成的日志。

    您可以将日志记录语句插入到您的代码中,以帮助您验证您的代码是否按预期工作。 Lambda 自动与 CloudWatch Logs 集成,并将所有日志从您的代码推送到与名为 /aws/lambda/ 的 Lambda 函数关联的 CloudWatch Logs 组。

    因此,最基本的代码会在您的 lambda 中包含某种日志记录。在这种情况下,我对疑难解答的建议:

    1 - 如下图所示,转到您的 lambda 函数并尝试直接从控制台访问 cloudwatch 日志。请务必确认部署函数的默认区域。

    2 - 如果日志存在(lambda 函数的组存在),请检查您的代码是否有任何引发异常。

    3 - 如果有任何错误表明 cloudwatch 的组日志不存在或函数的组日志不存在,则直接在控制台中检查 lambda 的配置,或者,如果您使用的是像 serverless 或 cloudwatch 这样的框架,代码结构。

    4 - 最后,如果一切正常,这可能只与一件简单的事情有关。来自您帐户的用户权限或来自您的 lambda 函数的角色权限(这些情况大多是这种情况)。

    您应该检查的一件事是从您的 lambda 生成的基本角色,它确保您可以创建新的日志组

    一个策略示例应该是这样的(你也可以手动添加CloudWatch Logs策略,效果应该差不多):

    {
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "logs:CreateLogGroup",
            "Resource": "arn:aws:logs:us-east-1:XXXXXXXXXX:*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "logs:CreateLogStream",
                "logs:PutLogEvents"
            ],
            "Resource": [
                "arn:aws:logs:us-east-1:XXXXXXXXXX:log-group:/aws/lambda/<YOUR-LAMBDA-FUNCTION>r:*"
            ]
        }
    ]
    

    }

    可以在此处找到与此问题相关的更多信息: https://aws.amazon.com/pt/premiumsupport/knowledge-center/lambda-cloudwatch-log-streams-error/

    我这么说是因为我经常使用 docker 来实现与 lambda 的代码依赖关系,这是基于引入此功能时的第一个教程。

    https://aws.amazon.com/pt/blogs/aws/new-for-aws-lambda-container-image-support/

    希望这会有所帮助!

    请随意留下更多的 cmets。

    【讨论】:

    • 感谢您的回答!我也读过那个文档 sn-p,这就是为什么我对我现在所看到的感到惊讶。我已经完成了您已经提到的所有事情,在同一区域内的 CloudWatch 中有一个日志组,没有错误(根本没有日志)。我什至没有看到对我的函数的调用。对于您提到的第 (4) 点,在 Lambda 中运行的 Docker 映像是否需要任何特殊权限?我正在使用与我正在工作的另一个 Lambda 函数相同的角色,但它使用 zip 上传(而不是 Docker 映像)
    • 我还应该提到我的函数确实有日志记录,我可以在本地运行时看到它?
    • 因此,出于好奇,我决定使用 node.js sn-p 重新创建示例中的函数。因此,对于您的回复:不。您的 lambda 函数中最基本的权限会从执行中创建日志。但是,这是技巧部分。对于我的测试,我选择了 AWS 为我的 lambda 函数创建新角色的选项。 AWS 为我的 lambda 附加了一个特定的策略。再次检查我的编辑答案。我将添加生成的 json 策略。尝试添加此策略或使用 AWS 自动生成的新角色创建一个虚拟函数。
    • 另外,当我说“不”是因为默认情况下任何 lambda 函数都应该有权在 cloudwatch 中写入日志。如果您以前的角色没有附加此类政策,我的建议是添加它。 ?
    • 确实只是权限问题!我一定是通过从另一个 lambda 函数分配 AWS 角色而不是让角色自动创建来破坏某些东西,感谢您的帮助:)
    【解决方案2】:

    对于使用无服务器框架的特殊情况,我不得不使用以下方法来获取 cloudwatch 中的日志。

    import logging
    
    logger = logging.getLogger()
    logger.setLevel(logging.INFO)
    
    def lambda_handler(event: dict, context: dict) -> dict:
       logger.info(json.dumps(event))
       # ...
       return {'statusCode': 200, 'body': json_str}
    
    

    对于我来说,lambda 函数在 ecr docker 容器中运行。

    【讨论】:

      猜你喜欢
      • 2019-02-19
      • 2022-06-16
      • 2018-12-13
      • 1970-01-01
      • 2022-08-09
      • 1970-01-01
      • 1970-01-01
      • 2020-04-19
      • 2019-10-19
      相关资源
      最近更新 更多