수업을 듣고 배운 내용과 연습한 내용을 정리하였습니다
개인 공부 후 자료를 남기기 위한 목적임으로 내용 상에 오류가 있을 수 있습니다.
잘못된 부분이 있거나 질문사항은 댓글로 남겨주시면 성심성의껏 답변해드리겠습니다. 감사합니다!
운영환경 : 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을 쓸 일이 많아질 것 같습니다 열심히 공부해야겠습니다 ㅎㅎ
'클라우드 > AWS' 카테고리의 다른 글
Site-to-Site VPN vs Direct Connect vs Client VPN (2) | 2021.06.24 |
---|---|
AWS Summit Online Korea 행사 참여 (2) | 2021.06.07 |
Lambda와 S3로 이미지 썸네일 생성 (0) | 2021.04.08 |
AWS OpsWorks for Chef Automate (1) | 2021.04.08 |
웹 서버에서 실행되는 PHP 애플리케이션에 MySQL 데이터베이스 연결하기 (0) | 2021.03.30 |
댓글