2016-08-29 54 views
4

如果您拥有大量AWS账户,则Lambda登录CloudWatch可能会成为巨大的隐藏成本,因为无法告知AWS停止在CloudWatch平台上登录。 我发现做到这一点的唯一方法是管理自定义IAM策略(与每一个拉姆达相关)和explicitally拒绝访问日志:...操作:如何停止AWS Lambda功能以登录CloudWatch

{ 
     "Sid": "DisableAllLogs", 
     "Resource": "*", 
     "Action": [ 
      "logs:CreateLogGroup", 
      "logs:CreateLogStream", 
      "logs:PutLogEvents" 
     ], 
     "Effect": "Deny" 
} 

现在我正在努力细化政策,让只有一些lambda登录。要做到这一点我使用的政策条件参数:

{ 
     "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" 
} 

但这种方式没有日志发送到CloudWatch的。我认为源ARN是错误的,但我无法找到正确的。

任何线索?

+0

我假设你在你的CloudFormation创建拉姆达呢?如果是这样,你应该能够用'“Fn :: GetAtt”获取正确的ARN:[“FUNCTION-NAME”,“Arn”]' – Squirrel

+0

我假设删除日志或在一段时间后存档以便存钱被看着。在做所有的功能日志之前,我会这样做,然后选择某些功能并拒绝对它们的访问。 – arjabbar

+0

不幸的是,大部分成本与CloudWatch调用相关,而不是日志存储大小,因此将过期日期设置为1天是不够的 –

回答

0

我发现的一种可能的解决方法是将策略专注于操作的调用方ARN上的资源。所以,如果我现在拉姆达logGroupNamelogStreamName(我现在总是这些)我可以只允许在该记录器创建资源的动作,继documented naming convention

{ 
    "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" 
    } 
    ] 
} 

在这样我可以选择启用想要的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" 
    } 
    ] 
}