terraform- 1회차

박형준·2024년 6월 4일

IaC는 "Infrastructure As Code"

  • 코드로 인프라를 관리하는 것을 의미한다.

  • 서버, DB, 네트워크, 로그, 애플리케이션 구성, 문서, 자동화된 테스트, 배포 프로세스 등 거의 모든 작업을 코드로 관리

*AWS-계정

  • 윈도우, 리눅스 , Mac

  • 테라폼 설치, AWS CLI 설치, 윈도우(CMD) ==> VS Code

  • https://www.terraform.io/downloads ( 다운 압축 해제 C:\terraform 폴더 생성해서 넣기 )

  • cmd / terrform 입력 하면 안됨 ⇒ 환경변수 등록

  • 내컴퓨터 / 속성 / 고급시스템 설정 / 고급탭 선택 환경변수 /

    • 그다음 시스템 속성에 위 사진과 같이 고급 -> 환경변수 이렇게 넘어간다음

    • 그다음 시스템 속성에 위 사진과 같이 고급 -> 환경변수 이렇게 넘어간다음

  • 새로만들기 / C:\terraform 입력

  • CMD창을 새로 열어서 / terraform -version으로 확인

*AWS CLI 설치

*VS Code 설치

  • HashiCorp Terraform, Terraform 검색 설치

  • C에 생성한 Terraform 폴더 지정

  • Terraform 폴더에 테라폼 main.tf 파일 생성

-AWS 사용자 계정 생성을 하고, 사용자에게 권한을 부여해야함.

  • 엑세스키, 비밀키 메모 해 놓고

  • cmd창에 aws configure 입력하고

    • 액세스키 와 비밀키 등록

    • 리전과 json은 그냥 엔터 해주면 됨

-AWS EC2 인스턴스 AMI를 ID를 복사 ami-0d6e6a06d11d7777d


-기본명령어

  • terraform init ⇒ 초기화 명령어로 최초 한번만 실행

  • terraform validate ⇒ 작성한 코드에 대해 문법 검사

  • terraform plan ⇒ 코드 작성한것 가상실행

  • terraform apply ⇒ 코드가 적용됨 ( EC2 등이 생성 되고 수정 )

  • terraform show ⇒ 리소스 상태 확인

  • terraform destroy ⇒ 리소스 삭제

코드 작성

  • provider : 공급자 지정 ( aws , ansible, docker, k8s )

  • resource : 구성 요소를 지정 ( ami , instance_type ) 저장 / 실행

인스턴스 실행

  • 터미널 창에서 terraform init, validate, plan, apply 으로 인스턴스 실행

