Terraform 简单脚本显示“错误:启动源实例时出错:VPCIdNotSpecified:此用户没有默认 VPC”

问题描述 投票:0回答:7

开始使用 Terraform。我正在尝试使用以下 .tf 文件配置 EC2 实例。我的账户中已经有一个默认 VPC,位于我正在尝试配置 EC2 实例的可用区。

# Terraform Settings Block
 terraform {
      required_providers {
         aws = {
             source  = "hashicorp/aws"
             #version = "~> 3.21" # Optional but recommended in production
        }
     }
 }

  # Provider Block
  provider "aws" {
        profile = "default"
        region  = "us-east-1"
  }

  # Resource Block
  resource "aws_instance" "ec2demo" {
           ami           = "ami-c998b6b2" 
           instance_type = "t2.micro"
  }

我执行以下 Terraform 命令。

  1. 地形初始化
  2. 地形计划
  3. 地形适用

aws_instance.ec2demo:创建...

错误:启动源实例时出错:VPCIdNotSpecified:此用户没有默认 VPC。仅 EC2-Classic 和默认 VPC 支持 GroupName。 状态代码:400,请求 ID:04274b8c-9fc2-47c0-8d51-5b627e6cf7cc

在 ec2-instance.tf 第 18 行,资源“aws_instance”“ec2demo”中: 18:资源“aws_instance”“ec2demo”{

terraform terraform-provider-aws
7个回答
24
投票

如错误所示,它在 us-east-1 区域中找不到默认 VPC。 您可以在 VPC 中提供

subnet_id
来创建实例,如下所示。

 resource "aws_instance" "ec2demo" {
           ami           = "ami-c998b6b2" 
           instance_type = "t2.micro"
           subnet_id = "subnet-0b1250d733767bafe"
  }

2
投票

截至目前,如果 AWS 账户中有任何可用的默认 VPC,则可以使用 terraform 资源

aws_instance
创建实例,无需任何网络规范输入。

官方 AWS-terraform 示例: https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/instance#basic-example-using-ami-lookup

resource "aws_instance" "web" {
  ami           = data.aws_ami.ubuntu.id ## Or use static AMI ID for testing.
  instance_type = "t3.micro"
}

错误消息:

Error: Error launching source instance: VPCIdNotSpecified: No default VPC for this user.
指出 EC2 实例在需要创建实例的 terraform 代码中未找到任何网络配置。

这可能是因为您的 AWS 账户中缺少默认 VPC,并且您似乎没有将任何网络配置输入传递给 terraform 资源。

基本上,你有两种方法可以解决这个问题

resource "aws_vpc" "my_vpc" {
  cidr_block = "172.16.0.0/16"

  tags = {
    Name = "tf-example"
  }
}

resource "aws_subnet" "my_subnet" {
  vpc_id            = aws_vpc.my_vpc.id
  cidr_block        = "172.16.10.0/24"
  availability_zone = "us-west-2a"

  tags = {
    Name = "tf-example"
  }
}

resource "aws_network_interface" "foo" {
  subnet_id   = aws_subnet.my_subnet.id
  private_ips = ["172.16.10.100"]

  tags = {
    Name = "primary_network_interface"
  }
}

resource "aws_instance" "foo" {
  ami           = "ami-005e54dee72cc1d00" # us-west-2
  instance_type = "t2.micro"

  network_interface {
    network_interface_id = aws_network_interface.foo.id
    device_index         = 0
  }

  credit_specification {
    cpu_credits = "unlimited"
  }
}

将网络配置传递到 ec2 实例的另一种方法是按照其他人的建议,在 aws_instance 资源中使用

subnet_id


1
投票

您是否有可能删除了默认 vpc,如果您删除了,您可以重新创建,转至 VPC 部分 -> 我的 Vpc -> 在右上角,您将看到一个名为“操作”的下拉列表,单击并选择创建默认 vpc


1
投票

我仅在 AWS 中创建默认 VPC

  1. AWS VPC
  2. 行动
  3. 创建默认VPC

已完成,您现在再试一次

  1. 地形计划
  2. 地形适用

1
投票

编辑

main.tf
文件并添加:

subnet_id = "subnet-***********"

您可以从VPC仪表板>子网获取


0
投票

正如 AWS 去年发布的那样

On August 15, 2022 we expect all migrations to be complete, with no remaining EC2-Classic resources present in any AWS account.
从现在开始,您在创建任何新资源时将需要指定
subnet_id
并在创建时在您的内部声明它。 示例:

resource "aws_instance" "test" {
  ami                    = "ami-xxxxx"
  instance_type          = var.instance_type
  vpc_security_group_ids = ["sg-xxxxxxx"]
  subnet_id              = "subnet-xxxxxx"

0
投票

这对我有用:

首先,我在顶部栏上搜索 VPC 服务,然后在左侧菜单中选择子网(我有几个子网),然后将子网 ID 粘贴到字段中,最后运行 terraform apply 并且它可以工作。

resource "aws_instance" "my_iac_instance" {
ami= "ami-0e731c8a588258d0d"
instance_type = "t2.micro"
subnet_id = "subnet-***************"
tags = {
    "Name" = "My IaC Instance"
    Origin = "Terraform"
}

}

© www.soinside.com 2019 - 2024. All rights reserved.