Terraform配置DynamoDB流触发Lambda报Cannot access stream如何解决
问题修复方案
根因说明
你当前配置的IAM策略仅对DynamoDB表本身的ARN授权,但DynamoDB流的ARN与表ARN是相互独立的资源,触发Lambda需要的流相关操作权限没有覆盖到流资源,因此触发权限校验报错。
修复步骤
1. 拆分IAM权限,单独为流资源授权
将表操作权限和流操作权限拆分,流相关操作的授权对象指定为DynamoDB流的ARN,也可以使用表ARN加/stream/*通配符适配流资源路径。
修改后的IAM策略配置参考:
resource "aws_iam_role_policy" "dynamodb_policy" { policy = jsonencode( { Version = "2012-10-17", Statement = [ # 表操作权限 { Action = [ "dynamodb:GetItem", "dynamodb:PutItem", "dynamodb:UpdateItem", "dynamodb:Query" ], Effect = "Allow", Resource = aws_dynamodb_table.filenames.arn }, # 流操作权限 { Action = [ "dynamodb:GetRecords", "dynamodb:GetShardIterator", "dynamodb:DescribeStream", "dynamodb:ListShards", "dynamodb:ListStreams" ], Effect = "Allow", # 最小权限可直接用 aws_dynamodb_table.filenames.stream_arn Resource = "${aws_dynamodb_table.filenames.arn}/stream/*" } ] } ) role = aws_iam_role.processing_lambda_role.id }
2. (可选)添加资源依赖避免部署时序问题
如果存在IAM权限还未完成同步,Lambda事件源映射就提前创建的情况,可以为事件源映射添加依赖,确保权限配置完成后再创建触发器:
resource "aws_lambda_event_source_mapping" "allow_dynamodb_table_to_trigger_lambda" { event_source_arn = aws_dynamodb_table.filenames.stream_arn function_name = aws_lambda_function.trigger_stepfunction_lambda.arn starting_position = "LATEST" # 显式依赖IAM策略,确保权限先生效 depends_on = [aws_iam_role_policy.dynamodb_policy] }
3. 校验IAM角色信任策略
确认Lambda执行角色的信任策略允许lambda.amazonaws.com服务扮演该角色,示例信任策略配置如下:
resource "aws_iam_role" "processing_lambda_role" { name = "processing-lambda-role" assume_role_policy = jsonencode({ Version = "2012-10-17" Statement = [ { Action = "sts:AssumeRole" Effect = "Allow" Principal = { Service = "lambda.amazonaws.com" } } ] }) }
完成以上修改后重新执行terraform apply即可正常部署。
内容的提问来源于stack exchange,提问作者user13067694
相关产品推荐
相关产品推荐

