IaC/Terraform

Terraform 사용해보기(2)

제이Lee 2023. 10. 5. 11:47

어제 글에서 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에 대해 알아봤다.