如何停止AWS Lambda函数以登录CloudWatch

Cla*_*zzi 12 amazon-web-services aws-lambda

如果您拥有大量的AWS Lambda登录CloudWatch可能会成为巨大的隐藏成本,因为无法告诉AWS停止登录CloudWatch平台.我发现这样做的唯一方法是管理自定义IAM策略(与每个lambda关联)并明确拒绝访问日志:... actions:

{
        "Sid": "DisableAllLogs",
        "Resource": "*",
        "Action": [
            "logs:CreateLogGroup",
            "logs:CreateLogStream",
            "logs:PutLogEvents"
        ],
        "Effect": "Deny"
}
Run Code Online (Sandbox Code Playgroud)

现在我正在尝试对策略进行细化,只允许一些lambda记录.为此,我正在使用策略的Condition参数:

{
        "Sid": "EnableLogsForWantedLambdaTriggers",
        "Resource": "*",
        "Condition": {
            "ArnEquals": {
                "aws:SourceArn": "arn:aws:lambda:REGION:ACCOUNT-ID:function:FUNCTION-NAME"
            }
        },
        "Action": [
            "logs:CreateLogGroup",
            "logs:CreateLogStream",
            "logs:PutLogEvents"
        ],
        "Effect": "Allow"
}
Run Code Online (Sandbox Code Playgroud)

但是这样就没有日志发送到CloudWatch.我认为源ARN是错误的,但我无法找到正确的.

有线索吗?

Cla*_*zzi 4

我发现的一个可能的解决方法是将策略重点放在资源上,而不是操作的调用者 ARN 上。因此,如果我现在使用 lambda logGroupNamelogStreamName(现在总是这些),我可以仅允许对记录器创建的资源执行操作,遵循记录的命名约定

{
  "Version": "2012-10-17",
  "Statement": [
    {
        "Sid": "EnableLogsForWantedLambdaTriggers",
        "Resource": [
            "arn:aws:logs:<region>:<ID>:log-group:<logGroupName>:log-stream:<logStreamName>"
        ],
        "Action": [
            "logs:CreateLogGroup",
            "logs:CreateLogStream",
            "logs:PutLogEvents"
        ],
        "Effect": "Allow"
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

通过这种方式,我可以选择启用所需的 lamda 和/或(作用于流名称)选定的函数版本($LATEST、1、2、...)。

例如,接下来将仅启用该功能的开发版本,而忽略生产版本:

{
  "Version": "2012-10-17",
  "Statement": [
    {
        "Sid": "EnableLogsForWantedLambdaTriggers",
        "Resource": [
            "arn:aws:logs:<region>:<ID>:log-group:<logGroupName>:log-stream:*/*/*/[$LATEST]*"
        ],
        "Action": [
            "logs:CreateLogGroup",
            "logs:CreateLogStream",
            "logs:PutLogEvents"
        ],
        "Effect": "Allow"
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)