[DevOps/Terraform/T1013] 2주차 도전과제1: VPC 리소스 생성 실습
✅ 이 블로깅은 테라폼으로 시작하는 IaC 책을 기반으로 작성한다.
첫 번째 도전과제로 데이터 소스를 사용해서 AWS VPC를 생성할 것이다.
아래와 같이 AWS 프로바이더를 사용하여 region 내에 사용 가능한 AZ를 가져올 수 있다.
이를 통해 VPC 리소스 생성을 진행할 것이다.
이 문서에서 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
}
그러나 이는 에러가 발생하게 되는데!
aws_subnet
에서는 vpc_id
라는 argument가 필수로 정의되어 있어야 하지만, 위 코드에서는 정의되지 않았기 때문에 에러가 발생하였다.
# Declare the data source
data "aws_availability_zones" "available" {
state = "available"
}
데이터 소스만 지정해 주게 되면 id=ap-northeast-2
을 불러 온다.
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 에러가 발생하였다.
‘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가 되었고
마침내 ap-northeast-2
에 생성된 vpc와 subnet이었다!
region 내에 사용 가능한 AZ는 data 블록의 argument인 state = "available"
로 가져 올 수 있었고
VPC와 Subnet을 생성할 때는 resource 블록의 argument인 cidr_block
를 정의했으며,
특히 Subnet은 resource 블록 vpc의 attribute인 vpc_id
를 참조하여 생성할 수 있었다.
결론적으로!!!
data
블록은 기존 리소스의 데이터를 가져오는 것이고 resource
블록은 create할 리소스이다
또한, argument
는 리소스를 생성하기 위한 input 또는 해당 데이터를 가져오기 위한 조건값이라면, attribute
는 생성된 리소스의 output과 같다!
Leave a comment