본문 바로가기
  • 클라우드야 나랑 친해지자!
클라우드/AWS

Terraform 기초 튜토리얼

by 정민규 2021. 5. 13.
반응형

수업을 듣고 배운 내용과 연습한 내용을 정리하였습니다

개인 공부 후 자료를 남기기 위한 목적임으로 내용 상에 오류가 있을 수 있습니다.

 

잘못된 부분이 있거나 질문사항은 댓글로 남겨주시면 성심성의껏 답변해드리겠습니다. 감사합니다!


 

운영환경 : Ubuntu 20.04

 

테라폼

 

 

아래 명령어를 차례대로 입력하여 terraform을 설치합니다.

- software-properties-common : *PPA를 추가하거나 제거할 때 사용합니다.

- curl : 특정 웹사이트에서 데이터를 다운로드 받을 때 사용

$ sudo apt-get update
$ sudo apt-get install -y gnupg software-properties-common curl
$ sudo apt install curl
$ curl -fsSL https://apt.releases.hashicorp.com/gpg | sudo apt-key add -
$ sudo apt-add-repository "deb [arch=amd64] https://apt.releases.hashicorp.com $(lsb_release -cs) main"
$ sudo apt-get update && sudo apt-get install terraform
$ terraform -install-autocomplete
$ terraform version
$ mkdir terraform-docker-demo && cd $_

 

 

※PPA란?

Personal Package Archive. 개인 패키지 저장소로 개발자가 소스코드를 업로드하면 자동으로 패키지화합니다.

사용자가 다운로드 받아 설치할 수 있게 해주는 소프트웨어 저장소

 

※wget이 아닌 curl을 사용하는 이유

둘 다 웹사이트의 데이터를 다운로드 받을 수 있지만 curl이 더 다양한 프로토콜을 지원합니다.

 

 

 

 

 

 

 

HCL(Hasicorp Configuration Language)

HCL은 테라폼에서 사용하는 언어입니다. 테라폼에서 모든 설정과 리소스 선언은 HCL을 사용해 이루어집니다. 테라폼에서 HCL 파일의 확장자는 .tf를 사용합니다. 

 

 

아래 vi main.tf 는 "WebServerInstance" 라는 이름의 ec2 인스턴스를 생성하는 예제입니다.

ami의 경우 서울리전의 Amazon Linux 2입니다.

내용을 간단하게 읽어보고 아직은 실행하지 않겠습니다.

 

vi main.tf 안의 내용

$ vi main.tf

terraform {
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 3.27"
    }
  }

  required_version = ">= 0.14.9"
}

provider "aws" {
  profile = "default"
  region  = "ap-northeast-2"                                         // 리전 변경(한국)
}

resource "aws_instance" "web" {
  ami           = "ami-0f2c95e9fe3f8f80e"                          // 이미지는 AWS에서 골라서 복사(Amazon Linux2)
  instance_type = "t2.micro"

  tags = {
    Name = "WebServerInstance"
  }
}

 

 

 

 

 

 

환경변수로 AWS 사용자의 Access Key와 Secret Key 그리고 Region을 설정합니다.

$ export AWS_ACCESS_KEY_ID='액세스키'
$ export AWS_SECRET_ACCESS_KEY='시크릿키'
$ export AWS_DEFAULT_REGION="ap-northeast-2"

 

 

 

 

 

키페어를 생성합니다.

$ cd /home/<사용자명>/.ssh
$ ls
// ls 명령어를 입력했을 때 아무 것도 출력되지 않습니다.

$ ssh-keygen -t rsa -b 4096 -C "<이메일 주소>" -f "/home/<사용자이름>/.ssh/<키페어이름>" -N ""
// 키 생성이 되었습니다.
$ls
// 생성된 공개키와 개인키가 출력되는 것을 확인할 수 있습니다.

 

 

 

 

 

 

아래 main.tf는 위에서 만든 키페어를 적용하고 보안그룹까지 설정한 내용입니다.

위에서 생성한 키페어를 EC2 인스턴스에 적용하고,

보안그룹의 경우 SSH / HTTP / HTTPS 를 개방한 보안그룹을 생성하고 동시에 EC2 인스턴스에 적용했습니다.

또한 data "aws_security_group" "default" 을 추가하여 AWS의 기본VPC와 연결해주도록 합니다.

사실 상 새로운 VPC를 추가하지 않았기 때문에 보안그룹의 경우 전체를 대상으로 개방되어 있다고 보면 됩니다.

terraform {
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 3.27"
    }
  }

  required_version = ">= 0.14.9"
}

provider "aws" {
  profile = "default"
  region  = "ap-northeast-2"
}

resource "aws_instance" "web" {
  ami           = "ami-0f2c95e9fe3f8f80e"
  instance_type = "t2.micro"
  key_name      = aws_key_pair.terra_key.key_name
  tags = {
    Name = "WebServer"
  }
  vpc_security_group_ids = [
    aws_security_group.web.id,
    data.aws_security_group.default.id
  ]
}

