본문 바로가기
Cloud/AWS

[콘솔과 테라폼 구현] 첫 사용자 1명 : 단일 EC2 + EIP

by 민휘 2023. 10. 22.

아키텍처

  • 단일 EC2 인스턴스 : 웹 서버, 데이터베이스, 파일 저장 등을 처리
  • 단일 Elastic IP : 한대의 EC2 인스턴스가 사용하는 고정 public IP (사용 지양)
  • Route 53 : Elastic IP를 등록하고 DNS name을 제공하는 AWS의 DNS 서비스

 

문제점

  • 페일오버 없음
  • 이중화 없음

→ 한 바구니에 계란을 모두 담지 말자

 

 

구현 사항

  • EC2 인스턴스 생성
  • Elastic IP 할당
  • EC2를 웹 서버로 만들기

 

콘솔 구현

 

자료

 

1. EC2 인스턴스 생성

  • 이름 : step1-ec2-console
  • AMI : AMI 2 (HVM)
  • 인스턴스 유형 : t2.micro
  • 네트워크 설정 : 보안 그룹 생성, SSH 및 인터넷 HTTP 트래픽 허용
  • 사용자 데이터 (user data) - 아래 참고
  • 나머지는 디폴트 설정, 인스턴스 SSH 접속 확인 안할거라 로그인 키 페어 생성할 필요 없음
#!/bin/bash 
# Use this for your user data (script from top to bottom) 
# install httpd (Linux 2 version) 
yum update -y 
yum install -y httpd 
systemctl start httpd 
systemctl enable httpd 
echo "<h1>Hello World from $(hostname -f)</h1>" > /var/www/html/index.html

 

2. Elastic IP 할당

 

3. Elastic IP와 EC2 연결

 

4. Elastic IP로 접속한 결과

 

 

테라폼 구현

 

자료

 

1. AWS CLI key를 환경변수로 추출

환경변수로 credential을 할당하는 것은 AWS_SHARED_CREDENTIALS_FILE 과 AWS_PROFILE 을 재정의하는 것이다.

export AWS_ACCESS_KEY_ID=^^
export AWS_SECRET_ACCESS_KEY=^^
export AWS_DEFAULT_REGION=ap-northeast-2
provider "aws" {}

 

2. 테라폼 코드 작성

필요한 설정

  • aws provider : zone, access key, secret access key가 필요한데 환경변수에서 가져옴
  • ami : ami-0f0cc846201190547 (Amazon Linux 2 AMI)
  • instance_type : t2.micro
  • user_data
  • http 허용 보안그룹 생성 및 인스턴스 할당
  • elastic ip 생성 및 인스턴스 할당
terraform {
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 4.16"
    }
  }

  required_version = ">= 1.2.0"
}

provider "aws" {
}

resource "aws_instance" "step1-ec2-terraform" {
  ami           = "ami-0f0cc846201190547"
  instance_type = "t2.micro"
  vpc_security_group_ids = [aws_security_group.step1-sg-terraform.id]
  user_data = <<EOF
#!/bin/bash
# Use this for your user data (script from top to bottom)
# install httpd (Linux 2 version)
yum update -y
yum install -y httpd
systemctl start httpd
systemctl enable httpd
echo "<h1>Hello World from $(hostname -f)</h1>" > /var/www/html/index.html
EOF

  tags = {
    Name = "step1-ec2-terraform"
  }
}

resource "aws_eip" "step1-eip-terraform" {
  instance = aws_instance.step1-ec2-terraform.id
  vpc      = true
}

resource "aws_security_group" "step1-sg-terraform" {
  name = "allow HTTP"
  ingress {
    from_port = 80
    to_port = 80
    protocol = "tcp"
    cidr_blocks = ["0.0.0.0/0"]
  }

  egress {
    from_port = 0
    to_port = 0
    protocol = "-1"
    cidr_blocks = ["0.0.0.0/0"]
  }
}

 

3. 프로비저닝 결과 확인

EC2 인스턴스

 

SG

 

Elastic IP

 

생성된 리소스 관계 확인