✅ 이 블로깅은 테라폼으로 시작하는 IaC 책을 기반으로 작성한다.


첫 번째 도전과제로 데이터 소스를 사용해서 AWS VPC를 생성할 것이다.

아래와 같이 AWS 프로바이더를 사용하여 region 내에 사용 가능한 AZ를 가져올 수 있다.

이를 통해 VPC 리소스 생성을 진행할 것이다.

참고문서 ) Terraform Registry

이 문서에서 Arguments는 데이터 소스로 가져오기 위한 조건인 인수이고, Attributes는 가져온 데이터 소스의 내용이다.

# Declare the data source
data "aws_availability_zones" "available" {
  state = "available"
}
resource "aws_subnet" "primary" {
  availability_zone = data.aws_availability_zones.available.names[0]
  # e.g. ap-northeast-2a
}
resource "aws_subnet" "secondary" {
  availability_zone = data.aws_availability_zones.available.names[1]
  # e.g. ap-northeast-2b
}

그러나 이는 에러가 발생하게 되는데!

Untitled

aws_subnet에서는 vpc_id라는 argument가 필수로 정의되어 있어야 하지만, 위 코드에서는 정의되지 않았기 때문에 에러가 발생하였다.

참고문서 ) Terraform Registry

# Declare the data source
data "aws_availability_zones" "available" {
  state = "available"
}

데이터 소스만 지정해 주게 되면 id=ap-northeast-2을 불러 온다.

Untitled 1

aws_subnet 리소스를 사용하기 위해 vpc_id를 지정해 주자!

# Declare the data source
data "aws_availability_zones" "available" {
  state = "available"
}
resource "aws_subnet" "primary" {
  availability_zone = data.aws_availability_zones.available.names[0]
  vpc_id     = aws_vpc.main.id
  # e.g. ap-northeast-2a
}
resource "aws_subnet" "secondary" {
  availability_zone = data.aws_availability_zones.available.names[1]
  vpc_id     = aws_vpc.main.id
  # e.g. ap-northeast-2b
}
resource "aws_vpc" "main" {
}

vpc_id를 사용하기 위해서는 aws_vpc 리소스 블록이 필요했다

aws_vpc 리소스 블록은 required argument가 없어서 비운 채로 생성해 보았는데, Plan을 진행했을 땐 문제가 없었다.

그러나 Apply를 진행해 보니, 아래와 같은 400 에러가 발생하였다.

Untitled 2

‘cidrBlock’ 또는 ‘ipv4IpamPoolId’ 파라미터가 필요하다는 메세지다.

참고문서 ) create-vpc — AWS CLI 2.13.16 Command Reference

resource로 지정한 aws_vpc는 create vpc를 하겠다는건데 ip 대역을 지정하지 않으니 생성하지 못하였다. 이 argument가 required가 아닌건 vpc를 생성할 때, cidr를 지정할 수 있는 방법이 여러 가지이기 때문인듯하다(?)

resource "aws_vpc" "main" {
  cidr_block       = "10.0.0.0/16"
  instance_tenancy = "default"

  tags = {
    Name = "main"
  }
}

그래서 vpc에 cidr를 설정해 주어 vpc는 성공적으로 생성되었는데, subnet에도 없으면 동일한 에러가 발생하여 subnet에도 마찬가지로 설정해 주었다.

# Declare the data source
data "aws_availability_zones" "available" {
  state = "available"
}
resource "aws_subnet" "primary" {
  availability_zone = data.aws_availability_zones.available.names[0]
  vpc_id     = aws_vpc.main.id
  cidr_block = "10.0.1.0/24"

  tags = {
    Name = "Main"
  }
  # e.g. ap-northeast-2a
}
resource "aws_subnet" "secondary" {
  availability_zone = data.aws_availability_zones.available.names[1]
  vpc_id     = aws_vpc.main.id
  cidr_block = "10.0.2.0/24"

  tags = {
    Name = "Main"
  }
  # e.g. ap-northeast-2b
}
resource "aws_vpc" "main" {
  cidr_block       = "10.0.0.0/16"
  instance_tenancy = "default"

  tags = {
    Name = "main"
  }
}

그래서 완성된 main.tf가 되었고

Untitled 3

Untitled 4

마침내 ap-northeast-2에 생성된 vpc와 subnet이었다!

region 내에 사용 가능한 AZ는 data 블록의 argumentstate = "available"로 가져 올 수 있었고

VPC와 Subnet을 생성할 때는 resource 블록의 argumentcidr_block를 정의했으며,

특히 Subnet은 resource 블록 vpc의 attributevpc_id를 참조하여 생성할 수 있었다.

결론적으로!!!

data 블록은 기존 리소스의 데이터를 가져오는 것이고 resource 블록은 create할 리소스이다

또한, argument는 리소스를 생성하기 위한 input 또는 해당 데이터를 가져오기 위한 조건값이라면, attribute는 생성된 리소스의 output과 같다!

Categories:

Updated:

Leave a comment