GitHub Actions部署Terraform至S3时遇DynamoDB权限拒绝错误求助
问题背景
我正在学习Udemy的《DevOps Deployment Automation with Terraform, AWS and Docker》项目,通过GitHub Actions部署TF文件到S3 bucket时遇到权限错误。已检查iam.tf和variables.tf,用terraform output获取的凭证也没问题,尝试过修改TF文件、更换凭证、重新登录AWS SSO CLI、检查AWS策略等操作,仍未解决。
GitHub Actions报错信息:
operation error DynamoDB: PutItem, https response error StatusCode: 400, RequestID: 0NTHCFGF856DKB38SVBASDQQKVVV4KQNSO5AEMVJF66Q9ASUAAJG, api error AccessDeniedException: User: arn:aws:iam::891376961380:user/recipe-app-api-cd is not authorized to perform: dynamodb:PutItem on resource: arn:aws:dynamodb:us-east-1:891376961380:table/devops-recipe-app-api-terraform-lock because no identity-based policy allows the dynamodb:PutItem action
Unable to retrieve item from DynamoDB table "devops-recipe-app-api-terraform-lock": operation error DynamoDB: GetItem, https response error StatusCode: 400, RequestID: 7I0K14A5GSCKNDA99PARPF3F63VV4KQNSO5AEMVJF66Q9ASUAAJG, api error AccessDeniedException: User: arn:aws:iam::891376961380:user/recipe-app-api-cd is not authorized to perform: dynamodb:GetItem on resource: arn:aws:dynamodb:us-east-1:891376961380:table/devops-recipe-app-api-terraform-lock because no identity-based policy allows the dynamodb:GetItem action
解决步骤
1. 为IAM用户添加DynamoDB权限策略
直接给recipe-app-api-cd用户附加包含所需DynamoDB操作的身份型策略,策略内容如下:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "dynamodb:GetItem", "dynamodb:PutItem", "dynamodb:DeleteItem", "dynamodb:UpdateItem" ], "Resource": "arn:aws:dynamodb:us-east-1:891376961380:table/devops-recipe-app-api-terraform-lock" } ] }
如果用Terraform管理IAM权限,在iam.tf的用户权限策略块中添加上述DynamoDB操作声明。
2. 确认Terraform状态锁配置的资源匹配
检查Terraform后端配置(通常在backend.tf或主TF文件中),确保DynamoDB表名称与报错中的完全一致,避免资源ARN不匹配导致权限失效。示例后端配置:
terraform { backend "s3" { bucket = "your-s3-bucket-name" key = "terraform/state" region = "us-east-1" dynamodb_table = "devops-recipe-app-api-terraform-lock" } }
3. 验证IAM策略的生效逻辑
- 确保添加的是身份型策略(直接附加到用户/用户组/角色),而非资源型策略(附加到DynamoDB表),报错明确指出缺少身份型策略的权限。
- 检查是否存在其他**拒绝策略(Deny)**覆盖了允许权限,IAM中拒绝策略优先级高于允许策略。
4. 刷新GitHub Actions中的AWS凭证
确认GitHub Secrets中存储的AWS凭证是有效的:
- 若使用AWS SSO,确保临时凭证未过期,可重新生成后更新到GitHub Secrets。
- 若使用IAM用户长期密钥,确认密钥未被禁用或过期。
内容的提问来源于stack exchange,提问作者Dmytro Cherniavskyi

