참고
이 게시글은 이전 글과 이어집니다. 여기서 사용할 web_infra.tf 파일은 다음과 같습니다.
resource "aws_key_pair" "web_admin" {
key_name = "web_admin"
public_key = file("~/.ssh/web_admin.pub")
}
보안 그룹 추가하기
SSH 접속 허용을 위해 Security Group을 추가해보자. 이전 포스팅에서 작성했던 web_infra.tf 파일에 이어서 작성한다.
보안 그룹을 추가하기 위해서는 aws_security_group 리소스를 넣어줘야 한다.
resource "aws_security_group" "my_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"]
}
}
여기서 name 속성과 description 속성은 각각 보안 그룹의 이름과 설명을 나타낸다.
ingress 속성은 인 바운드 규칙을 지정하는 속성으로, 한 보안 그룹에는 여러 개의 ingress 블록이 올 수 있다.
from_port와 to_port는 열어줄 포트의 범위를 의미한다. 예를 들어 from_port가 3000이고, to_port가 3005라면 3000번 포트부터 3005번 포트까지 6개의 포트를 열어주는 것이다.
protocol은 통신에 사용할 프로토콜인데, SSH는 TCP 프로토콜을 사용하므로 tcp로 지정한다.
cidr_blocks은 0.0.0.0/0으로 되어 있는데, 모든 IP에서 접속을 허용한다는 의미이다.
작성 후 terraform apply 명령을 입력하면 AWS 콘솔에서 allow_ssh_from_all 보안 그룹이 추가된 것을 확인할 수 있다.
VPC의 default 보안 그룹 불러오기
클라우드 상에 이미 정의되어 있는 default 보안 그룹을 불러오고 싶다면 아래처럼 'resource'가 아닌 data 소스를 이용한다.
data "aws_security_group" "default" {
name = "default"
}
EC2 인스턴스 생성하기
"aws_instance" 리소스를 이용하면 EC2 인스턴스를 만들 수 있다. 아래 내용을 web_infra.tf 파일에 추가하고 apply 해본다.
resource "aws_instance" "web" {
ami = "ami-0a93a08544874b3b7" # amzn2-ami-hvm-2.0.20200207.1-x86_64-gp2
instance_type = "t2.micro"
key_name = aws_key_pair.web_admin.key_name
vpc_security_group_ids = [
aws_security_group.my_ssh.id,
data.aws_security_group.default.id
]
}
여기서 key_name으로는 EC2 키 페어 이름이 들어가는데, 이전 게시글에서 정의했던 aws_key_pair.web_admin 리소스의 key_name이라는 속성을 참고한다.
vpc_security_group_ids는 배열 형식으로 들어가는데, 위에서 추가한 보안 그룹 my_ssh의 id 속성과 default 보안 그룹의 id 속성을 참조한다.
apply를 하고나면 AWS 콘솔에서 EC2가 추가된 것을 확인할 수 있다.
인바운드 규칙으로는 default 보안 그룹과 allow_ssh_from_all 보안그룹이 지정되고, 아웃바운드 규칙으로는 default 보안 그룹이 지정되었다.
terraform console을 실행시키면 대화형으로 리소스의 속성을 확인할 수 있다.
다음은 EC2 인스턴스로 SSH 접속을 하기 위해 aws_instance.web.public_ip를 조회한다.
위의 public ip를 통해 SSH 접속해본다.
ssh -i ~/.ssh/web_admin ec2-user@43.201.51.236
RDS 인스턴스 정의하기
MySQL을 사용하는 RDS 인스턴스를 만든다. RDS 인스턴스 리소스는 "aws_db_instance"이다. 나는 mysql 5.7.37 버전을 이용했다.
resource "aws_db_instance" "web_db" {
allocated_storage = 20 # 최소 용량이 20GB여서
engine = "mysql"
engine_version = "5.7.37"
instance_class = "db.t2.micro"
username = "admin"
password = "<DB_PASSWORD>"
skip_final_snapshot = true
}
여기서 skip_final_snapshot은 인스턴스를 제거할 때 스냅샷을 제거할 지 말 지 결정해준다.
이를 web_infra.tf에 추가해주고 apply 시키면 AWS 콘솔에서 RDS 데이터베이스가 하나 추가된 것을 확인할 수 있다.
위에서 생성한 EC2 인스턴스에서 terraform console을 이용해 DB의 endpoint를 확인해본다.
$ terraform console
> aws_db_instance.web_db.endpoint
이 인스턴스에는 mysql이 설치되어 있지 않으므로 mysql 패키지를 설치해준다.
$ sudo yum install -y mysql
이제 아래 명령으로 mysql에 접속해본다. 여기서 user는 위에서 작성한 admin 유저이고 접속할 때 password는 똑같이 위에서 작성한 password를 적어준다.
$ mysql -h <END_POINT> -p -u <USER_NAME>
잘 접속된 것을 확인할 수 있다.
참고 자료
https://www.44bits.io/ko/post/terraform_introduction_infrastrucute_as_code