Logstash通过Kinesis输入数据时遇DynamoDB权限错误求助
问题分析
从报错信息和配置来看,核心问题有三个:
- 凭证未生效:Logstash容器实际用的是EC2实例的SSM角色(
AmazonSSMRoleForInstancesQuickSetup),而非你本地~/.aws/credentials里的用户——Docker容器默认不会挂载本地AWS凭证文件,所以本地配置没起作用。 - 区域不匹配:Logstash配置指定Kinesis区域为
us-west-2,但报错里的DynamoDB表在us-west-1,Logstash的Kinesis输入会自动创建DynamoDB表记录消费 checkpoint,跨区域会引发权限和访问问题。 - 角色权限不足:当前使用的SSM角色没有被授予针对目标DynamoDB表的
dynamodb:DescribeTable权限。
解决方案
1. 让容器读取本地AWS凭证(可选,若不想用实例角色)
把本地~/.aws目录挂载到Docker容器内的对应路径,确保Logstash能读取到凭证:
docker run -v ~/.aws:/root/.aws [你的其他Logstash启动参数]
如果容器内运行Logstash的不是root用户,需调整挂载路径到对应用户的home目录,并确保权限正确。
2. 统一区域配置
将Logstash输入配置的region改为DynamoDB所在的us-west-1,避免跨区域访问:
input { kinesis { kinesis_stream_name => "logstash-kinesis" application_name => "logstash-kinesis" region => "us-west-1" # 修正为目标区域 codec => cloudwatch_logs } }
3. 给SSM角色补充DynamoDB权限
如果继续使用EC2实例的SSM角色,给AmazonSSMRoleForInstancesQuickSetup角色添加以下IAM策略(包含Logstash消费Kinesis所需的完整DynamoDB权限):
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "dynamodb:DescribeTable", "dynamodb:GetItem", "dynamodb:PutItem", "dynamodb:UpdateItem" ], "Resource": "arn:aws:dynamodb:us-west-1:xxxxxxxxxx:table/logstash-kinesis" } ] }
4. 验证权限并重启
IAM策略更新后等待几分钟让权限生效,然后重启Logstash容器,观察是否仍有报错。
内容的提问来源于stack exchange,提问作者luckybird
相关产品推荐
相关产品推荐