인스턴스 수정

  • 추가, 제거, 수정할 내용을 입력하고 실행 , EC2에 이름 지정 (tags)

  • terraform plan, terraform apply로 수정

  • 키페어 추가, ( key_name = "soldesk.pem", 인스턴스 삭제 후 생성 )

  • 포트 추가 ( ingress: 규칙 , 네트워크 관련 )

    • port = [ 80, 22, 443 ] ( 포트 지정 ),

    • from_port = 8080, to_port = 8080 ( 8080~8080, 8080만 포트 지정)

    • protocol = "tcp",

    • cidr_blocks = ["0.0.0.0/0"]

  • 보안 그룹 지정

    • vpc_security_group_ids = [aws_security_group.instance.id]

    • resource "aws_security_group" "instance" {
      ingress {
      --from_port = 8080
      --to_port = 8080
      --protocol = "tcp"
      --cidr_blocks = ["0.0.0.0/0"]
      } , ( 보안 그룹의 인바운드 규칙 지정 )

⇒ 5가지 과정을 단계별로 실행 하면서 생성되는것 확인
EC2만 생성 /실행 ⇒ tags 지정/실행 ⇒ 키페어 지정/실행 ⇒ 포트 지정 /실행 ⇒ userdata 입력 /실행


반복적인 작업이 필요할 때 테라폼을 사용하면 유용하다

  • provider : 공급자 지정 ( aws,ansible,docker,k8s )

  • resource : 구성 요소를 지정 ( ami,instance_type,포트등) resource는 여러개로 구분 가능함.

#main.tf 코드 ================================================

provider "aws" {    #AWS 사용선언 
  region = "ap-northeast-2"   #리전 지정 
}

resource "aws_instance" "example" {
  ami = "ami-0c55b159cbfafe1f0" ⇒ OS 이미지  ami
  instance_type = "t2.micro"  ⇒ 여기까지만 하면 기본 껍데기가 생성됨.           
  vpc_security_group_ids = [aws_security_group.instance.id]    ⇒ 기본 VPC지정 
 
  tags = {                                                                          ⇒ EC2 이름 지정하기  
    Name = "terraform-example"
  }
}

resource "aws_security_group" "instance" { ⇒ 보안그룹에 포트 지정  

  ingress {
    from_port    = 8080          -> 80
    to_port        = 8080        -> 22
    protocol      = "tcp"        -> tcp 
    cidr_blocks = ["0.0.0.0/0"]
  }
  **ingress** {
    from_port    = 22            -> port = [ 80 , 22 ]
    to_port        = 22
    protocol      = "tcp"
    cidr_blocks = ["0.0.0.0/0"]
  }
}

*userdata

-웹서버 생성시 필요한 정보 리소스 입력 ⇒ 자동 실행

  • user_data = <<-EOF
    -#!/bin/bash
    -echo "Today 06-04" > index.html
    -nohup busybox httpd -f -p 8080 &
    -EOF

  • 주어진 내용을 백그라운드로 실행하는 스크립트

  • ec2 접속해서 디렉터리와 웹페이지 접속 확인


VPC

VPC 생성

  resource "aws_vpc" "main" {
    cidr_block = "10.0.0.0/16"
    tags = {
    Name = "terraform-vpc"
      
} 
  • cidr_block 과 이름 지정해서 VPC 생성
  • terraform apply로 확인

서브넷 생성

- resource "aws_subnet" "PUB-sub1-2a" {
----**vpc_id = aws_vpc.main.id**
----cidr_block = "10.0.1.0/24"
----availability_zone = "ap-northeast-2a"
----tags = {
------Name = "PUB-s1-2a"
----}
}
  • 생성한 VPC에 가용영역이 2a와 2b의 퍼블릭 서브넷 생성

⇒ 실행후 서브넷 생성된것 확인 하고 "10.0.10.0/24", "10.0.20.0/24" 수정 / 실행 해서
수정(~)된 부분이 적용되는지 확인

*인터넷 게이트웨이 추가 / 생성

- resource "aws_internet_gateway" "i-gw" {
----vpc_id = aws_vpc.main.id
----tags = {
------Name = "main-igw"
----} 
}
  • VPC를 지정한 후에 인터넷 게이트웨이 생성

*라우팅 테이블 생성 ( 내부 / 외부 네트워크 연결 )

- resource "aws_route_table" "rt" {
----vpc_id = aws_vpc.main.id
----tags = {
------Name = "main-rt"
----}  
}
  • 라우팅 테이블 선언
- resource "aws_route_table_association" "rt-association-PUB-sub1-2a" {
----subnet_id = aws_subnet.PUB-sub1-2a.id
----**route_table_id** = aws_route_table.rt.id 
}
  • 라우팅 테이블과 서브넷 연결

*private 서브넷과 NAT 게이트웨이 생성

- resource "aws_eip" "eip" {
----vpc = true    
----**lifecycle** {
------create_before_destroy = true
----}
}
  • 탄력적 ip 생성 및 수명 주기 설정
  • vpc = true 부분을 domain = "vpc"로 변경해도 된다 ( 버전 차이 )
- resource "aws_nat_gateway" "nat_gw1" {
----allocation_id = aws_eip.eip.id
----subnet_id = aws_subnet.PUB-sub1-2a.id
----tags = {
------Name = "PUB-Nat-gw1"
----}  
}
  • nat gateway와 탄력적 ip 연결 및 서브넷 연결

*전체 코드 main.tf

  • vpc 생성 및 서브넷 4개 생성 ( PUB-2개)

  • 인터넷 게이트웨이 생성

  • 라우팅 테이블 생성

  • 프라이빗 서브넷 2개 더 생성 하고 NAT gateway 구성 한 내용.


IaC 관련 기사
https://www.comworld.co.kr/news/articleView.html?idxno=50396
https://www.redhat.com/ko/topics/automation/what-is-infrastructure-as-code-iac

Terraform
https://developer.hashicorp.com/terraform/intro

Terraform CLI
https://developer.hashicorp.com/terraform/cli/config/config-file

provider
https://developer.hashicorp.com/terraform/language/providers

Provider_ovirt
https://registry.terraform.io/providers/oVirt/ovirt/latest/docs

Resource
https://developer.hashicorp.com/terraform/language/resources

Variable
https://developer.hashicorp.com/terraform/language/values/variables

0개의 댓글