我有一个非常简单的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。
您可以使用!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
尝试将DependsOn:AppLogGroup属性添加到AppLogStream资源。它将等待依赖资源完成。
见https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-attribute-dependson.html