【问题标题】:Cloudformation fails to create LogStream for newly created LogGroupCloudformation 无法为新创建的 LogGroup 创建 LogStream
【发布时间】:2019-09-10 08:01:51
【问题描述】:

我有一个非常简单的 Cloudformation 脚本,它只是尝试创建 CloudWatch LogGroup 和关联的 LogStream -

AWSTemplateFormatVersion: '2010-09-09'
Description: Hello World
Parameters:
  AppName:
    Type: String
  EnvName:
    Type: String
Resources:
  AppLogGroup:
    Properties: 
      LogGroupName:
        Fn::Join:
        - '-'
        - - Ref: AppName
          - Ref: EnvName
      RetentionInDays: 7
    Type: AWS::Logs::LogGroup
  AppLogStream: 
    Properties: 
      LogGroupName:
        Fn::Join:
        - '-'
        - - Ref: AppName
          - Ref: EnvName
      LogStreamName:
        Fn::Join:
        - '-'
        - - Ref: AppName
          - Ref: EnvName
          - info
    Type: AWS::Logs::LogStream

现在这在大约 50% 的时间内成功部署 - 但对于另外 50%,虽然 LogGroup 创建正常,但 LogStream 的创建失败并显示 The specified log group does not exist;并且整个堆栈回滚。

我认为这是因为 AWS 内的“最终一致性”出现某种故障,但有点惊讶的是,LogStream 的创建不能等到 LogGroup 完成。

我做错了吗?我应该在我的应用程序而不是堆栈中创建 LogStreams 吗?当您发送第一条消息(怀疑)时,是否会自动创建 LogStream?这里有解决方法吗?

TIA。

【问题讨论】:

  • 尝试将 DependsOn: AppLogGroup 声明添加到 AppLogStream 资源。它将等待依赖资源完成。

标签: amazon-cloudformation


【解决方案1】:

尝试将 DependsOn: AppLogGroup 属性添加到 AppLogStream 资源。它将等待相关资源完成。

https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-attribute-dependson.html

【讨论】:

  • 谢谢!听起来就是这样
  • 奇怪的是我以前从未使用过这个。创建 CodeDeploy 部署组时,无需等待 CodeDeploy 应用程序。创建 EC2 实例时,无需等待 vpc/安全组等。为什么 CloudWatch 如此挑剔?
【解决方案2】:

您可以使用!Ref 代替手动将字符串连接在一起以引用日志流中的日志组。这样,您还可以获得日志流对日志组的隐式依赖关系,这可确保 CloudFormation 在创建日志组后创建日志流。虽然您可以手动指定 DependsOn 来达到同样的效果,但使用 !Ref 是 AWS 建议的最佳实践方式。看起来像:

AWSTemplateFormatVersion: '2010-09-09'
Description: Hello World
Parameters:
  AppName:
    Type: String
  EnvName:
    Type: String
Resources:
  AppLogGroup:
    Properties: 
      LogGroupName:
        Fn::Join:
        - '-'
        - - Ref: AppName
          - Ref: EnvName
      RetentionInDays: 7
    Type: AWS::Logs::LogGroup
  AppLogStream: 
    Properties: 
      LogGroupName: !Ref AppLogGroup
      LogStreamName:
        Fn::Join:
        - '-'
        - - Ref: AppName
          - Ref: EnvName
          - info
    Type: AWS::Logs::LogStream

【讨论】:

  • 我也收到了消息“指定的日志组不存在”,它也没有任何区别。在我将 LogStreamName 的完全相同的属性移动到引用后,它可以正常工作。 Tnx
猜你喜欢
  • 1970-01-01
  • 2020-03-11
  • 2020-03-27
  • 2019-08-31
  • 2019-12-13
  • 2021-02-17
  • 2019-05-20
  • 2019-09-21
  • 2021-04-23
相关资源
最近更新 更多