开始使用 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 命令。
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”{
如错误所示,它在 us-east-1 区域中找不到默认 VPC。 您可以在 VPC 中提供
subnet_id
来创建实例,如下所示。
resource "aws_instance" "ec2demo" {
ami = "ami-c998b6b2"
instance_type = "t2.micro"
subnet_id = "subnet-0b1250d733767bafe"
}
截至目前,如果 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 资源。
基本上,你有两种方法可以解决这个问题
创建默认VPC,然后使用相同的代码。
另一种更好的方法是将网络配置注入到
aws_instance
资源中。我使用了官方 aws_instance 资源中的示例。请随意相应地更新任何属性。
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。
您是否有可能删除了默认 vpc,如果您删除了,您可以重新创建,转至 VPC 部分 -> 我的 Vpc -> 在右上角,您将看到一个名为“操作”的下拉列表,单击并选择创建默认 vpc
我仅在 AWS 中创建默认 VPC
已完成,您现在再试一次
编辑
main.tf
文件并添加:
subnet_id = "subnet-***********"
您可以从VPC仪表板>子网获取
正如 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"
这对我有用:
首先,我在顶部栏上搜索 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"
}
}