Provision

Server Provisioning & Terraform

  • Provisioning 이란, 한정된 자원을 최적의 효율을 위해 제공하는 기술적 개념을 말한다. 유저의 요청에 맞게 자원을 미리 세팅해두고, 유저의 요청에 따라 준비된 자원들을 목적과 효율에 맞게 제공하는 개념이다. 특정 분야에서 한정되어 사용하는 개념이 아니라 다양한 분야에서 응용되어지는 주제이다. (IT 분야만으로 한정되지도 않는다) IT 분야의 Provisioning의 예시로는, Server Provisioning, Storage Provisioning, Telecommunication Provisioning 등이 있다.
  • 여기서는 Terraform 을 활용한 AWS 서버 프로비져닝에 관해 다룬다.

## AWS EC2

  • AWS EC2를 활용하기 위해서는 3가지의 기본적인 세팅이 필요하다.
    1. 키페어 (Key pair)
    2. 보안그룹 (Security Group)
    3. 인스턴스 (Instance)
  • 이 세가지를 Terraform 을 활용해 생성하는 코드를 정리한다.

1. 키페어 생성 (Key pair)

1-1. Key 만들기

- 자신의 email로 ssh key 를 생성하여, key_name 이름으로 .ssh 폴더에 저장

ssh-keygen -t rsa -b 4096 -C “email” -f “$HOME/.ssh/key_name” -N “”
- 이렇게 생성된 key 는 /key_name/ 과 /key_name.pub/로 private key 와 public key가 생성된다.

1-2. Key pair 생성

- `main.tf`  파일 생성
1
2
3
4
5
6
7
8
9
`provider “aws” {
# 이 region 은 seoul 을 의미한다
region = “ap-northeast-2”
}
Resource “aws_key_pair” “resource_name” {
# keygen 으로 생성한 key_name
key_name = "key_name"
public_key = "${file("~/.ssh/key_name.pub")}"
}
- apply 를 실행해, aws 키페어를 생성
1
2
3
$ terraform init
$ terraform plan
$ terraform apply
- destroy 를 실행해, aws 키페어를 삭제

$ terraform destroy

2. 보안그룹 생성 (Security Group)

- 보안그룹은 생성될 인스턴스의 정책을 설정하는 부분이다. 가장 대표적인 기능은 인바운드와 아웃바운드 port 를 설정할 수 있다.
- 필요에 따라 port number 를 열어주면 된다.
- `ingress` 는 인바운드, `egress` 는 아웃바운드 태그이다.
- `from_port` 와 `to_port` 는 말 그대로 from 부터 to 까지의 번호를 지정한다.
- 대표적인 포트번호에 관한 설명
    - 22 : ssh 접속을 위한 포트
    - 80 : http의 기본포트
    - 8888 : Jupiter notebook 사용을 위한  포트
    - 27017 : MongoDB 사용을 위한 포트
    - 3306 : MySQL 사용을 위한 포트
( /여기서는 DB의 경우, 다른 서버를 두고 사용하고 있으므로, 열어주지 않는다/ )


- `main.tf`  파일 생성
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
provider "aws" {
region = "ap-northeast-2"
}

resource "aws_security_group" "resource_name" {
name = "보안그룹 이름"
description = "보안그룹의 설명"
ingress {
from_port = 22
to_port = 22
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
}
ingress {
from_port = 80
to_port = 80
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
}
ingress {
from_port = 8888
to_port = 8888
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
}
}

  • 마찬가지로, init, plan, apply 를 활용하여 보안그룹을 생성하고, destroy 로 제거한다.

3. 인스턴스 생성

- 대망의 인스턴스 생성!
- 여기선, EC2 중, linux ubuntu 18.04 버젼 을 활용한다. AWS 내에서 다른 종류의 인스턴스를 사용할 경우, ami 를 다른 값으로 사용하면 된다.
- 또한, 다양한 인스턴스 유형중, t2.nano를 사용한다. 인스턴스 유형도 필요에 따라 다르게 설정하면 된다.

- `main.tf`  파일 생성
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
provider "aws" {
region = "ap-northeast-2"
}

data "aws_security_group" "resource1" {
name = "security_group_name"
}

resource "aws_instance" "resource2" {
ami = "ami-06e7b9c5e0c4dd014"
instance_type = "t2.nano"
key_name = "key_name"
vpc_security_group_ids = [
"${data.aws_security_group.resource1.id}"
]
tags {
Name = "dss_instance"
}
}
- `init`, `plan`, `apply` 를 활용하여  인스턴스를 생성하고, `destroy` 로 제거한다.

4. 생성된 인스턴스 확인

ssh -I ~/.ssh/key_name ubuntu@외부ip 로 생성된 인스턴스를 확인하고, 활용할 수 있다.

Author

Emjay Ahn

Posted on

2019-01-10

Updated on

2019-07-17

Licensed under

Comments