如何为在 Cloudformation 中创建的 Lambda 设置 Cloudwatch 日志

Posted

技术标签:

【中文标题】如何为在 Cloudformation 中创建的 Lambda 设置 Cloudwatch 日志【英文标题】:How to setup Cloudwatch log for a Lambda created in Cloudformation 【发布时间】:2018-10-27 04:00:53 【问题描述】:

在 Cloudformation 中创建 Lambda 函数后,我希望能够在同一个 Cloudformation 脚本中设置 Cloudwatch 日志过期时间。

例如:

MyLambdaRole:
  Type: AWS::Iam::Role
    ...
    Properties:
      ...
      Policies:
        -
          PolicyName: "myPolicy"
          PolicyDocument:
            Version: "2012-10-17"
            Statement:
              -
                Effect: "Allow"
                Action:
                  - "logs:CreateLogGroup"
                  - "logs:CreateLogStream"
                  - "logs:PutLogEvents"
                Resource: "arn:aws:logs:*:*:*"

MyLambda:
  Type: AWS::Lambda::Function
  Properties:
    ...
    Role: !GetAtt [ MyLambdaRole, Arn ]

但是,CloudFormation 不允许修改/更新为 AWS 保留的日志:“以 AWS/ 开头的日志组是为 AWS 保留的。”

有解决办法吗?由于无法在Lambda resource creation 中设置日志名称,因此可能有一些方法可以在我找不到的角色定义中指定它。

【问题讨论】:

***.com/questions/39231592/… 【参考方案1】:

试试这个并使用RetentionInDays属性更改日志过期时间

LogGroup:
  Type: AWS::Logs::LogGroup
  Properties:
    LogGroupName: !Join ['/', ['/aws/lambda', !Ref MyLambda]]
    RetentionInDays: 7 # days

注意:如果日志组名称已经存在(如果MyLambda已经存在,则会存在),则会出现LogGroup创建失败的问题。解决方法是删除并创建堆栈。

【讨论】:

请注意,这对于API GW Logs 是不可能的:Do not manually API Gateway API log groups or streams...This is because API Gateway creates log groups or log streams for an API stage at the time when it is deployed 目前刚刚测试,如果Log不存在,至少可以创建API GW Log。 这就是我在那里添加if the log group name already exists的原因 是的,但是删除的解决方法只有在首先从堆栈中创建日志时才有效。该帖子是关于 modify/update Logs 的资源,该资源首先不在堆栈中,它是由 AWS 自动创建的,因此只需在测试手动删除日志然后创建堆栈后添加此评论。【参考方案2】:

不,没有。正如您所写,它是 AWS 拥有的一个日志组,您不能在角色中赋予自己比 AWS 允许的更多的权限。因此,您不能允许自己修改他们的日志组。

【讨论】:

这个不对,我可以通过awscli用put-retention-policy命令修改日志组。我想到目前为止似乎只有云形成是有限的。 从来没想过,谢谢。如果我有好的答案,我会再试一次【参考方案3】:

使用 AWS 无服务器应用程序模型,负责部署、角色和日志发件箱,您始终可以添加自定义 cloudformation 代码https://github.com/awslabs/serverless-application-model 他们已经准备好了很多例子。

【讨论】:

我找不到该工具在哪里执行我在问题中提出的具体问题,cloudwatch 日志的example 看起来很像直接使用 cloudformation 脚本 sam 模板负责 IAM 角色和 cloudwatch 日志的配置,这就是为什么看起来如此简单的原因 好的,你能在答案中添加一个例子吗?我找不到使用“到期天数”数字配置 cloudwatch 日志的位置。 它看起来像 SAM 中的 function resource,没有办法配置 lambda 日志组到期日期。

以上是关于如何为在 Cloudformation 中创建的 Lambda 设置 Cloudwatch 日志的主要内容,如果未能解决你的问题,请参考以下文章

将 Terraform 中创建的参数传递到 CloudFormation 时出现问题

如何为 Azure 移动应用表设置架构?

如何为我的 Lambda 函数创建可重复使用的 CloudFormation 模板?

在特定子网和安全组 cloudformation 中创建实例

AWS CloudFormation:如何为 Lambda 代码指定来自另一个 AWS 账户的存储桶?

为在 PHP 中创建的图像添加边框