본문 바로가기

DevOps/Terraform

[Terraform] AWS EC2 Linux 인스턴스 생성(user data 작성)

AWS Cloud Quest: Cloud Practitioner 과정 Terraform으로 해보기 중입니다.

오늘 할 퀘스트~!

https://juyeonee826.tistory.com/167

 

[AWS Cloud Quest] Cloud First Steps

퀘스트 제목 Cloud First Steps 퀘스트 내용 섬의 안정화 시스템이 고장났다. computational modules의 신뢰성과 가용성을 향상해달라. 퀘스트 목표 AWS 리전 및 가용 영역에 대해 익히고, 여러 가용 영역에 A

juyeonee826.tistory.com

 

EC2 생성에 앞서 할 것이 많다.

- Choose Amazon Linux 2 AMI (HVM)
- Instance type, choose t2.micro
- Key pair name, choose Proceed without a key pair.
- Add Security group, Type, choose HTTP.
- Root volume gp2 is selected.
- User data, paste the content that you just copied.

 

VPC, Subnet, AMI Data 추가

main.tf

data "aws_vpc" "default" {
  default = true
}

data "aws_subnets" "default" {
  filter {
    name   = "vpc-id"
    values = [data.aws_vpc.default.id]
  }
}

data "aws_ami" "amazon-linux-2-kernel-5" {
  most_recent = true
  owners      = ["amazon"]
  filter {
    name   = "name"
    values = ["amzn2-ami-kernel-5*"]
  }
}

output "ami-id" {
  value = data.aws_ami.amazon-linux-2-kernel-5.id
}

 

Instance type, root volume Variable 추가

linux-variables.tf

variable "linux_instance_type" {
  type        = string
  description = "EC2 instance type for Linux Server"
  default     = "t2.micro"
}

variable "linux_root_volume_type" {
  type        = string
  description = "Volumen type of root volumen of Linux Server."
  default     = "gp2"
}

 

보안그룹 생성

main.tf

resource "aws_security_group" "aws_linux_sg" {
  name   = "linux-sg"
  vpc_id = data.aws_vpc.default.id
  ingress {
    from_port   = 80
    to_port     = 80
    protocol    = "http"
    cidr_blocks = ["0.0.0.0/0"]
    description = "Allow incoming HTTP connections"
  }
}

 

user_data 넣기

quest에서 준 user-data는 안 되길래 다른 비슷한 걸로 대체

aws-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
availability_zone=$(curl -s http://169.254.169.254/latest/meta-data/placement/availability-zone)
echo "Availability Zone : <span style='color:blue;'>$(echo $availability_zone)</span>" > /var/www/html/index.html

 

위에 것들 조합해서 EC2 생성

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

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

 

Public IPv4 DNS Output 작성

output "linux_server_public_dns" {
  value = aws_instance.linux_server.public_dns
}

 

가용 영역 다른 EC2 추가

resource "aws_instance" "linux_server_v2" {
  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("aws-user-data.sh")

  root_block_device {
    volume_size           = 8
    volume_type           = var.linux_root_volume_type
    delete_on_termination = true
    encrypted             = true
  }
}
# data.aws_subnets.default.ids[3] 다른 서브넷을 선택하도록 했다.

 

결과 페이지

 

참고

https://gmusumeci.medium.com/how-to-deploy-an-amazon-linux-ec2-instance-in-aws-using-terraform-d3ed50998714

 

How to Deploy an Amazon Linux EC2 Instance in AWS using Terraform

In this story, we will learn how to deploy an Amazon Linux EC2 Instance (VM) in AWS using Terraform.

gmusumeci.medium.com

https://www.middlewareinventory.com/blog/terraform-aws-example-ec2/

 

Terraform AWS Example - Create EC2 instance with Terraform | DevOps Junction

Terraform AWS Example. Create EC2 instance with Terraform. Terraform AWS example on how to create AWS resources with Terraform. Create a Security Group using Terraform. Infrastructure as Code Example. Terraform aws Configuration file example and terraform

www.middlewareinventory.com

https://ltlkodae.tistory.com/48

 

AWS EC2 User Data 사용하기 (feat 로그, 내용확인)

EC2 User Data 사용방법에 대해서 간단히 정리해보자 EC2 User Data란? EC2가 생성되면서 실행되는 일종의 script 이다. 예를들어 5대의 EC2를 생성해서 패키지를 설치해야 한다고 가정해보자. 5대를 생성 ->

ltlkodae.tistory.com

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

 

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

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

dev.classmethod.jp