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

时间:2019-04-20 09:37:15

标签: amazon-cloudformation

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

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

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

相关问题