使用Terraform在AWS Academy创建S3桶后出现AccessDenied错误如何解决
解决方案
方法1:配置Terraform跳过Object Lock配置读取(直接解决当前报错)
你遇到的报错是因为高版本的AWS Terraform Provider默认会自动拉取S3桶的Object Lock配置,AWS Academy环境的默认权限没有该接口的访问权限,你可以通过以下两种配置跳过该校验:
方案a:给S3资源添加忽略规则(推荐,仅影响当前桶)
修改你的S3资源代码如下:
resource "aws_s3_bucket" "b" { bucket = "my-tf-test-bucket" acl = "private" tags = { Name = "My bucket" Environment = "Dev" } # 忽略Object Lock配置的检测,跳过无权限的接口调用 lifecycle { ignore_changes = [ object_lock_configuration ] } }
方案b:全局关闭S3 Object Lock读取(适配所有S3资源)
在你的AWS Provider配置中添加如下参数:
provider "aws" { region = "你的AWS区域" # 替换为实际使用的区域,比如us-east-1 s3_use_object_lock = false }
方法2:配置Terraform使用AWS Academy的S3权限角色
你不需要将IAM角色绑定到S3桶,只需让Terraform运行时使用该有权限的角色发起AWS API请求即可,配置方式如下:
- 在AWS Provider中配置自动代入角色,将ARN替换为你AWS Academy中对应S3权限角色的实际ARN:
provider "aws" { region = "你的AWS区域" assume_role { role_arn = "arn:aws:iam::你的AWS账号ID:role/角色名称" } }
- 也可以先在本地AWS CLI配置文件中配置好该角色的凭证,运行Terraform前导出
AWS_PROFILE环境变量指向对应配置项即可。
注意:AWS Academy环境通常会限制角色代入的权限范围,如果你使用assume_role配置时报错,优先通过环境变量或者本地凭证文件的方式指定角色权限,提前用AWS CLI验证角色可正常操作S3后再运行Terraform。
内容的提问来源于stack exchange,提问作者user10384204
相关产品推荐
相关产品推荐

