구름

[테라폼] Terraform 입문하기 본문

Code/IaC

[테라폼] Terraform 입문하기

Cloudest 2021. 2. 4. 17:49
 

Cloudest - 블로그 이사했습니다

노션으로 블로그를 옮겼습니다.

흥미로운 포스팅이 올라옵니다!

cloudest.oopy.io

🛠
준비물 : WSL2, AWS IAM 사용자의 Credential, MobaXterm(SSH 터미널)

시작 전

  • 이 실습은 44bits.io 블로그의 Daegwon Nacyot Kim님이 작성하신 '테라폼 (Terraform) 기초 튜토리얼' 포스팅을 따라하며 진행한 실습 겸 정리 포스팅이다. Terraform과 관련된 실습 전부 위 블로그를 보며 진행했다.(코딩으로 치면 클론코딩)
  • 여기를 눌러 WSL : 윈도우에서 제공하는 리눅스 환경 참고하기
  • 테라폼이란
    • Hashicorp에서 개발한 인프라 관리 도구
    • HCL(Hashicorp Configuration Language)를 통해 AWS뿐 아니라 Azure, GCP, NCP 등의 다양한 클라우드를 관리할 수 있다.
    • 작업 공간의 모든 .tf 파일을 읽고 인프라를 구성한다. (즉 앞으로 나올 provider.tf, web_infra.tf 파일은 필수가 아니며 여러 파일을 읽어서 인프라를 구성할 수 있다.)

Terraform 환경 만들기

  • AWS 프로바이더 정의
    • WSL2 Ubuntu 20.04 LTS에서 진행
      $ mkdir /web_infra
      $ cd /web_infra
      $ touch provider.tf web_infra.tf
    • provider.tf 에서 AWS 계정정보 입력
      provider "aws" {
        access_key = "[AWS 액세스 키]"
        secret_key = "[AWS 비밀 키]"
        region = "ap-northeast-2"
      }
  • 프로바이더 선언
    • terraform init 명령과 terraform version 명령으로 확인하기

