使用CloudFormation将CloudWatch Logs日志转存S3遇ARN解析错误求助
问题排查:CloudWatch Logs Destination 解析ARN错误
我希望通过CloudFormation将EC2日志从CloudWatch Logs发送至S3,但遇到如下错误:
Error parsing ARN from given role or target (Service: AWSLogs; Status Code: 400; Error Code: InvalidParameterException; Request ID: 357e76a9-5ade-48a6-8206-84092390602f; Proxy: null)
不清楚下方代码哪部分有问题,恳请协助排查:
现有配置
S3桶配置
Type: 'AWS::S3::Bucket' Properties: BucketName: vocsample01 AccessControl: Private
CloudWatch Logs Destination配置
Type: 'AWS::Logs::Destination' Properties: DestinationName: vocsample01 DestinationPolicy: > {"Version": "2012-10-17","Statement": [ {"Effect": "Allow","Action": "logs:*","Resource": "*"}]} RoleArn: arn:aws:iam::009150350157:role/vocsample TargetArn: arn:aws:s3:::vocsample0
错误原因分析
TargetArn拼写错误
你的S3桶名称是vocsample01,但CloudWatch Logs Destination中的TargetArn写的是arn:aws:s3:::vocsample0(末尾少了数字1),ARN与实际桶不匹配,导致解析失败。目标类型不支持
AWS::Logs::Destination仅支持将日志发送到Kinesis数据流、Kinesis Data Firehose或Lambda函数,不支持直接发送到S3桶。即使修正ARN拼写,也无法实现日志转存S3的需求。
修复方案
方案:通过Kinesis Data Firehose中转实现日志转存S3
正确的流程是:CloudWatch Logs → Kinesis Data Firehose → S3,以下是对应的CloudFormation配置示例:
1. 保留S3桶配置
S3Bucket: Type: 'AWS::S3::Bucket' Properties: BucketName: vocsample01 AccessControl: Private
2. 创建Kinesis Data Firehose流
FirehoseDeliveryStream: Type: 'AWS::KinesisFirehose::DeliveryStream' Properties: DeliveryStreamName: vocsample-firehose S3DestinationConfiguration: BucketARN: !GetAtt S3Bucket.Arn RoleARN: arn:aws:iam::009150350157:role/firehose-s3-role # 需配置Firehose写入S3的权限 BufferingHints: IntervalInSeconds: 300 SizeInMBs: 5
3. 创建CloudWatch Logs订阅过滤器
用AWS::Logs::SubscriptionFilter替代Destination,实现日志实时转发到Firehose:
CWLogsSubscriptionFilter: Type: 'AWS::Logs::SubscriptionFilter' Properties: LogGroupName: '/aws/ec2/your-ec2-log-group' # 替换为你的EC2日志组名称 FilterPattern: '' # 按需设置日志过滤规则,留空表示转发所有日志 DestinationArn: !GetAtt FirehoseDeliveryStream.Arn RoleArn: arn:aws:iam::009150350157:role/cwlogs-firehose-role # 需配置CloudWatch Logs发送到Firehose的权限
关键权限配置说明
- Firehose角色需包含
s3:PutObject权限,允许向目标S3桶写入数据。 - CloudWatch Logs角色需包含
firehose:PutRecordBatch权限,允许向目标Firehose流发送日志数据。
内容的提问来源于stack exchange,提问作者kotonoha
相关产品推荐
相关产品推荐

