Cloudformation无法为新创建的LogGroup创建LogStream

问题描述 投票:1回答:2

我有一个非常简单的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完成。

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

TIA。

amazon-cloudformation
2个回答
1
投票

您可以使用!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

0
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.