【问题标题】:Why can't I see logs in my lambda function?为什么在我的 lambda 函数中看不到日志?
【发布时间】:2018-08-21 05:26:27
【问题描述】:

我一直在徒劳地尝试查看我的 lambda 函数的日志。不管我看到什么:

需要明确的是,lambda 函数运行正常。我根本看不到日志。

我已多次重新创建该函数,以确保不是我不小心使用了禁用日志记录的设置。

我的步骤:

  1. 从 AWS Lambda 函数页面,创建一个新函数。我使用的是nodejs 8.10,但即使我使用的是6.x版本,它似乎也失败了。
  2. 使用我的函数(包括 node_modules 目录、package.json 和 package-lock.json)将 zip 文件上传到 S3 到 testbucket,文件名为 thumbnails.zip。
  3. 使用此命令从 S3 发布我的 lambda 函数:aws lambda update-function-code --function-name transcode-v2 --s3-bucket mytestbucket --s3-key thumbnails.zip。
  4. 我可以使用示例数据和测试按钮来测试我的功能。
  5. 我也可以从 CLI 调用它,它似乎“工作”(因为它运行)

当我访问云日志时,我总是看到这条消息:There was an error loading Log Streams. Please try again by refreshing this page. 我已经尝试了两次重新创建该函数,但这并没有解决它。

有人知道这里有什么问题吗?该函数似乎在测试中工作(意思是,我在测试日志对话框中看到日志),当我从命令行调用时。但是,除了该错误之外,没有任何内容进入云日志记录页面。

我可以看到正在从 AWS 触发调用。

【问题讨论】:

  • 嗯,您检查过权限问题吗?即确保您的角色有权写入 CWL
  • 嗯,好的。我会假设 lambda 函数已经得到了它,但它不会得到它是有道理的。我会检查的。
  • 因此,如果我向用户附加权限,我看不到任何 CWL。此权限是否命名为其他名称?我在用户的“角色”部分。那是正确的地方吗?
  • 这对我来说(作为 AWS 的新手,虽然...)看起来不像是权限问题。看起来 AWS 在某处存在配置错误,因为 AWS 控制台无法加载日志,而不是说“进程无法写入日志......”(我想无论如何都不会报告)。我尝试创建“日志流”并收到此错误:There was an error creating your Log Stream. Please try again.。我不知道我需要创建什么日志流名称。
  • 您的 Lambda 函数需要 AWSLambdaBasicExecutionRole 策略或等效策略,您可以在此处查看:gist.github.com/gene1wood/55b358748be3c314f956(搜索 AWSLambdaBasicExecutionRole)。

标签: amazon-web-services amazon-s3 aws-lambda aws-cli


【解决方案1】:

创建 AWS 角色时,您必须提供将由 Lambda 函数使用的 IAM 角色。与角色关联的权限将授予对 Lambda 函数所需的 AWS 服务和资源的访问权限。

有一个默认的AWSLambdaBasicExecutionRole 提供:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "logs:CreateLogGroup",
                "logs:CreateLogStream",
                "logs:PutLogEvents"
            ],
            "Resource": "*"
        }
    ]
}

这些权限允许 Lambda 函数将日志信息写入 Amazon CloudWatch Logs。

还有其他可用的角色,例如AWSLambdaExecute:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "logs:*"
            ],
            "Resource": "arn:aws:logs:*:*:*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:PutObject"
            ],
            "Resource": "arn:aws:s3:::*"
        }
    ]
}

因此,要么使用这些预先提供的角色之一,要么为您的 Lambda 函数正在使用的角色添加类似的权限。

【讨论】:

  • 谢谢约翰。我的 lambda 执行角色设置为“现有角色”->“转码器”。如果我访问 IAM,然后转到“转码器”的“角色”,我会看到两个策略:“AWSLambdaExecute”和“AmazonS3FullAccess”(均列为“AWS 托管策略”)。 lambda 执行策略似乎确实表明该策略允许对日志资源进行写访问。但是,现在我看到“此日志组没有任何日志流”。当我在“Streams for /aws/lambda/transcode-v2”访问我的日志组时。我需要创建“日志流”吗?我需要连接我的 lambda 以登录到该流吗?
  • 如果我为我的 lambda 单击名为“Amazon CloudWatch Logs”的输出,这对我来说似乎设置正确。它说它是从上面列出的托管策略中采购的。
  • 其实不,是不对的。我看到它以某种方式获得了另一个 lambda 的权限:Allow: arn:aws:logs:us-west-2:798408881039:log-group:/aws/lambda/transcode-upon-upload:*。 transcode-upon-upload 是我正在使用的另一个 lambda。
  • 我在“转码器”角色策略中看不到该引用。那很奇怪。我正在使用亚马逊托管策略。我确实粘贴了我自己的政策,但这些政策已从角色中删除。
猜你喜欢
  • 2020-11-22
  • 2023-01-15
  • 1970-01-01
  • 2014-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-09
相关资源
最近更新 更多