HCL 언어로 리소스 정의

  1. EC2용 SSH 키 페어 정의
    1. Key Pair 리소스 정의
      • AWS Key로 사용할 SSH Key를 미리 생성
        ssh-keygen -t rsa -b 4096 -C "<EMAIL_ADDRESS>" -f "$HOME/.ssh/web_admin" -N ""
        • 키 생성 확인
      • web_infra.tf 파일에 내용 추가
        resource "aws_key_pair" "web_admin" {
          key_name = "web_admin"  # "" 내부의 값을 문자열로 반환
          public_key = file("~/.ssh/web_admin.pub") # file() 내부의 "" 내부 값 또한 문자열로 받아서 해당 파일의 내용을 문자열로 반환 
        }
        • 여기서 지정하는 이름은 AWS에서 사용하는 이름이 아니다. 테라폼 코드의 다른 부분이 이 리소스를 참조하기 위해 사용하는 이름이므로, AWS에서 정의되는 리소스의 이름과 혼동해서는 안 된다. AWS 리소스의 이름은 주로 속성값을 통해 지정한다.
    2. 계획(Plan) 확인
      • terraform plan 명령으로 web_infra.tf 파일을 통해 실제로 리소스 생성이 가능한지 확인한다.
        1. 테라폼은 tf 파일을 컴파일 후 사용자가 정의한대로 '이상적 상태'를 가정한 후 '현재 상태'와 비교하여 이상적 상태와 같이 인프라를 만드는 워크플로우를 가지고 이를 apply라고 한다.
        1. Plan은 Apply 이전에 두 상태를 비교하여 작업할 일, 작업가능한지 등을 따진다.
        1. resource "aws_key_pair" "web_admin" 앞의 + 는 리소스를 생성하겠다는 의미이다. + 를 통해 '이상적 상태'가 되기 위해 필요한 리소스를 추가할 것이라고 미리 보여주는 것이다.
        1. { } 내부의 + 정보들은 apply를 통해 추가될 '리소스 속성'이다. 단, (known after apply)라고 표시된 값은 실제로 리소스를 생성해야 부여되는 값이다. 즉, 아직 알 수 없다.
        1. Plan: 1 to add, 0 to change, 0 to destroy. 1개의 리소스가 생성되고, 0개를 변경하고, 0개를 삭제한다는 의미다.
    3. 적용(Apply)
      • terraform apply 명령 입력 후 최종 확인 (yes 입력)을 거쳐 리소스가 생성된다. (기존 존재하던 keykey 키 이외에 web_admin 키가 추가됐다.)
      • 적용 후 다시 terraform plan을 실행하면 AWS 계정 상태가 web_infra.tf 파일의 내용과 동일한 '이상적 상태'기 때문에 더이상 아까와 같이 add 되지 않는다.
      • 즉 Terraform은 생성을 명령하는 것이 아닌 '이상적 상태'를 제공하는 것입니다. terraform apply명령을 통해 제공한 '이상적 상태'와 동일한 환경을 만들 뿐 terraform apply를 재실행한다고 추가 생성되거나, 중복되거나 하지 않는다.
      • terraform apply명령을 실행하면 terraform.tfstate 파일이 생성되며, 이 파일에 실제 상태를 임시로 저장하는 동시에 테라폼에서 관리되는 리소스 목록을 관리한다.

       

  1. SSH 접속 허용을 위한 SG 정의
    1. SG 리소스 정의
      • web_infra.tf 파일 맨 아래 다음 내용 추가
        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"]
          }
        }
    2. 계획(Plan) 확인 및 적용(Apply)
      • terraform plan
      • terraform apply
      • SG 생성 전 후
  1. EC2 인스턴스 정의
    1. AWS의 리소스 불러오기
      • web_infra.tf 파일 내부에 아래 내용 추가 (AWS에서 name=default 라는 SG를 default로 읽어온다.)
        data "aws_security_group" "default" {
          name = "default"
        }
        #이 코드를 통해 테라폼 내에서 default라는 기존에 존재하는 SG를 사용할 수 있다.
    2. EC2 리소스 정의
      • web_infra.tf 파일 내부에 아래 내용 추가
        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
          ]
        }
    3. 계획(Plan) 확인 및 적용(Apply)
      • terraform plan
      • terraform apply
    4. 결과 확인 및 SSH 접속
      • 생성된 EC2의 ID id=i-068a9a993fd34de68 값을 AWS 콘솔에서 검색
      • ssh -i ~/.ssh/web_admin ec2-user@13.209.14.27 명령으로 생성된 EC2에 ssh접속이 가능하다.
    5. terraform console로 리소스 정보 확인
      • terraform console 명령을 통해 CLI 환경에서 확인 가능
  1. RDS 인스턴스 정의
    1. RDS 리소스 정의
      • web_infra.tf 파일 내부에 아래 내용 추가
        resource "aws_db_instance" "web_db" {
          allocated_storage = 8
          engine = "mysql"
          engine_version = "5.6.35"
          instance_class = "db.t2.micro"
          username = "admin"
          password = "qwer!234"
          skip_final_snapshot = true #기본값은 flase지만 테라폼에서 삭제가 어려워 true 설정
        }
    2. 계획(Plan) 확인 및 적용(Apply)
      • terraform plan
      • terraform apply
    3. 결과 확인 및 RDS 접속
      • RDS 생성 확인
      • terraform console로 엔드포인트 확인
      • ec2에 접속하여 mysql 설치
        1. Public IP확인 → terraform consoleaws_instance.web.public_ip = 13.209.14.27
        1. ssh 접속 → ssh ec2-user@13.209.14.27 -i ~/.ssh/web_adminsudo su - = root 로그인
        1. mysql 설치 → yum -y install mysql
      • RDS에 접속
        • 아래 명령으로 RDS 접속
          mysql -h [RDS 엔드포인트] -u admin -p 
          = mysql -h terraform-20210201042317340700000001.cgmy7o7csrza.ap-northeast-2.rds.amazonaws.com -u admin -p

