클라우드 엔지니어/클라우드 캠프과정

terraform 변수, 모듈

해아's 2022. 11. 1. 16:58
Terraform 변수
  1) 테라폼 변수 문법
    [1] 변수 만들 때
	variable "변수이름" {
	  type = string
	  default = "값을 입력하지 않았을 때 설정되는 값"
	}

    [2] 변수 사용할 때
	var.변수이름

  2) 변수에 값 입력
	terraform apply -var "변수이름=값"


  3) 변수 작성 위치
    [1] 변수가 사용되기 전 main.tf에 작성

    [2] variables.tf 파일에 작성
	프로젝트폴더
		main.tf		전체적인 코드 작성
		variables.tf	변수 선언
		terraform.tfvars	변수 값 작성

 

하여 ec2생성코드중 인스턴스 타입과 인스턴스의 aim을 변수로 따로 설정한다

 

variable "app_server_ami" {
  type = string
  default = "ami-068a0feb96796b48d"
}

variable "app_server_in_type" {
  type = string
  default = "t2.micro"
}

resource "aws_instance" "app_server" { #리소스
  ami           = var.app_server_ami #이미지명 > 변수로 만듬
  instance_type = var.app_server_in_type
  vpc_security_group_ids = [ aws_security_group.ec2_allow_rule.id ] #resource "aws_security_group" "ec2_allow_rule" 를 가져와서 설정해준다
  tags = {
    Name = "ExampleAppServerInstance"
  }
}

실행시에는 아래와 같이 변수에 값을 지정할수 있다.

terraform apply -var "app_server_ami=ami-09cf633fe86e51bf0" 

// 변수에 다른값 지정하기 아마존눅스의 ami : ami-09cf633fe86e51bf0

 

즉 변수의 선언을 하는 파일은 variables.tf

변수선언의 값(설정값)을 바꾸는 파일은 terraform.tfvars

 

그리고 output를 이용하여 실행후 결과값을 받아올수있다.

아래의 명령은 ec2의 접속아이피를 받아오는것이다.

 

output "app_server_public_ip" { #출력
  description = "AWS_Public_Ip"
  value = aws_instance.app_server.public_ip
  
}

 

vpc,서브넷,igw,라우팅테이블,보안그룹,ec2(보안그룹물려서),출력은 퍼블릭아이피

소스보기

더보기
provider "aws" { 
  region  = "ap-northeast-2" #리전명
}
#vpc
resource "aws_vpc" "my-vpc2" {
  cidr_block       = "200.200.0.0/16"
  enable_dns_hostnames = true
  instance_tenancy = "default"

  tags = {
    Name = "my-vpc2"
  }
}
#서브넷 a,b
resource "aws_subnet" "my-subnet1" {
  vpc_id = aws_vpc.my-vpc2.id
  cidr_block = "200.200.10.0/24"
  availability_zone = "ap-northeast-2a"
  map_public_ip_on_launch = true
  tags = {
    Name = "my-subnet1"
  }
}
#인터넷게이트웨이
resource "aws_internet_gateway" "my-igw2" {
    vpc_id = aws_vpc.my-vpc2.id

    tags = {
      Nmae = "my-igw2"
    }
}
#라우팅테이블
resource "aws_route_table" "my-ro-table" {
  vpc_id = aws_vpc.my-vpc2.id

  route {
    cidr_block = "0.0.0.0/0"
    gateway_id = aws_internet_gateway.my-igw2.id
  }

  tags = {
    Name = "my-ro-table"
  }
}
resource "aws_route_table_association" "my-subnet1_my-ro-table" {
  subnet_id      = aws_subnet.my-subnet1.id
  route_table_id = aws_route_table.my-ro-table.id
}
#보안그룹
resource "aws_security_group" "ec2_allow_rule" {
  vpc_id      = aws_vpc.my-vpc2.id
  ingress {
    description = "SSH"
    from_port   = 22
    to_port     = 22
    protocol    = "tcp"
    cidr_blocks = ["0.0.0.0/0"]
  }

  ingress {
    description = "http,https"
    from_port   = 80
    to_port     = 80
    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"]
  }
  tags = {
    Name = "allow_ssh_from_all"
  }
}
resource "aws_instance" "app_server" {
  ami           = "ami-068a0feb96796b48d"
  instance_type = "t2.micro"
  key_name = "ec01"
  subnet_id = aws_subnet.my-subnet1.id #서브넷아이디
  associate_public_ip_address = true #공용아이피주소
  vpc_security_group_ids = [ aws_security_group.ec2_allow_rule.id ] #resource "aws_security_group" "ec2_allow_rule" 를 가져와서 설정해준다
  tags = {
    Name = "EC2_vpc_myvpc2"
  }
}
output "app_server_public_ip" { #출력
  description = "AWS_Public_Ip"
  value = aws_instance.app_server.public_ip

}
# enable_dns_hostnames- (선택 사항) VPC에서 DNS 호스트 이름을 활성화/비활성화하는 부울 플래그. 기본값은 false입니다.
04. Terraform 모듈
	테라폼으로 인프라의 규모가 커질경우 하나의 파일에 모든것을 정의할 경우 의도치않게 다른 부분에 영향을 끼칠 수 있고 
	환경별 같은 리소스의 코드가 중복되어 쌓일수가 있다.
	이러한 단점을 해결하기 위해 테라폼에서는 모듈이란 요소를 제공
	
	모듈은 관련있는 요소끼리 모아 하나의 패키지를 만든다.
	예를들면 VPC 모듈의 경우 서브넷, netmask 등의 리소스를 하나의 패키징

 
  1) 모듈의 장점
	캡슐화 : 서로 관련있는 요소들 끼리만 캡슐화를 하여 의도치 않은 문제 발생을 예방할 수 있다.
	재사용성 : 모듈을 사용하여 리소스를 정의하면 다른 환경에서도 해당 리소스를 쉽게 재사용할 수 있다.
	일관성 : 매번 새로 작성하게 되면 사람에 따라 리소스의 옵션이 빠지는 부분이 생길수도 있고 매번 같을 수 없기에 모듈을 재 사용시 일관성을 가지게 된다.

  2) 모듈 사용법
	module "모듈이름" {
	  source = "템플릿이 될 리소스가 있는 파일의 경로"
	  변수이름 = "값"
	}

provider "aws" { 
  region  = "ap-northeast-2" #리전명
}

module "module_ec2_1" {
  source = "./ex01"
  app_server_ami ="ami-068a0feb96796b48d"
  app_server_in_type="t2.micro"
  app_server_name = "module_ec2_1"
}

module "module_ec2_2" {
  source = "./ex01"
  app_server_ami ="ami-068a0feb96796b48d"
  app_server_in_type="t2.micro"
  app_server_name = "module_ec2_2"
}

module "module_ec2_3" {
  source = "./ex01"
  app_server_ami ="ami-068a0feb96796b48d"
  app_server_in_type="t2.micro"
  app_server_name = "module_ec2_3"
}

 

ex01안에 ec2설정에 변수를 지정하고

그 변수값을 사용해서 모듈화시킨 ec2를 다중생성하는것이다.

 

 

 

 

 

참고자료

728x90
반응형