繁体   English   中英

如何从在 AWS Lambda 函数中运行的 Docker 映像获取日志?

[英]How to get logs from Docker image running in AWS Lambda function?

我试图调试是一个使用泊坞窗图像的AWS lambda表达式,如所描述这里 我正在使用股票 AWS Python 图像: public.ecr.aws/lambda/python:3.8 : 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 函数?

因此,使用 lambda 与 zip 或 s3 格式的代码兼容的 docker 图像与使用 docker 图像没有技术差异。 至于日志,根据 AWS 文档(这是直接来自文档的描述):

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

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

因此,最基本的代码将在您的 lambda 中进行某种日志记录。 在这种情况下,我建议进行故障排除

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

拉姆达

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

3 - 如果有任何错误表明 cloudwatch 的组日志不存在或函数中的组日志不存在,请直接在控制台中检查 lambda 的配置,或者,如果您使用的是无服务器等框架或 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/

希望这有帮助!

随意留下其他评论。

对于使用无服务器框架的特殊情况,我必须使用以下内容来获取 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 容器内运行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM