이번 시간 Terraform을 이용하여 AWS에 Ec2 실행하는법에 대해서 작성 하겠습니다.
먼저 AWS 에 가입이 되어 있다는 전제로 글을 작성 하겠습니다.
우선 IAM에서 새로운 계정을 만드시거나 Admin 계정을 이용하여 액세스키를 발급을 받아줍니다.
이때 발급 받은 액세스키는 다시 볼 수 없기 때문에 엑셀 파일을 저장하거나 키를 어딘가에 저장 해주시기를 바랍니다.
AWS CLI 설치 및 Credentials 등록
brew install awscli
aws configure
aws configure list
aws cli가 설치가 안되어 있다면 먼저 cli를 설치 해줍니다.
그 후에 aws configure 명령어를 입력하여 위에 발급 받은 액세스키와 시크릿키 그리고 해당 리전들을 입력해줍니다.
위의 그림와 같이 나오면 제대로 등록이 된거입니다.
Key Pair 등록
먼저 KeyPair 등록하기 위해서 keygen을 만들어줍니다.
# -t: 암호화 타입
# -b: 비트 수
# -C: 코멘트
# -f: 파일 저장 경로
# -N: 암호화 옵션
$ ssh-keygen -t rsa -b 4096 -C "" -f "{저장하고자하는 경로}/tf-key-pair" -N ""
ssh-keygen -t rsa -b 4096 -C "" -f "./terraform"
resource "aws_key_pair" "tf-key" {
key_name = "terraform"
public_key = file("./key/terraform.pub")
tags = {
description = "terraform key pair import"
}
}
그 후 위와 같이 입력 후 terraform을 시작하면 아래의 이미지처럼 키페어가 생성된 것을 볼수 있습니다.
key pair을 생성을 했으니 Ec2를 만들어보겠습니다.
data "aws_ami" "ubuntu" {
most_recent = true
filter {
name = "name"
values = ["ubuntu/images/hvm-ssd/ubuntu-focal-20.04-amd64-server-*"]
}
filter {
name = "virtualization-type"
values = ["hvm"]
}
owners = ["099720109477"] # Canonical
}
// Ec2 설정
resource "aws_instance" "example" {
//위에 설정한 AMI로 생성
ami = data.aws_ami.ubuntu.id
//EC2 type 지정
instance_type = "t2.micro"
//EC2 만들때 Key설정
key_name = aws_key_pair.tf-key.key_name
//Tag 이름
tags = {
Name = "Single-WebSrv"
}
}
위의 로직을 실행하면 Ec2가 생성되는 모습을 볼 수 있습니다만, 보안 그룹이 설정이 되어 있지 않아 접속이 되지 않습니다
아래와 같이 보안 그룹을 생성 해줍니다.
//보안 그룹 룰 지정
resource "aws_security_group" "terraform-sg" {
name = "terraform-sg"
description = "terraform-sg"
tags = {
Name = "terraform-sg"
}
}
// 보안 그룹 인바운드 설정
resource "aws_security_group_rule" "terraform-http" {
type = "ingress"
// Port 범위 설정
from_port = 80
to_port = 80
//프로토콜 설정
protocol = "TCP"
// IP 설정
cidr_blocks = ["0.0.0.0/0"]
// 보안 그룹 지정
security_group_id = aws_security_group.terraform-sg.id
lifecycle { create_before_destroy = true }
}
// 보안 그룹 아웃바운드 설정
resource "aws_security_group_rule" "terraform-http-egress" {
type = "egress"
// Port 범위 설정
from_port = 80
to_port = 80
//프로토콜 설정
protocol = "TCP"
// IP 설정
cidr_blocks = ["0.0.0.0/0"]
// 보안 그룹 지정
security_group_id = aws_security_group.terraform-sg.id
lifecycle { create_before_destroy = true }
}
resource "aws_security_group_rule" "terraform-ssh" {
type = "ingress"
from_port = 22
to_port = 22
protocol = "TCP"
cidr_blocks = ["0.0.0.0/0"]
security_group_id = aws_security_group.terraform-sg.id
lifecycle { create_before_destroy = true }
}
resource "aws_security_group_rule" "terraform-https-ssh" {
type = "egress"
from_port = 22
to_port = 22
protocol = "TCP"
cidr_blocks = ["0.0.0.0/0"]
security_group_id = aws_security_group.terraform-sg.id
lifecycle { create_before_destroy = true }
}
이러면 이제 ec2를 ssh로 접속 할 수 있습니다.
이제 ec2가 생성되면서 자동으로 apache를 설치하여 실행되게 할려면 user_data를 이용하여 할 수 있습니다.
Ec2생성할 때 사용자 데이터라고 생각하면 됩니다.
아래는 총 코드입니다.
resource "aws_instance" "example" {
ami = data.aws_ami.ubuntu.id
instance_type = "t2.micro"
//보안 그룹 지정
vpc_security_group_ids = [aws_security_group.terraform-sg.id]
key_name = aws_key_pair.tf-key.key_name
//사용자 데이터 설정
user_data = <<-EOF
#!/bin/bash
sudo apt-get update -y
sudo apt-get install -y apache2
sudo echo "<html><body><h1>Hello</h1></body></html>" > /var/www/html/index.html
sudo systemctl enable apache2
sudo systemctl start apache2
EOF
tags = {
Name = "Single-WebSrv"
}
}
resource "aws_security_group" "terraform-sg" {
name = "terraform-sg"
description = "terraform-sg"
tags = {
Name = "terraform-sg"
}
}
resource "aws_security_group_rule" "terraform-http" {
type = "ingress"
from_port = 80
to_port = 80
protocol = "TCP"
cidr_blocks = ["0.0.0.0/0"]
security_group_id = aws_security_group.terraform-sg.id
lifecycle { create_before_destroy = true }
}
resource "aws_security_group_rule" "terraform-http-egress" {
type = "egress"
from_port = 80
to_port = 80
protocol = "TCP"
cidr_blocks = ["0.0.0.0/0"]
security_group_id = aws_security_group.terraform-sg.id
lifecycle { create_before_destroy = true }
}
resource "aws_security_group_rule" "terraform-ssh" {
type = "ingress"
from_port = 22
to_port = 22
protocol = "TCP"
cidr_blocks = ["0.0.0.0/0"]
security_group_id = aws_security_group.terraform-sg.id
lifecycle { create_before_destroy = true }
}
resource "aws_security_group_rule" "terraform-https-ssh" {
type = "egress"
from_port = 22
to_port = 22
protocol = "TCP"
cidr_blocks = ["0.0.0.0/0"]
security_group_id = aws_security_group.terraform-sg.id
lifecycle { create_before_destroy = true }
}
data "aws_ami" "ubuntu" {
most_recent = true
filter {
name = "name"
values = ["ubuntu/images/hvm-ssd/ubuntu-focal-20.04-amd64-server-*"]
}
filter {
name = "virtualization-type"
values = ["hvm"]
}
owners = ["099720109477"] # Canonical
}
resource "aws_key_pair" "tf-key" {
key_name = "terraform"
public_key = file("./key/terraform.pub")
tags = {
description = "terraform key pair import"
}
}
// 테라폼 터미널에서 나올 로그
output "public_ip" {
value = aws_instance.example.public_ip
description = "The public IP of the Instance"
}
// 테라폼에서 사용할 변수 사용
variable "nickname" {
description = "Your nickname"
type = string
default = "테스트 이름" # 원하는 닉네임으로 변경하세요
}
그러면 아래와 같이 나옵니다.
'Terraform' 카테고리의 다른 글
[Terraform] Terrafrom 사용법 반복문 (0) | 2023.07.16 |
---|---|
[Terraform] Terrafrom 기본 사용법 Local / Output (0) | 2023.07.15 |
[Terraform] Terrform 사용법 데이터소스 / 변수(Variable) (0) | 2023.07.15 |
[Terraform] 테라폼의 기본 개념 (0) | 2023.07.09 |
[Terraform] 테라폼 설치 및 세팅 (0) | 2023.07.05 |