resource "aws_key_pair" "terra_key" {
  key_name   = "terra_key"
  public_key = file("/home/gyu/.ssh/terra_key.pub")
}

resource  "aws_security_group"  "web" {
  name = "WEB-SG"                                                       // 보안 그룹 이름으로 들어감
  description = "For web server & SSH"                                   // 설명 추가
  ingress {
    from_port = 22
    to_port = 22
    protocol = "tcp"
    cidr_blocks = ["0.0.0.0/0"]
  }
  ingress {
    from_port = 80
    to_port = 80
    protocol = "tcp"
    cidr_blocks = ["0.0.0.0/0"] 
  }
  ingress {
    from_port = 443
    to_port = 443
    protocol = "tcp"
    cidr_blocks = ["0.0.0.0/0"] 
  }
}

data "aws_security_group" "default" {
  name = "default"
}

 

 

 

 

 

아래 명령어를 입력해 선언된 리소스를 초기화(init)하고 유효성 검사(validate)하고 생성가능 한지 계획을 확인(plan)한 후 실행합니다.

 

- plan : 앞서 작성한 리소스를 실제로 AWS에 생성할 수 있는지 확인합니다. plan 명령어를 사용하면 현재 정의되어 있는 리소스들을 실제로 프로바이더에 적용했을 때 테라폼이 어떤 작업을 수행할지 계획을 보여줍니다.

 

-apply : 계획을 통해 확인한 내용을 실제로 프로바이더에 적용합니다. Enter a value : 가 출력되면 yes 를 입력해 실행합니다.

$ terraform init
$ terraform fmt
$ terraform validate
$ terraform plan
$ terraform apply

 

 

 

 

 

이제 AWS 콘솔로 돌아가 작성한 main.tf가 테라폼을 통해 생성됐는지 확인해봅니다.

이름 : WebServer

키페어 : terra_key

보안그룹 : WEB-SG

위의 설정을 가진 EC2 인스턴스가 생성되었습니다. 

 

 

 

SSH 접속을 위해 public_ip 를 조회해봅니다.

$ terraform console
> aws_instance.web.public_ip

 

 

 

EC2 인스턴스에 접속해보겠습니다.

아마존 리눅스의 기본 유저인 ec2-user를 사용합니다.

$ ssh -i /home/gyu/.ssh/terra_key ec2-user@<public_ip주소>

 

 

 

EC2 인스턴스에 SSH를 통해 성공적으로 접속했습니다!

 

 

 

 

 

 

아래 명령어를 입력하면 테라폼으로 만든 설정이 모두 삭제됩니다.

$ terraform destroy

 

 

 

 

 

 

 

 

이제 RDS를 추가해보도록 하겠습니다.

위에서 생성한 테라폼은 삭제하고 진행합니다.

이름 : web_db

엔진 : mysql 8.0.20

main.tf 파일의 resource 아랫부분에 RDS를 생성하는 스크립트를 추가합니다.

$ vi main.tf

resource "aws_db_instance" "web_db" {
  allocated_storage = 8
  engine = "mysql"
  engine_version = "8.0.20"
  instance_class = "db.t2.micro"
  username = "admin"
  password = "<DB_PASSWORD>"
  skip_final_snapshot = true

 

 

 

init fmt validate plan apply 명령어를 실행해 바로 테라폼을 적용합니다.

3~5분뒤 RDS가 생성된 것을 확인하고, 이번에는 RDS의 endpoint주소를 확인해보겠습니다.

$ terraform console
> aws_db_instance.web_db.endpoint

 

 

 

이번에는 RDS에 접속해보겠습니다.

먼저 EC2 인스턴스에 접속한 뒤, yum 명령어를 통해 mysql을 설치합니다.

$ ssh -i /home/gyu/.ssh/terra_key ec2-user@<public_ip주소>
$ sudo yum install -y mysql

 

 

 

 

mysql 클라이언트가 설치됐으면 위에서 출력된 엔트포인트 주소를 통해 접속합니다.

$ mysql -h <RDS엔드포인트 주소> -u admin -p
Enter password :

 

 

 

 

성공적으로 MySQL이 접속된 모습입니다!

실습을 마쳤다면 terraform destroy 명령어를 통해 리소스를 삭제합니다.

 

 

 

 

지금까지 Terraform 기본 튜토리얼을 응용하여 웹 애플리케이션을 만드는데 필요한 EC2인스턴스와 RDS를 구축해봤습니다~ 간단한 사례를 구현한 것이지만 생각보다 간단하지 않고 복잡했습니다.

 

Terraform은 IaC를 지향하는 도구로서 다양한 이점들이 있는데요, 프로비저닝 하고자 하는 상태를 명확히 기록해두기 때문에 웹 콘솔만 사용할 때보다 파악이 쉬워지고 세심한 관리가 가능해집니다.

또한 코드이기 때문에 깃허브 혹은 깃랩을 통해 팀원들과 공유할 수 있고 이력을 추적할 수 있습니다.

 

앞으로 Terraform을 쓸 일이 많아질 것 같습니다 열심히 공부해야겠습니다 ㅎㅎ

 

반응형

댓글