2016-08-29 55 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" 
    } 
    ] 
}