리소스 제거 및 복원

  • 리소스 제거
    1. web_infra.tf 파일을 다른 곳으로 이동 후 terraform plan 명령을 실행하거나 terraform plan -destroy 명령을 실행하면 아무 리소스도 없던 상태로 돌아간다. 왜냐면 정의된 리소스가 없는 백지상태이기 때문 (Terraform으로 생성된 리소스에 대해서만 적용되며, AWS에서 직접 생성한 리소스와는 상관없다.)
    1. 실제 적용을 위해서는 terraform destroy 명령 혹은 web_infra.tf 파일 없이 terraform apply 명령을 실행하면 모든 리소스가 지워진다.
    1. terraform destroy 명령 실행 → Destory는 Apply의 역순으로 진행된다. (그래야 정상적으로 인프라를 구축했을 때 정상적으로 삭제되기 때문)
    1. 기존 keykey 키페어가 남아있는 것으로 terraform destroy는 테라폼에서 생성한 리소스만 제거하는 것을 확인했다.
  • 다시 리소스 프로비저닝 해보기
    • 그저 terraform apply만 해주면 지금까지 만들었던 [HCL 언어로 리소스 정의]의 모든 리소스를 한번에 다시 생성할 수 있습니다.
      삭제 후 다시 생성된 EC2 인스턴스

     

결론

  • 테라폼 사용 이유 (44bits를 운영하는 Daegwon Nacyot Kim님의 요약을 그대로 인용)
    💡
    여기까지 테라폼으로 AWS 리소스들을 정의하고 프로비저닝하는 방법에 대해서 알아보았습니다. 웹 콘솔을 사용해 리소스를 관리하는 것과는 많이 다릅니다. 여기서는 정말 간단한 사례를 구현해 보았지만, 그럼에도 불구하고 생각보다 간단하지는 않습니다. 프로젝트에서 테라폼을 사용해보면 매번 리소스 레퍼런스를 확인하고, 웹 콘솔과 비교해보는 과정을 계속해서 반복해야합니다. 어떤 면에서는 웹 콘솔보다 오히려 어렵고 귀찮습니다. 그럼에도 테라폼을 사용하면 좋은 점들이 있습니다. 먼저 웹 콘솔을 사용해 리소스들을 관리하면서 점차 리소스가 많아지기 시작하면 더 이상 전체 리소스를 파악할 수 없는 시점이 옵니다. 업무용으로 사용하는 경우 명시적인 리소스와 비명시적인 리소스를 포함해 수백 수천개의 리소스를 다루는 일이 일반적입니다. 언제 왜 만들었는지 알 수 없는 리소스들이 점점 쌓여나가고, 레거시로 남습니다. 테라폼을 사용하면 프로비저닝하고자 하는 상태를 코드로 명확히 기록해두기 때문에 웹 콘솔만 사용할 때보다 파악이 쉬워지고 세심한 관리가 가능해집니다. 또한 테라폼은 코드로서의 인프라스터럭처Infrastructure as Code를 지향하는 도구로서, 코드를 작성할 때 누리던 생태계의 이점을 그대로 이용할 수 있습니다. 저장소에서 이력 추적을 할 수도 있고, 깃허브Github에서 팀원들과 코드 리뷰를 진행할 수도 있습니다. 이 과정에서 누가 어떤 리소스를 왜 추가했는지, 투명성은 자동적으로 얻어집니다. 좀 더 잘 활용한다면 CI를 사용해 코드 리뷰가 된 사항을 자동적으로 플랜 및 적용하는 것도 가능합니다.
  • Terraform에 대한 기초적인 개념을 이해하고 실습을 통해 사용법을 익혔다.
  • terraform destroy 명령을 한번 더 실행하여 리소스 삭제를 다시 확인한다.
  • 쉽게 Terraform에 입문할 수 있는 양질의 포스팅을 올려주신 Daegwon Nacyot Kim님 감사합니다.

Uploaded by Notion2Tistory v1.1.0

Comments