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