Ill*_*ion 10 amazon-web-services aws-cloudformation amazon-cloudwatch
我有一个 lambda,它有一个日志组,例如 LG-1,其保留设置为永不过期(默认)。我需要将永不过期更改为 1 个月。我正在使用 CloudFormation 执行此操作。由于日志组已经存在,当我尝试使用模板中的更改再次部署 lambda 时:
LambdaFunctionLogGroup:
Type: 'AWS::Logs::LogGroup'
DependsOn: MyLambda
Properties:
  RetentionInDays: 30
  LogGroupName: !Join 
    - ''
    - - /aws/lambda/
      - !Ref MyLambda
更新失败并出现错误:
[日志组名称] 已存在。
一种可能的解决方案是删除日志组,然后使用新的更改再次创建它,如上所示,效果非常好。
但我需要在不删除日志组的情况下执行此操作,因为这将导致删除我以前拥有的所有日志。
有没有可能的解决方法?
spi*_*kus 11
@ttulka 回答:
“.. 不可能操纵已经存在于堆栈之外的 CF 资源。”
但实际上问题比这更普遍,并且适用于在堆栈内部创建的资源。它与 AWS CloudFormation 资源“替换策略”有关。对于某些资源,CloudFormation“更新”资源的方式是创建新资源,然后删除旧资源(这称为“替换”更新策略)。这意味着在一段时间内,您拥有两个相同类型的资源,并且同时存在许多相同的属性。但是,如果某个资源属性必须是唯一的,那么如果两个资源具有相同的该属性值,则它们不能同时存在,所以……CloudFormation 就会崩溃。
AWS::Logs::LogGroup.LogGroupName属性就是此类属性之一。AWS::CloudWatch::Alarm.AlarmName是另一个示例。
解决方法是取消设置名称,以便使用随机名称,执行更新,然后将名称设置回可预测的固定值并再次更新。
Rant:这是一个恼人的问题,实际上不应该存在。也就是说,AWS CF 应该足够聪明,不必使用这种奇怪的笨重的资源替换实现。但是...这就是适合您的 AWS CF...
我认为不可能操纵已经存在于堆栈之外的 CF 资源。
一种解决方法是更改 Lambda 的名称,例如my-lambda-v2将旧日志组与新日志组保留在一起。
1个月后您可以删除旧的。
| 归档时间: | 
 | 
| 查看次数: | 14754 次 | 
| 最近记录: |