0
votes

I am trying to launch an EFS file system in my default VPC. I am able to create the EFS but not able to mount the target in all subnets. In subnet_id I not sure how to pass the value of all the subnet ids of default VPC. Below is my Terraform code:

$ cat ec2.tf

provider "aws" {
 [enter image description here][1]region  = "ap-south-1"
 profile = "saumikhp"
}


data "aws_vpc" "default" {
  default = true
}

data "aws_subnet_ids" "example" {
  vpc_id = var.vpc_id
}

data "aws_subnet" "example" {
  for_each = data.aws_subnet_ids.example.ids
  id       = each.value
}


resource "aws_key_pair" "key" {
  key_name   = "mykey12345"
  public_key = file("mykey12345.pub")
}

resource "aws_security_group" "web-sg" {
  name        = "web-sg"
  description = "Allow port 22 and 80"
  vpc_id      = "vpc-18819d70"

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

  egress {
    from_port   = 0
    to_port     = 0
    protocol    = "-1"
    cidr_blocks = ["0.0.0.0/0"]
  }

  ingress {
    from_port   = 2049
    to_port     = 2049
    protocol    = "tcp"
    cidr_blocks = ["0.0.0.0/0"]
  }
  ingress {
    from_port   = 80
    to_port     = 80
    protocol    = "tcp"
    cidr_blocks = ["0.0.0.0/0"]
  }
  tags = {
    Name = "web-sg"
  }
}

resource "aws_instance" "myinstance" {
  ami             = "ami-0447a12f28fddb066"
  instance_type   = "t2.micro"
  key_name        = "mykey12345"
  security_groups = ["web-sg"]

  connection {
    type        = "ssh"
    user        = "ec2-user"
    private_key = file("mykey12345")
    host        = aws_instance.myinstance.public_ip
  }

  provisioner "remote-exec" {
    inline = [
      "sudo yum install httpd php git -y",
      "sudo systemctl restart httpd",
      "sudo systemctl enable httpd",
    ]
  }
  tags = {
    Name = "SaumikOS"
  }
}

resource "aws_efs_file_system" "efs" {
   creation_token = "efs"
   performance_mode = "generalPurpose"
   throughput_mode = "bursting"
   encrypted = "true"
 tags = {
     Name = "EfsExample"
   }
 }

resource "aws_efs_mount_target" "efs-mt" {
  depends_on = [
    aws_instance.myinstance,
  ]
  for_each        = data.aws_subnet_ids.example.ids
  subnet_id = each.value
  file_system_id  = "aws_efs_file_system.efs.id"
  security_groups = ["aws_security_group.web-sg.id"]
}

Error after running terraform apply

1

1 Answers

0
votes

You can get the subnets from the default VPC by using a combination of the aws_vpc and aws_subnet_ids data sources.

data "aws_vpc" "default" {
  default = true
}

data "aws_subnet_ids" "example" {
  vpc_id = var.vpc_id
}

You can then create an EFS mount target in each of the subnets by looping over these (each mount target only takes a single subnet_id):

resource "aws_efs_mount_target" "efs-mt" {
  for_each        = data.aws_subnet_ids.example.ids
  file_system_id  = aws_efs_file_system.efs.id
  subnet_id       = each.value
  security_groups = [aws_security_group.web-sg.id]
}