You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Terraform调用AWS接口报403无权限,但AWS CLI执行正常求助

问题:Terraform执行EC2子网查询报403权限错误,但AWS CLI可正常执行

我是Terraform新手,执行简单的子网查询操作时遇到无权限错误,但运行等效的AWS CLI命令能得到预期结果。操作前已通过aws sso login完成认证,也确认过所有工具都是最新版本,考虑过降级Terraform、hashicorp/aws provider或AWS CLI排查bug,但不清楚合法兼容版本,暂时假设当前版本兼容。


AWS CLI执行结果

% aws ec2 describe-subnets --subnet-ids subnet-XXXX --region "us-west-2"
{
    "Subnets": [
        {
            "AvailabilityZone": "us-west-2a",
            "AvailabilityZoneId": "XXX",
            "AvailableIpAddressCount": XXX,
            "CidrBlock": "XXX.XXX.XXX.XXX/XX",
            "DefaultForAz": false,
            "MapPublicIpOnLaunch": false,
            "MapCustomerOwnedIpOnLaunch": false,
            "State": "available",
            "SubnetId": "subnet-XXXX",
            "VpcId": "vpc-XXXX",
            "OwnerId": "XXXX",
            "AssignIpv6AddressOnCreation": false,
            "Ipv6CidrBlockAssociationSet": [],
            "Tags": [
                {
                    "Key": "Name",
                    "Value": "XXXXX"
                }
            ],
            "SubnetArn": "arn:aws:ec2:us-west-2:XXXXX:subnet/subnet-XXXXX",
            "EnableDns64": false,
            "Ipv6Native": false,
            "PrivateDnsNameOptionsOnLaunch": {
                "HostnameType": "ip-name",
                "EnableResourceNameDnsARecord": false,
                "EnableResourceNameDnsAAAARecord": false
            }
        }
    ]
}

Terraform执行结果

% terraform plan
data.aws_subnet.private1: Reading...

Planning failed. Terraform encountered an error while generating this plan.

╷
│ Error: reading EC2 Subnet: operation error EC2: DescribeSubnets, https response error StatusCode: 403, RequestID: XXX-XX-XX-XX-XXXXXXX, api error UnauthorizedOperation: You are not authorized to perform this operation. User: arn:aws:iam::XXXXXX:user/XX@XXX is not authorized to perform: ec2:DescribeSubnets with an explicit deny in an identity-based policy
│ 
│   with data.aws_subnet.private1,
│   on temp.tf line 21, in data "aws_subnet" "private1":
│   21: data "aws_subnet" "private1" {

版本信息

% terraform version
Terraform v1.9.3
on darwin_amd64
+ provider registry.terraform.io/hashicorp/aws v5.61.0
% aws --version 
aws-cli/2.17.26 Python/3.11.9 Darwin/23.5.0 exe/x86_64

Terraform配置文件(temp.tf)

terraform {
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 5.61"
    }
  }
  required_version = "~> 1.9.3"
}

provider "aws" {
  region = var.aws_region
  profile = "default"
}

variable "aws_region" {
  type = string
  default = "us-west-2"
}

data "aws_subnet" "private1" {
  id = "subnet-XXXX"
}

AWS配置文件(~/.aws/config)

[default]
aws_access_key_id = XXXXX
aws_secret_access_key = XXXXX
region = us-west-2
sso_session = default
sso_account_id = XXXXX
sso_role_name = XXX

[sso-session default]
sso_start_url = https://XXXX.awsapps.com/start
sso_region = us-west-2
sso_registration_scopes = sso:account:access

排查与解决思路

1. 清理AWS配置文件中的冲突凭证

你的~/.aws/config的[default]段同时配置了长期密钥(aws_access_key_id/aws_secret_access_key)和SSO参数,Terraform会优先使用硬编码的长期密钥,而不是SSO生成的临时凭证(AWS CLI会自动优先选择SSO会话)。

解决方法:删除[default]段中的aws_access_key_id和aws_secret_access_key两行,保留SSO相关配置:

[default]
region = us-west-2
sso_session = default
sso_account_id = XXXXX
sso_role_name = XXX

[sso-session default]
sso_start_url = https://XXXX.awsapps.com/start
sso_region = us-west-2
sso_registration_scopes = sso:account:access

2. 验证Terraform使用的身份

执行以下命令确认当前default profile对应的AWS身份:

aws sts get-caller-identity --profile default

对比输出的ARN和Terraform错误信息中的ARN(arn:aws:iam::XXXXXX:user/XX@XXX),如果不一致,说明Terraform未使用SSO角色身份,按第一步修改配置即可。

3. 刷新SSO凭证

执行命令重新获取SSO临时凭证,再测试Terraform:

aws sso login --profile default
terraform plan

4. 版本兼容性确认

当前使用的Terraform v1.9.3和AWS Provider v5.61.0完全支持SSO认证,无需降级,只要配置正确即可正常使用。


内容的提问来源于stack exchange,提问作者Jimbotini

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 00:27:35