如何从 AWS Lambda 函数中的 Docker 图像 运行 获取日志?
How to get logs from Docker image running in AWS Lambda function?
我正在尝试调试使用 Docker 图像的 AWS Lambda 函数,如 here 所述。我正在使用股票 AWS Python 图片:public.ecr.aws/lambda/python:3.8
我可以按照上述 link 中描述的步骤在本地测试我的功能,它工作得很好:
docker run -p 9000:8080 hello-world
,然后是另一个终端 window 中的 curl -XPOST "http://localhost:9000/2015-03-31/functions/function/invocations" -d '{}'
正确执行了我期望的功能。然而,一旦这是 Lambda 中的 运行,在成功标记图像并将其推送到 AWS ECR 之后,该函数似乎无法正常工作,我无法找到任何日志来调试 failed/missing处决。
对于这些日志的存储位置,我有点不知所措,and/or 我可能缺少什么配置才能将这些日志导入 CloudWatch 或类似的东西。我在哪里可以找到这些日志来进一步调试我的 lambda 函数?
因此,使用 docker 图像与 lambda compated 到 zip 或 s3 中的代码没有技术差异。至于日志,根据 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 容器内运行。
我正在尝试调试使用 Docker 图像的 AWS Lambda 函数,如 here 所述。我正在使用股票 AWS Python 图片:public.ecr.aws/lambda/python:3.8
我可以按照上述 link 中描述的步骤在本地测试我的功能,它工作得很好:
docker run -p 9000:8080 hello-world
,然后是另一个终端 window 中的 curl -XPOST "http://localhost:9000/2015-03-31/functions/function/invocations" -d '{}'
正确执行了我期望的功能。然而,一旦这是 Lambda 中的 运行,在成功标记图像并将其推送到 AWS ECR 之后,该函数似乎无法正常工作,我无法找到任何日志来调试 failed/missing处决。
对于这些日志的存储位置,我有点不知所措,and/or 我可能缺少什么配置才能将这些日志导入 CloudWatch 或类似的东西。我在哪里可以找到这些日志来进一步调试我的 lambda 函数?
因此,使用 docker 图像与 lambda compated 到 zip 或 s3 中的代码没有技术差异。至于日志,根据 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 容器内运行。