Terraform 在创建 EC2 实例时显示“InvalidGroup.NotFound”

Bha*_* Mg 5 amazon-web-services terraform terraform-provider-aws

我尝试使用 Terrafom 部署 EC2 实例,但看到以下错误:

Error: Error launching source instance: InvalidGroup.NotFound: The security group 'prod-web-servers-sg' does not exist in VPC 'vpc-db3a3cb3'
Run Code Online (Sandbox Code Playgroud)

这是我正在使用的 Terraform 模板:

resource "aws_default_vpc" "default" {
}

resource "aws_security_group" "prod-web-servers-sg" {
name        = "prod-web-servers-sg"
description = "security group for production grade web servers"
vpc_id      = "${aws_default_vpc.default.id}"

ingress {
from_port   = 80
to_port     = 80
protocol    = "tcp"
cidr_blocks = ["0.0.0.0/0"]
}
ingress {
from_port   = 443
to_port     = 443
protocol    = "tcp"
cidr_blocks = ["0.0.0.0/0"]
  }
}

#Subnet

 resource "aws_subnet" "private_subnet" {
 vpc_id     = "${aws_default_vpc.default.id}"
 cidr_block = "172.31.0.0/24"
 availability_zone = "ap-south-1a"
 }

 resource "aws_instance" "prod-web-server" {
 ami           = "ami-04b1ddd35fd71475a"
 count    = 2
 key_name = "test_key"
 instance_type = "r5.large"
 security_groups = ["prod-web-servers-sg"]
 subnet_id = "${aws_subnet.private_subnet.id}"
  }
Run Code Online (Sandbox Code Playgroud)

yda*_*coR 11

那里存在竞争条件,因为 Terraform 不知道要等到安全组创建后再创建实例。

要解决此问题,您应该将 插入aws_security_group.prod-web-servers-sg.idaws_instance.prod-web-server资源中,以便它可以计算出资源之间的依赖关系链。您还应该使用vpc_security_group_ids而不是像资源文档security_groups中提到的那样:aws_instance

security_groups -(可选,仅限 EC2-Classic 和默认 VPC)要关联的安全组名称 (EC2-Classic) 或 ID(默认 VPC)的列表。

注意:如果您要在 VPC 中创建实例,请改用 vpc_security_group_ids。

所以你应该有类似下面的内容:

resource "aws_default_vpc" "default" {}

resource "aws_security_group" "prod-web-servers-sg" {
  name        = "prod-web-servers-sg"
  description = "security group for production grade web servers"
  vpc_id      = aws_default_vpc.default.id

  ingress {
    from_port   = 80
    to_port     = 80
    protocol    = "tcp"
    cidr_blocks = ["0.0.0.0/0"]
  }
  ingress {
    from_port   = 443
    to_port     = 443
    protocol    = "tcp"
    cidr_blocks = ["0.0.0.0/0"]
  }
}

#Subnet

resource "aws_subnet" "private_subnet" {
  vpc_id            = aws_default_vpc.default.id
  cidr_block        = "172.31.0.0/24"
  availability_zone = "ap-south-1a"
}

resource "aws_instance" "prod-web-server" {
  ami                    = "ami-04b1ddd35fd71475a"
  count                  = 2
  key_name               = "test_key"
  instance_type          = "r5.large"
  vpc_security_group_ids = [aws_security_group.prod-web-servers-sg.id]
  subnet_id              = aws_subnet.private_subnet.id
}
Run Code Online (Sandbox Code Playgroud)