본문 바로가기

DevOps/Terraform

[Terraform] AWS 웹 서버 생성, 라우팅 테이블 수정

AWS Cloud Quest: Cloud Practitioner 과정 Terraform으로 해보기 중입니다.
오늘 할 퀘스트~!
https://juyeonee826.tistory.com/172

[AWS Cloud Quest] Networking Concepts

퀘스트 제목 Networking Concepts 퀘스트 내용 은행이 리소스와 인터넷 간의 통신을 허용하는 안전한 네트워킹 환경을 구축해줘라 퀘스트 목표 - AVPCs, subnets, internet gateways and route tables의 주요 기능을

juyeonee826.tistory.com

 

TODO

- NAT 게이트웨이 생성
- NAT 게이트웨이 연결한 서브넷 생성
- 위 서브넷 인터넷 게이트웨이 연결로 라우팅 테이블 수정
- 80 포트 허용한 보안그룹 생성
- 퍼블릭 서브넷 연결한 웹 서버 EC2 생성
 

80 포트 허용한 보안그룹 생성

instance-type-user-data.sh

#!/bin/bash -xe
exec > >(tee /var/log/user-data.log|logger -t user-data -s 2>/dev/console) 2>&1
echo "nameserver 8.8.8.8" > /etc/resolv.conf
echo "nameserver 168.126.63.1" >> /etc/resolv.conf
echo "nameserver 210.220.163.82" >> /etc/resolv.conf
echo "nameserver 164.124.101.2" >> /etc/resolv.conf
sudo yum update -y
sudo yum install -y httpd.x86_64
sudo systemctl start httpd.service
sudo systemctl enable httpd.service
instance_type=$(curl -s http://169.254.169.254/latest/meta-data/instance-type)
echo "EC2 Instance Type : <span style='color:blue;'>$(echo $instance_type)</span>" > /var/www/html/index.html

 

EC2 생성

resource "aws_instance" "instance_type_quest_server" {
  ami                    = data.aws_ami.amazon_linux_2_kernel_5.id
  instance_type          = var.linux_instance_type
  subnet_id              = data.aws_subnets.default.ids[3]
  vpc_security_group_ids = [aws_security_group.aws_linux_sg.id]
  user_data              = file("instance-type-user-data.sh")

  root_block_device {
    volume_size           = 8
    volume_type           = var.linux_root_volume_type
    delete_on_termination = true
    encrypted             = true
  }
}

 

인스턴스 유형 변경

기존 정의해둔 variable을 활용하여 변경해준다.

terraform plan -var linux_instance_type=t3.medium
terraform apply -var linux_instance_type=t3.medium

 

user data 인스턴스 재시작 할 때마다 재실행 되게 하기

user data는 인스턴스 생성 시에만 실행되기 때문에 index 페이지의 메타데이터가 변경되지 않았다.
아래와 같이 user data를 수정하면 인스턴스가 재시작 될 때마다 user data script가 재실행된다.
instance-type-user-data.sh

Content-Type: multipart/mixed; boundary="//"
MIME-Version: 1.0

--//                                      
Content-Type: text/cloud-config; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="cloud-config.txt"

#cloud-config
cloud_final_modules:
- [scripts-user, always]

--//                                                                
Content-Type: text/x-shellscript; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="userdata.txt"

#!/bin/bash -xe
exec > >(tee /var/log/user-data.log|logger -t user-data -s 2>/dev/console) 2>&1
echo "nameserver 8.8.8.8" > /etc/resolv.conf
echo "nameserver 168.126.63.1" >> /etc/resolv.conf
echo "nameserver 210.220.163.82" >> /etc/resolv.conf
echo "nameserver 164.124.101.2" >> /etc/resolv.conf
sudo yum update -y
sudo yum install -y httpd.x86_64
sudo systemctl start httpd.service
sudo systemctl enable httpd.service
instance_type=$(curl -s http://169.254.169.254/latest/meta-data/instance-type)
echo "EC2 Instance Type : <span style='color:blue;'>$(echo $instance_type)</span>" > /var/www/html/index.html
--//--

 

결과 페이지

인스턴스 유형 변경 전
인스턴스 유형 변경 후

 
참고
https://dev.classmethod.jp/articles/check-the-ec2-instance-metadata/

메타데이터란? EC2 인스턴스 메타데이터 확인해 보기 | DevelopersIO

메타데이터가 무엇인지에 대해서 알아보고, EC2 인스턴스 메타데이터 정보를 확인해 봤습니다.

dev.classmethod.jp

https://kim-dragon.tistory.com/222

[AWS] EC2 Linux 인스턴스 재부팅시에도 UserData 실행하기

Intro 기본적으로 UserData는 EC2생성시에 한 번만 실행되도록 설정되어있습니다. 이는 cloud-init의 cloud_final_modules에서 기본값으로 once로 설정이 되어있기 때문입니다. 실제 EC2에 SSH로 접속하여 아래

kim-dragon.tistory.com