Terraform 사용해보기(2)
어제 글에서 Apply까지 하고 글을 마쳤다.
이제 추가적인 설정을 더 해보고
Apply가 어떻게 적용되는지 확인해보려 한다.
참고로 주석 처리된 부분은 빼고 해도 된다.
따로 설명하기가 귀찮아서 주석으로 추가해뒀을 뿐이다.
그리고 맨 끝에 내용 전체 복사해서 쓸 수 있게끔 추가해두겠다.
1. Security Group 추가
먼저 SSH 접속 허용을 위한 시큐리티 그룹을 만들려 한다.
내용은 web_infra.tf에 추가한다.
# aws_security_group resource를 ssh라고 명명
resource "aws_security_group" "ssh" {
name = "allow_ssh_from_all"
description = "Allow SSH port from all"
ingress { # 인바운드 설정
from_port = 22 # 22번 포트부터
to_port = 22 # 22번 포트까지 사용. ssh는 22번 포트 쓰기에 22번 포트만 사용하게끔 설정
protocol = "tcp" # 프로토콜은 tcp
cidr_blocks = ["0.0.0.0/0"] # 모든 IP에서 다 열어주겠다.
}
}
해당 내용을 추가하면
모든 IP에서 22번 포트로 SSH 접속을 허용해준다.
ingress 부분은 하나가 아니고 여러개를 추가할 수도 있다.
이후 plan 실행.
terraform plan |
어제도 말했지만 -out 옵션을 통해 해당 plan을 파일로 저장할 수 있다.
나는 테스트용이니 저장을 따로 하진 않을거다.
위와 같이 aws_sercurity_group이 추가된 모습을 확인할 수 있다.
이제 문제가 없으니 다시 apply 한다.
terraform apply |
2. Instance 정의
Instance는 뭐냐라고 하면 앞선 aws에 있는 글 중에(https://dlwjdwls90.tistory.com/65)
인스턴스 시작 할 때 나오는 저 부분을 Terraform으로 만드는거다.
다시 web_infra.tf를 열어서 아래 내용을 추가.
resource "aws_key_pair" "web_admin" {
key_name = "web_admin"
public_key = file("~/.ssh/web_admin.pub")
}
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가 아니고 data이다.
# 이름이 default인 sercuroty_group을 찾아서 값을 참조할 수 있게 해준다.
data "aws_security_group" "default" {
name = "default"
# 만약 default라는 이름이 중복되면
# 아래와 같이 ID를 넣어 구분해줘야 한다.
id = "<SECURITY_GROUP_ID>"
}
# 인스턴스 web을 만든다.
resource "aws_instance" "web" {
# ami는 현재 최신 버전의 값을 넣어줬다.
# Amazon Machine Image = ami
ami = "ami-0e581dc33f688a5df"
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
]
}
ami 값은 아래에서 확인해서 가져왔다. 아마 확인할 수 있는 곳이 있을 것 같다.
추가 완료횄다면,
다시 Plan, Apply 실행.
terraform plan terraform apply |
인스턴스까지 생성 완료했다.
이제 웹으로 들어가서 확인해보면,
내가 셋팅한대로 인스턴스가 만들어져 있는걸 확인할 수 있다.
3. SSH로 만들어진 Instance에 접속하기
이제 잘 접속되는지 확인해보자.
Terraform Console에 접속해
인스턴스에 대한 정보들을 확인할 수 있다.
아래는 ssh 접속을 위한 IP주소를 확인하는 방법이다.
terraform console aws_instance.web.public_ip # 가져올 정보 |
이제 알아낸 IP주소로
ec2의 기본 리눅스 유저인 ec2-user로 접속해보자.
ssh -i "sshKey 경로" "계정명"@"IP주소" |
보는 바와 같이
ec2-user로 프롬프트가 변경된 모습을 확인할 수 있다.
4. RDS Instance 정의
이제 AWS에서 제공하는 데이터베이스 서비스인 RDS를 정의해보자.
역시나 web_infra.tf에 아래 내용을 추가.
# db resource "web_db" 생성
resource "aws_db_instance" "web_db" {
# DB 사이즈, 기가 단위
allocated_storage = 8
# 어떤 sql 쓸건지
engine = "mysql"
engine_version = "8.0.33"
instance_class = "db.t2.micro"
username = "admin"
# password는 임시 비밀번호로 쓸거라 대충 만들고 나중에 DB 접속해서 변경
password = "11112222"
# 인스턴스 삭제시 최종 스냅샷 스킵 여부, 디폴트는 false인데 이러면 삭제가 힘들어 true로 변경
skip_final_snapshot = true
}
주의 할점은 버전 확인인데,
나는 이렇게 확인해서 넣어줬다.
추가하고
plan, apply 진행.
DB까지 생성 완료.
이제 DB 접속해보자.
먼저 SSH로 EC2 접속 후 mysql 설치.
이후 db Endpoint 확인을 위해 Terraform console 실행.
aws_db_instance.web_db.endpoint |
mysql-h "endpoint" -u admin -p "설정한 password" |
여기까지 해서 DB 접속이 된다면 끝이다.
나는 mysql 설치가 안돼서 일단 이 부분 확인한 후에 다음 글에
최종 마무리 하도록 하겠다.
5. 일괄 종료
aws는 실행해두면 지속적으로 사용량만큼 페이를 지불해야하기 때문에,
테스트가 끝났다면 인스턴스를 종료해주는게 좋다.
terraform plan -destroy |
해당 명령을 실행하면,
apply와 마찬가지로 destroy 가능 여부에 대해 알려준다.
혹시라도 이런 에러가 발생하면,
어딘 가에서 해당 인스턴스를 사용중이거나, 접속중인거다.
잘 확인해서 종료하길 바란다.
나의 경우는 terraform console에 접속중이여서 에러가 발생했었다.
이후 plan에 문제가 없다면,
terraform destroy |
해주면 apply처럼 yes를 입력하는 화면이 나오고
yes를 입력하면 알아서 삭제된다.
삭제가 끝난 뒤에는 웹에서 삭제됐는지 꼭 확인해보자.
Terraform으로 실행한 인프라 구축은
사실 웹 콘솔에서 다 할 수 있는 것들이다.
하지만, IAC 즉 코드를 통해 웹으로 접속하지 않아도
직접 인스턴스를 생성, 삭제할 수 있고
원하는 옵션도 직접 넣어줄 수 있기에
개발자 입장에서는 훨씬 편하게 사용할 수 있을 것 같다.
삭제가 잘 된 모습이다.
이상으로 Terraform에 대해 알아봤다.