저번 실습에서는 테라폼을 설치했으니 이번에는 가장 기본 서비스 중 하나인 인스턴스를 생성해보자
1. AWS사용자 만들기
먼저 AWS콘솔에서 IAM을 검색한다!
이제 사용자 그룹을 생성하자! 오른쪽 탭에서 사용자 그룹 클릭
우측에 그룹 생성 버튼을 클릭!
이름에 TerraformAdministrator를 입력한다
하단의 정책 연결에서는 AdministratorAccess를 선택 후 그룹생성 버튼을 클릭!
(본 실습에서는 실습이니 어드민권한을 주었지만 실제는 최소권한을 주는것이 중요하다!)
이제 그룹을 만들었으니 그룹에 사용자를 추가하자! 왼쪽 탭에서 사용자를 클릭!
사용자 추가를 클릭!
사용자 이름에 알아보기 쉬운 임의의 이름을 입력한다.
그리고 아래의 AWS 매니지먼트 콘솔에 대한 액세스 권한은 체크 해제 한다!
왜냐하면 우리는 이 사용자로는 매니지먼트 콘솔에 접속할 일이 없다! 다음 버튼 클릭
그룹에 사용자 추가를 선택하고 아래에 아까 우리가 생성한 테라폼 그룹이 보일 것이다! 그룹을 선택해주고 다음을 클릭!
(위의 사진은 테라폼그룹이름이 살짝 다르지만 무시하시고 진행해도 무방함) 다음 버튼을 클릭!
요약화면을 확인하였다면 사용자 생성 버튼을 클릭!
만든 Terraform 사용자가 있는 것을 볼 수 있다!
아직 끝이 아니다. 저 Terraform 사용자에 테라폼에서 접근할 수 있도록 Key를 할당해주어야 한다
Terraform 사용자를 클릭!!
클릭했다면 아래쪽에 보안 자격 증명 탭을 선택해주고 아래쪽으로 내리다 보면 액세스 키가 있을 것이다
액세스 키가 테라폼에서 이 사용자에 접근할 수 있도록 아이디와 비밀번호를 할당해주는 것이다
액세스 키 만들기를 클릭!
CLI를 선택하고 다음 을 누르고 생성을 한다!
태그를 생성할것이냐고 물어보면 일단은 안한다 스킵! 액세스 키 만들기 클릭!
다음과 같이 액세스 키와 비밀 액세스 키가 뜬다 이것을 꼭!!! csv파일로 다운로드하거나 메모장에 기록하여 잘 가지고
있어야 한다 이 계정에 접속할 수 있는 중요한 아이디,비밀번호 같은것이다!
(이 사진처럼 아무데나 이렇게 액세스 키를 올리면 안된다! 나는 실습 후 바로 삭제할 것이기 때문에 상관x)
2. Terraform으로 코드를 짜보자!
두번째로 코드를 짜보자!
하나의 파일에 다 때려넣어도 상관은 없지만, 추후 관리의 용이성과, 보안, 가독성을 위해서 파일을 분리하겠다.
그래서 우리는 총 4개의 테라폼 파일이 필요하다!
첫 번째는 provider.tf 이다.
이 파일의 용도는 어떤 Cloud Provider를 사용할 것인지와, 리소스를 만들 계정의 키, 시크릿키, 리전이 담겨있는 파일이다
provider "aws" { #Provider중에서 "aws"를 사용하겠다는 것!
access_key = var.AWS_ACCESS_KEY #리소스를 생성할 계정의 액세스 키 이다
secret_key = var.AWS_SECREAT_KEY #리소스를 생성할 계정의 시크릿 키 이다
region = var.AWS_REGION #어디 리전에 만들지 설정하는 것!
}
두 번째는 vars.tf 파일 이다
이 파일의 역할은 Terraform에서 사용할 변수들이 저장되어 있는 파일이다!
variable "AWS_ACCESS_KEY" {} #아까 사용자 생성 후 만든 액세스 키 변수
variable "AWS_SECREAT_KEY" {} #사용자 생성 후 만든 시크릿 키 변수
variable "AWS_REGION" {} #리전이 들어갈 변수 이다
variable "AMIS" { #인스턴스를 생성할 때 AMI를 리전에 맞게
type = map(string) #들어갈 수 있도록 만든 Map변수이다
default = {
ap-northeast-2 = "ami-0c9c942bd7bf113a2"
us-east-1 = "ami-0b0ea68c435eb488d"
us-west-2 = "ami-0454207e5367abf01"
eu-west-1 = "ami-0f29c8402f8cce65c"
}
}
variable "PATH_TO_PRIVATE_KEY" { #인스턴스를 생성하면서 연결하여 nginx를
default = "mykey" #설치할 것이기 때문에 인스턴스와 연결하기 위해
} #들어갈 키 변수이다
variable "PATH_TO_PUBLIC_KEY" {
default = "mykey.pub" #키는 퍼블릭과 프라이빗이 있기 때문에 변수도 2개!
}
variable "INSTANCE_USERNAME" { #인스턴스에 접속 할 사용자의 이름이다
default = "ubuntu" #AWS에서는 우분투로 설치 시 사용자의 이름은
} #ubuntu이기 때문에 ubuntu로 한다
세 번째 resource.tf 이다
이 파일은 우리가 생성할 리소스가 무엇인지 나타나 있는 핵심적인 파일이다!
EC2, VPC, 서브넷 등 만들 리소스를 이곳에 코딩하면 된다!
resource "aws_key_pair" "mykey" { #두번째에서 말한것처럼 인스턴스에 연결해야 하기
key_name = "mykey" #때문에 AWS에 키페어를 올려준다
public_key = file(var.PATH_TO_PUBLIC_KEY)
}
resource "aws_instance" "Terraform-Instance" { #인스턴스 리소스를 생성한다!
ami = var.AMIS[var.AWS_REGION] #AMI는 아까 Map변수에서 리전에 맞게 할당
instance_type = "t2.micro" #t2.micro로 타입 설정
key_name = aws_key_pair.mykey.key_name #키 페어 할당
provisioner "file" { #nginx를 설치하는 스크립트파일을 인스턴스로 전송
source = "script.sh" #보낼 파일의 이름
destination = "/tmp/script.sh" #인스턴스 내에서 파일이 저장될 위치
}
provisioner "remote-exec" { #인스턴스를 조작 할 명령어
inline = [
"chmod +x /tmp/script.sh", #스크립트에 실행 권한을 부여
"sudo /tmp/script.sh", #스크립트를 실행(nginx를 설치한다)
]
}
connection { #인스턴스에 연결해야 조작, 파일전송이가능하기 때문에 커넥션 생성
host = coalesce(self.public_ip, self.private_ip)#퍼블릭 ip를 이용하여 연결 하지만, 실패 시 프라이빗 사용
type = "ssh" #연결 타입은 SSH로 연결!
user = var.INSTANCE_USERNAME #user이름은 아까 vars.tf처럼 ubuntu
private_key = file(var.PATH_TO_PRIVATE_KEY) #프라이빗 키를 사용
}
}
마지막 네 번째 파일은 terraform.tfvars 파일이다
이 파일은 Github이나 이처럼 블로그에 올릴 수 없는 Key등 보안이 중요한 데이터가 들어있다
이 코드들을 보면 알겠지만 이처럼 각자 역할이 정해진 것끼리 한 파일에 모아놓으면 가독성, 보안, 관리성 에서
이점이 있다. 즉, 한 파일에 다때려넣으면 알아보기 힘드니까 이렇게 하자
AWS_ACCESS_KEY = "아까 생성하여 저장해둔 액세스키를 입력하세용"
AWS_SECREAT_KEY = "시크릿 키 또한 입력!"
AWS_REGION = "ap-northeast-2" #리소스를 생성할 리전을 입력! 본 실습에서는 서울리전에 진행
이 파일들은 저번에 만들어 둔 C:\terraform\tf 폴더 아래에 있어야 한다
테라폼 파일은 이것이 끝!
위의 코드를 읽어보았다면 의문이 들 것이다. 우리가 Terraform사용자에 연결할 수 있는 액세스키는 만들었는데
코드에있는 mykey 와 mykeypub은 만든적이 없는데?
맞는말이다. 이제 만들어보자
3. SSH키 생성
콘솔창을 열어보자
저번 실습에서 만든 C:\terraform\tf 폴더 밑으로 이동한다 만약 명령어를 모르겠다면
cd c:\terraform\tf\ 를 입력하자 (저 폴더로 이동하겠다는 뜻이다)
ssh-keygen -f mykey 를 입력! (키를 생성)
하면 뭘막 물어볼텐데 엔터 누르면서 스킵(엔터 두번정도)하면 다음과 같은 화면이 뜬다
잘 만들어졌나 확인을 해 보겠다 C드라이브/terraform/tf 폴더로 가보자
저기 mykey와 mykey.pub가 보인다 잘 생성이 되었다는 뜻이다.
그리고 인스턴스로 보낼 쉘 스크립트는
#!/bin/bash
# sleep until instance is ready
until [[ -f /var/lib/cloud/instance/boot-finished ]]; do
sleep 1 #인스턴스가 생성이 완료 될 때까지 기다린다
done #인스턴스 생성이 완료되면
# install nginx
apt-get update #업데이트 후
apt-get -y install nginx #nginx설치
# make sure nginx is started
service nginx start #nginx 시작
이걸 복사해서 script.sh로 만들어 C:\terraform\tf 폴더에 저장하자
제대로 했다면
이렇게 4개의 테라폼 파일, 2개의 key파일, script.sh파일이 있으면 된다!
4. 실행
실행에 앞서서 이번에 사용할 테라폼 명령어는 다음과 같다
terraform init #가장 먼저 실행할 명령어
terraform plan #테라폼을 실행하면 어떻게 변하는지(리소스의 변화)를 알려준다
terraform apply #테라폼을 실행하여 적용한다
terraform destroy #만든 리소스들을 삭제한다
제일 먼저 실행할 terraform init은 아주 중요하다!!!
테라폼이 사용할 환경을 설정하는 것이다 AWS를 사용할 것인지 Azure을 사용할 것인지 등
그 Provider에 맞게 세팅을 하는 명령어 이다. 이 명령어를 실행해야 하는 경우는 다음과 같다
- 테라폼 프로젝트 폴더를 만들고 그 폴더를 처음 실행 할 때
- AWS에서 Azure처럼 다른 Cloud Provider를 사용할 때
우리는 처음 테라폼 폴더를 만들었고, 처음 실행하는 것이니 init 명령어를 실행해보자!
설정에 성공했다! 보면 hashicorp/aws v5.12.0 이라고 AWS로 잘 설정된 것도 볼 수 있다!
그러면 다음 명령어를 실행해보자
apply할 경우 어떤 리소스의 변화가 생기는지 알아볼 수 있는 명령어 terraform plan을 실행!
뭐가 막 엄청 뜨는데 우리가 resource.tf에서 생성한 키페어와 인스턴스가 잘 인식된 것을 볼 수 있다!
이제 적용을 해보자 terraform apply 입력
결과사진을 보기 앞서서 인스턴스가 계속 생성중 이라는 오류가 날 것이다! 이유는 설명할 것이니 일단 해보자
명령어를 입력하면 액션을 수행할 것이냐 물어보는데 yes를 입력해주자!
보면 file을 프로비저닝 하면서 계속 인스턴스가 생성중인것을 볼 수 있다!
저렇게 되는 이유는 우리가 리소스를 생성할 때 보안그룹을 명시해 주지 않아서
기본 보안그룹을 사용하게 되는데 기본 보안그룹의 인바운드 설정을 해주지 않아서 그렇다
컨트롤 + c를 눌러 취소해주고 terraform destroy를 입력해주자
apply와 마찬가지로 액션을 할 것이냐고 물어보는데 yes입력
보안그룹 설정하러 AWS 매니지먼트 콘솔로 가주자
(이때 아까만든Terraform 사용자로는 접속할 수 없으니 다른 사용자로 접속)
기본 보안그룹이 보인다 아래의 인바운드 규칙 을 선택해주고 인바운드 규칙 편집을 눌러주자
(리전은 꼭 서울로하자! 아까 코드를 따로 수정하지 않았다면, 서울에서 인스턴스가 만들어질 것이기 때문)
첫번째 라인은 Nginx를 테스트 하기 위해 열어놓은 HTTP포트
두번째는 기본 설정이고
세번째는 원격제어및 파일전송 위한 SSH (아까 resource.tf에서 커넥션에서 유형을 SSH로 한 것을 기억하자)
(이 규칙이 없었기에 아까 계속 인스턴스가 만들어지고있는중이라고 떴었던 것이다)
일단은 실습이기에 전부 0.0.0.0/0 (누구나 접속 허용) 으로 해놓았지만 가급적이면 본인 ip로 하자
다 수정했으면 다시 terraform apply 를 입력하자!
보안그룹을 수정했더니 잘 만들어진다 이제 인스턴스와 키페어를 확인하자
resource.tf에서 두 개의 리소스를 생성했었다. 바로 키페어와 인스턴스!
두개 다 잘 만들어졌다
이제 Nginx가 제대로 작동하는지 확인하자 인스턴스의 퍼블릭 주소를 복사하여 브라우저에서 열어보자!
Nginx페이지가 잘 나온다!
즉, 우리가 만든 테라폼 리소스 파일에 이상이 없었고,(인스턴스와 키페어의 생성이 잘 되었고)
파일도 정상적으로 올라가서 실행이 되어 Nginx가 설치되었고,
접속도 정상적으로 된다!
실습에 성공했으니 꼭!! terraform destory를 사용해 없애주자...돈 나간다
요약
- 테라폼 파일은 각 역할(변수, 프로바이더, 보안, 리소스)에 맞춰서 파일을 잘 만드는게 좋다
- ssh-keygen을 통하여 키페어를 만들고 인스턴스에 SSH연결을 할 수 있게 하여 파일전송과 원격조작을 하였다
- 무한로딩에 걸리던 것을 보안그룹 규칙 수정을 통해 해결하였다
실습 끝!
'Terraform' 카테고리의 다른 글
Windows11 Terraform 설치 및 시작하기 (0) | 2023.08.13 |
---|
댓글