ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Terraform] 테라폼 기초
    클라우드/AWS 2024. 11. 23. 16:59

    - 하시코프에서 오픈소스로 개발중인 인프라스트럭처 관리 도구

    - 특정 버전의 테라폼을 사용하고 싶거나, 여러 버전을 사용할 필요가 있을 때는 tfenv를 사용하면 편리함 (맥, 리눅스, 윈도우 지원)

     

    태라폼의 기본 개념들

     

    프로비저닝?

    - 어떤 프로세스나 서비스를 실행하기 위한 준비 단계

    - 테라폼에서는 크게 네트워크나 컴퓨팅 자원을 준비하는 작업을 다루는 개념

     

    프로바이더 (Provider)?

    - 테라폼과 외부 서비스를 연결해주는 기능을 하는 모듈

    - 예를들어 테라폼으로 aws 서비스의 컴퓨팅 자원 생성하려면 aws 프로바이더를 먼저 셋업해주어야함

    - 테라폼 지원 목록 : 테라폼 프로바이더 문서

     

    리소스 (Resource) ?

    - 특정 프로바이더가 제공해주는 조작 가능한 대상의 최소 단위

    - 예를들어 aws 프로바이더는 aws_instance 리소스 타입 제공하고, 이 리소스 타입을 사용하여 가상머신 리소스를 선언하고 조작함

     

    HCL(Hashicorp Configuration Language)

    - HCL은 테라폼에서 사용하는 설정 언어

    - HCL 확장자는 .tf 사용

     

    계획 (Plan) ?

    - 테라폼 프로젝트 디렉터리 아래의 모든 .tf 파일의 내용이 실제로 적용 가능한지 확인하는 작업

    - terraform plan -> 어떤 리소스가 생성, 수정, 삭제될지 계획 보여줌

     

    적용 (Apply) ?

    - 테라폼 프로젝트 디렉터리 아래의 모든 .tf 파일의 내용대로 리소스를 생성, 수정, 삭제하는 일

    - terraform apply -> plan으로 확인후 실제로 적용하는 것이다

     

    크게 파일을 세가지로 나누어 실습 진행.

    - provider.tf -> 클라우드 서비스 연결 설정

    - resource.tf -> 실제로 만드는 인프라 자원 정의

    - data.tf -> 이미 존재하는 자원의 정보를 가져옴 ex) VPC ID, 서브넷 존재 등

     

     

     

    기초 프로젝트 - 간단한 ec2 및 키페어 생성하기

    1. IAM 액세스키 생성

    -> 생성완..

     

    2. 프로젝트용 디렉터리 생성후 테라폼 초기화

    terraform init

     

    3. ec2용 ssh키 페어 정의

    resource "aws_key_pair" "web_admin" {
      key_name = "web_admin"
      public_key = file("~/.ssh/web_admin.pub")
    }

     

    resource "aws_key_pair" "web_admin" 에서

    첫번째 문자열은 프로바이더에서 제공하는리소스 타입의 이름들 (정해져있는거)

    두번째 문자열은 리소스에 임의로 붙이는 이름으로, 테라폼 코드의 다른 곳에서 참조하기 위함용 (aws_key_pair.web_admin)

     

    4. 접속에 사용할 공개키 만들기

    $ ssh-keygen -t rsa -b 4096 -C "<EMAIL_ADDRESS>" -f "$HOME/.ssh/web_admin" -N ""

     

    5. 선언한 리소스들이 생성가능한지 계획 확인

    terraform plan

    - 테라폼에는 일명 "이상적인 상태" 혹은 "실제상태"로 나뉨

    - 실제 상태를 이상적인 상태와 동일하게 만드는 일을 실제로 apply하는것이고, 그전에 plan이 둘 상태를 동일하게 만들기 위해 해야할 일을 찾아내는 것

     

    5. 선언한 리소스들을 적용

    terraform apply

     

    6. resource.tf에 보안그룹 및 ec2 인스턴스 정보 추가하기

    resource "aws_security_group" "ssh" {
      name = "allow_ssh_from_all"
      description = "Allow SSH port from all"
      ingress {
        from_port = 22
        to_port = 22
        protocol = "tcp"
        cidr_blocks = ["0.0.0.0/0"]
      }
    }
    
    resource "aws_instance" "web" {
      ami = "ami-0a93a08544874b3b7" # amzn2-ami-hvm-2.0.20200207.1-x86_64-gp2
      instance_type = "t2.micro"
      key_name = aws_key_pair.web_admin.key_name
      vpc_security_group_ids = [
        aws_security_group.ssh.id,
        data.aws_security_group.default.id
      ]
    }

     

    7. plan 및 apply 적용

    terraform plan

    terraform apply

    적용하면 인스턴스및 보안그룹이 생긴게 보인다...!

     

    8. 리소스 삭제

    terraform destroy

     

     

    이외에도 

    - variables.tf -> 변수의 타입과 기본값등을 정의  

    variable "server_size" {
      description = "서버 크기"
      type        = string
      default     = "small"  # 기본값
    }

     

    - terraform.tfvars -> 정의한 변수에 실제 값 넣는 파일

    server_size = "large"  # 실제로 사용할 값

     

    - outputs.tf -> 테라폼으로 뭔가를 만들고 난 후, 필요한 정보를 보여주는 파일

    output "server_ip" {
      value = aws_instance.my_server.public_ip  # 만든 서버의 IP 주소를 보여줌
    }

     

    - 사용 방법

    # variables.tf - 변수 정의
    variable "server_name" {
      description = "서버 이름"
    }
    
    # terraform.tfvars - 실제 값 지정
    server_name = "웹서버-1"
    
    # resource.tf - 실제 서버 생성할 때 이 변수 사용
    resource "aws_instance" "server" {
      ami           = "ami-12345"
      instance_type = "t2.micro"
      
      tags = {
        Name = var.server_name  # "웹서버-1"이라는 이름이 들어감
      }
    }
    
    # outputs.tf - 생성된 서버의 정보 출력
    output "server_ip" {
      value = aws_instance.server.public_ip
    }

     

    # 방법 1: 다른 tfvars 파일 사용하기
    terraform apply -var-file="dev.tfvars"    # 개발 환경 설정
    terraform apply -var-file="prod.tfvars"   # 운영 환경 설정
    
    # 방법 2: 명령어로 직접 변수 입력
    terraform apply -var="server_name=웹서버A"
    
    # 방법 3: 환경변수로 설정
    export TF_VAR_server_name="웹서버B"
    terraform apply

     

     

    https://www.44bits.io/ko/post/terraform_introduction_infrastrucute_as_code

     

Designed by Tistory.