使用Terraform创建专属IAM用户访问S3存储桶出现权限拒绝问题
问题根因与解决方案
1. aws iam get-policy查询失败原因
你执行命令时输入的策略ARN拼写错误:
- 策略列表返回的正确ARN后缀是
AllowUsercsgoserverAccessTocsgofiles - 你执行命令时少写了末尾的
s,变成了AllowUsercsgoserverAccessTocsgofile,修正ARN即可正常查询。
2. aws iam get-user-policy查询失败原因
这里涉及两个IAM策略的基础概念:
aws_iam_user_policy资源创建的是内联策略,直接绑定在用户身上,不属于托管策略范畴- 你当前user.tf配置中,内联策略的
name参数设置为用户名csgoserver,而非你查询时用的AllowUsercsgoserverAccessTocsgofiles,所以查询返回不存在。
另外你在list-attached-user-policies中看到的绑定策略是独立的托管策略,并非当前Terraform代码生成的资源,属于之前操作的残留配置。
3. S3上传AccessDenied原因
你的IAM权限配置的资源范围不完整:
当前权限只覆盖了存储桶本身的ARN arn:aws:s3:::${var.bucket_name},仅允许执行存储桶级别的操作(比如查看桶列表),而PutObject等对象操作需要匹配桶内对象的ARN,需要在资源列表中新增arn:aws:s3:::${var.bucket_name}/*。
修正后的Terraform配置参考
resource "aws_iam_user" "s3user" { name = var.user_name force_destroy = true } data "aws_iam_policy_document" "default" { statement { sid = "AllowUser${var.user_name}AccessTo${var.bucket_name}" actions = ["s3:*"] # 新增对象级资源路径 resources = [ "arn:aws:s3:::${var.bucket_name}", "arn:aws:s3:::${var.bucket_name}/*" ] effect = "Allow" } } resource "aws_iam_user_policy" "s3user_policy" { # 修改策略名称方便后续查询 name = "AllowUser${var.user_name}AccessTo${var.bucket_name}" user = aws_iam_user.s3user.name policy = data.aws_iam_policy_document.default.json } resource "aws_iam_access_key" "s3user_ak" { user = aws_iam_user.s3user.name }
验证步骤
- 执行
terraform apply更新配置 - 清理之前残留的托管策略绑定:
aws iam detach-user-policy --user-name csgoserver --policy-arn arn:aws:iam::370179080679:policy/AllowUsercsgoserverAccessTocsgofiles - 验证内联策略:
aws iam get-user-policy --user-name csgoserver --policy-name AllowUsercsgoserverAccessTocsgofiles - 测试S3上传操作
内容的提问来源于stack exchange,提问作者sebastian_t
相关产品推荐
相关产品推荐

