[Terraform] 테라폼 기초 2 (보안 그룹 추가하기, EC2 인스턴스 생성하기)

728x90
728x90

참고

이 게시글은 이전 글과 이어집니다. 여기서 사용할 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

 

반응형