λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
DevOps/Terraform

[Terraform] 1. μΈμŠ€ν„΄μŠ€ 생성

by νƒœμ˜Ή 2023. 8. 8.

πŸ‘‡πŸ» 이전글 μ°Έκ³ 

 

Cloud9μ—μ„œ ν‚€νŽ˜μ–΄ 생성 ν›„ AWS에 등둝

ν‚€νŽ˜μ–΄λ₯Ό μƒμ„±ν•˜λŠ” λ°©λ²•μ—λŠ” λ‹€μŒμ˜ 두 가지 방법이 μžˆλ‹€. 1. AWS μ½˜μ†”μ—μ„œ ν‚€νŽ˜μ–΄ 생성 -> Cloud9 μΈμŠ€ν„΄μŠ€λ‘œ 가지고 였기 2. Cloud9 μΈμŠ€ν„΄μŠ€μ—μ„œ ν‚€νŽ˜μ–΄ 생성 -> AWS에 λ“±λ‘ν•˜κΈ° μš°λ¦¬λŠ” 2번째 방법(SSH

taetoungs-branch.tistory.com


κΈ°λŒ€ν•˜λŠ” ꡬ성

0. provider 지정

provider "aws" {
#  access_key = "μžμ‹ μ˜ Key λ₯Ό μž…λ ₯" # Cloud9 을 μ‚¬μš©ν•˜λ©΄ IAM Role 을 ν™œμš©ν•˜κ²Œ λ©λ‹ˆλ‹€. 만일 Mac μ‚¬μš©μžλŠ” IAM μ—μ„œ λ°œκΈ‰ν•΄μ•Ό ν•©λ‹ˆλ‹€.
#  secret_key = "μžμ‹ μ˜ Key λ₯Ό μž…λ ₯"
  region = "ap-northeast-2"
}

ν…ŒλΌνΌμ—μ„œ μ‚¬μš©ν•˜λŠ” providerλž€ AWS, Azure, GCP 등을 λ§ν•œλ‹€. μ•„λž˜μ˜ λ§ν¬μ—μ„œ 확인할 수 μžˆλ‹€.

 

Terraform Registry

 

registry.terraform.io

access key, secret keyκ°€ μžˆλŠ” 경우 μ†μ„±κ°’μœΌλ‘œ μž…λ ₯ν•  수 μžˆλ‹€. ν˜„μž¬ μ‹€μŠ΅μ—μ„œλŠ” Cloud9μ—μ„œ AWSCloud9SSMInstanceProfile Role을 μ‚¬μš©ν•˜λ―€λ‘œ μƒλž΅ν•œλ‹€.

 

 

1. AWS에 public key 등둝

# aws에 importν•˜λŠ” λͺ…λ Ήμ–΄λž‘ 같은거 -> 이미 같은 μ΄λ¦„μ˜ ν‚€νŽ˜μ–΄κ°€ μ—…λ‘œλ“œλ˜μ–΄μžˆμœΌλ©΄ μΆ©λŒλ‚¨
resource "aws_key_pair" "key-pair" {
  key_name = "terraform-key"
  public_key = file("/home/ec2-user/.ssh/tf-key.pub")
}

이전 κΈ€μ—μ„œ AWS CLI λͺ…λ Ήμ–΄λ₯Ό μ‚¬μš©ν•΄μ„œ Cloud9에 μœ„μΉ˜ν•œ public keyλ₯Ό importν•΄μ£ΌλŠ” λͺ…령어와 λ™μΌν•œ μž‘μ—…μ„ μˆ˜ν–‰ν•œλ‹€.

public keyλ₯Ό ν•˜λ“œμ½”λ”©μœΌλ‘œ 직접 넣어쀄 μˆ˜λ„ μžˆκ² μ§€λ§Œ λ³΄μ•ˆμƒ κ·Έλ ‡κ²Œ μ‚¬μš©ν•˜μ§€ μ•ŠλŠ”λ‹€. 이 μ½”λ“œμ—μ„œλŠ” Cloud9의 /home/ec2-user/.ssh 디렉토리에 μžˆλŠ” public keyνŒŒμΌμ„ μ°Έμ‘°ν•˜λ„λ‘ μž‘μ„±ν–ˆλ‹€.

 

 

2. AMI 지정

data "aws_ami" "amzn2" {
  most_recent = true
  
  filter {
    name   = "name"
    values = ["amzn2-ami-hvm-2.0.*-x86_64-gp2"]
  }
  
  filter {
    name   = "virtualization-type"
    values = ["hvm"]
  }
  
  owners = ["amazon"] # Canonical
}

AWSμ—μ„œ κ°€μž₯ 졜근의 Amazon Linux 2, HVM 가상화, x86_64 μ•„ν‚€ν…μ²˜, gp2 λ³Όλ₯¨ νƒ€μž…μ„ 가진 AMI 정보λ₯Ό κ°€μ Έμ˜¨λ‹€.

 

 

3. λ³΄μ•ˆκ·Έλ£Ή 생성

resource "aws_security_group" "sg_web" {
  name        = "sg_web"
  description = "Allow web inbound traffic"
  vpc_id      = "<VPC ID>" # μ‚¬μš©ν•˜κ³ μžν•˜λŠ” VPC ID μž…λ ₯

  ingress {
    description = "Web from VPC"
    from_port   = 0
    to_port     = 0
    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"]
  }

  tags = {
    Name = "allow_web"
  }
}

πŸ‘‡πŸ» λͺ…λ Ήμ–΄ μ„€λͺ…

더보기

ν•΄λ‹Ή ν…ŒλΌνΌ μ½”λ“œλŠ” AWS에 λ³΄μ•ˆ κ·Έλ£Ήμ„ μƒμ„±ν•˜κΈ° μœ„ν•œ μ½”λ“œμž…λ‹ˆλ‹€. κ° λΆ€λΆ„에 λŒ€ν•΄ μƒμ„Έν•˜κ²Œ μ„€λͺ…ν•˜κ² μŠ΅λ‹ˆλ‹€.

1. κΈ°λ³Έ 정보 :

resource "aws_security_group" "sg_web" {
  name        = "sg_web"
  description = "Allow web inbound traffic"
  vpc_id      = "<VPC ID>" # μ‚¬μš©ν•˜κ³ μžν•˜λŠ” VPC ID μž…λ ₯


- `resource "aws_security_group" "sg_web"`: AWS λ³΄μ•ˆ κ·Έλ£Ή λ¦¬μ†ŒμŠ€λ₯Ό μƒμ„±ν•˜λŠ” μ„ μ–Έμž…λ‹ˆλ‹€. 이 λ¦¬μ†ŒμŠ€μ˜ local name은 "sg_web"μž…λ‹ˆλ‹€.
- `name`: 생성될 λ³΄μ•ˆ 그룹의 μ΄λ¦„μž…λ‹ˆλ‹€.
- `vpc_id`: ν•΄λ‹Ή λ³΄μ•ˆ κ·Έλ£Ήμ΄ μ—°κ²°λ  VPC의 IDμž…λ‹ˆλ‹€. `<VPC ID>`λŠ” μ‹€μ œ VPC ID둜 λ³€κ²½ν•΄μ•Ό ν•©λ‹ˆλ‹€.


2. μˆ˜μ‹  κ·œμΉ™ (Ingress) :

  ingress {
    description = "Web from VPC"
    from_port   = 0
    to_port     = 0
    protocol    = "-1"
    cidr_blocks = ["0.0.0.0/0"]
  }


- `from_port` 및 `to_port`: μˆ˜μ‹ μ„ ν—ˆμš©ν•˜λŠ” 포트 λ²”μœ„μž…λ‹ˆλ‹€. μ—¬κΈ°μ„œλŠ” 0으둜 μ„€μ •λ˜μ–΄ μžˆμ–΄ μ‹€μ œ 포트 정보가 λˆ„λ½λ˜μ—ˆμ„ κ°€λŠ₯성이 μžˆμŠ΅λ‹ˆλ‹€.
- `protocol`: "-1"은 λͺ¨λ“  ν”„λ‘œν† μ½œμ„ ν—ˆμš©ν•œλ‹€λŠ” μ˜λ―Έμž…λ‹ˆλ‹€.
- `cidr_blocks`: μˆ˜μ‹ μ„ ν—ˆμš©ν•˜λŠ” IP μ£Όμ†Œ λ²”μœ„μž…λ‹ˆλ‹€. "0.0.0.0/0"은 λͺ¨λ“  IP μ£Όμ†Œμ—μ„œμ˜ μ ‘근을 ν—ˆμš©ν•¨μ„ μ˜λ―Έν•©λ‹ˆλ‹€.


3. λ°œμ‹  κ·œμΉ™ (Egress) :

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


- `from_port` λ° `to_port`: λ°œμ‹ μ„ ν—ˆμš©ν•˜λŠ” ν¬νŠΈ λ²”μœ„μž…λ‹ˆλ‹€. 0으둜 μ„€μ •λ˜μ–΄ μžˆμœΌλ‚˜, ν”„λ‘œν† μ½œμ΄ "-1"둜 μ„€μ •λ˜μ–΄ μžˆμ–΄ λͺ¨λ“  ν¬νŠΈλ₯Ό μ˜λ―Έν•©λ‹ˆλ‹€.
- `protocol`: "-1"은 λͺ¨λ“  ν”„λ‘œν† μ½œμ„ ν—ˆμš©ν•œλ‹€λŠ” μ˜λ―Έμž…λ‹ˆλ‹€.
- `cidr_blocks`: λ°œμ‹ μ„ ν—ˆμš©ν•˜λŠ” IP μ£Όμ†Œ λ²”μœ„μž…λ‹ˆλ‹€. μ—¬κΈ°μ„œλ„ "0.0.0.0/0"은 λͺ¨λ“  IP μ£Όμ†Œλ‘œμ˜ μ ‘근을 ν—ˆμš©ν•¨μ„ μ˜λ―Έν•©λ‹ˆλ‹€.


4. νƒœκ·Έ (Tags) :

  tags = {
    Name = "allow_web"
  }


- `tags`: AWS λ¦¬μ†ŒμŠ€μ— μΆ”κ°€ν•  수 μžˆλŠ” λ©”νƒ€λ°μ΄ν„°μž…λ‹ˆλ‹€. μ—¬κΈ°μ„œλŠ” Name νƒœκ·Έμ— "allow_web" 값을 λΆ€μ—¬ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

 

"sg_web"μ΄λΌλŠ” μ΄λ¦„μ˜ AWS λ³΄μ•ˆ 그룹을 μƒμ„±ν•œλ‹€. 이 λ³΄μ•ˆκ·Έλ£Ήμ€ λͺ¨λ“  IPμ—μ„œ TCP ν”„λ‘œν† μ½œλ‘œμ˜ μˆ˜μ‹  접근을 ν—ˆμš©ν•˜κ³ , λͺ¨λ“  IP둜의 λͺ¨λ“  ν”„λ‘œν† μ½œ 및 포트둜의 λ°œμ‹ μ„ ν—ˆμš©ν•˜λŠ” 섀정을 가지고 μžˆλ‹€. (μ›λž˜ μ΄λ ‡κ²Œ λ‹€ μ˜€ν”ˆν•΄λ†“μœΌλ©΄ μ•ˆλ˜μ§€λ§Œ μ‹€μŠ΅ μƒν™©μ΄λ―€λ‘œ μ „μ²΄ν—ˆμš©μ„ ν•΄λ†“μ•˜λ‹€.)

 

 

4. μΈμŠ€ν„΄μŠ€ μ •μ˜

resource "aws_instance" "example-2a" {
  ami           = data.aws_ami.amzn2.id # 이전에 μ •μ˜λœ aws_ami 데이터 μ†ŒμŠ€μ—μ„œ amzn2 AMI의 IDλ₯Ό μ°Έμ‘°
  instance_type = "t2.micro"
  key_name      = "tf-key"
  vpc_security_group_ids = [aws_security_group.sg_web.id]  # 이전에 μ •μ˜λœ aws_security_group λ¦¬μ†ŒμŠ€μ—μ„œ sg_web λ³΄μ•ˆ 그룹의 IDλ₯Ό μ°Έμ‘°ν•©λ‹ˆλ‹€.
  subnet_id = "ap-northeast-2a의 μ„œλΈŒλ„· id"
  availability_zone = "ap-northeast-2a"
  user_data = file("./userdata.sh")
  
  tags = {
    Name = "Terraform-ec2-2a"
  }
}

resource "aws_instance" "example-2c" {
  ami           = data.aws_ami.amzn2.id 
  instance_type = "t2.micro"
  key_name      = "tf-key"
  vpc_security_group_ids = [aws_security_group.sg_web.id]
  subnet_id = "ap-northeast-2c의 μ„œλΈŒλ„· id"
  availability_zone = "ap-northeast-2c"
  user_data = file("./userdata.sh")

  tags = {
    Name = "Terraform-ec2-2c"
  }
}

ap-northeast-2 리전에 μžˆλŠ” 두 개의 λ‹€λ₯Έ κ°€μš© μ˜μ—­(2a와 2c)에 EC2 μΈμŠ€ν„΄μŠ€λ₯Ό 각각 ν•˜λ‚˜μ”© μƒμ„±ν•œλ‹€.

두 μΈμŠ€ν„΄μŠ€ λͺ¨λ‘ λ™μΌν•œ AMI, μΈμŠ€ν„΄μŠ€ μœ ν˜•, ν‚€ 이름, λ³΄μ•ˆ κ·Έλ£Ή 및 μ‚¬μš©μž 데이터λ₯Ό μ‚¬μš©ν•˜κ³  μžˆλ‹€. 차이점은 λ‹€λ₯Έ μ„œλΈŒλ„·, κ°€μš© μ˜μ—­μ— μœ„μΉ˜ν•œλ‹€λŠ” 것이닀.

 

user_dataλŠ” EC2 μΈμŠ€ν„΄μŠ€ μ‹œμž‘ μ‹œ μ‹€ν–‰ν•  슀크립트λ₯Ό 지정할 수 μžˆλ‹€.

./userdata.shλΌλŠ” νŒŒμΌμ„ μƒμ„±ν•΄μ„œ user_data의 κ°’μœΌλ‘œ 지정해쀀닀.

 

 

5. user_data 슀크립트 μƒμ„±

#!/bin/sh

# Install a LAMP stack
amazon-linux-extras install -y lamp-mariadb10.2-php7.2 php7.2
yum -y install httpd php-mbstring

# Start the web server
chkconfig httpd on
systemctl start httpd

# Install the web pages for our lab
if [ ! -f /var/www/html/immersion-day-app-php7.tar.gz ]; then
   cd /var/www/html
   wget https://aws-joozero.s3.ap-northeast-2.amazonaws.com/immersion-day-app-php7.tar.gz  
   tar xvfz immersion-day-app-php7.tar.gz
fi

# Install the AWS SDK for PHP
if [ ! -f /var/www/html/aws.zip ]; then
   cd /var/www/html
   mkdir vendor
   cd vendor
   wget https://docs.aws.amazon.com/aws-sdk-php/v3/download/aws.zip
   unzip aws.zip
fi

# Update existing packages
yum -y update

Amazon Linux 2 AMIμ—μ„œ LAMP(Linux, Apache, MariaDB, PHP) μŠ€νƒμ„ μ„€μΉ˜ν•˜κ³  μ„€μ •ν•˜λŠ” μŠ€ν¬λ¦½νŠΈμ΄λ‹€.

이 μŠ€ν¬λ¦½νŠΈλŠ” ν…ŒλΌνΌμœΌλ‘œ μƒμ„±λœ μƒˆ EC2 μΈμŠ€ν„΄μŠ€μ—μ„œ μ‹€ν–‰λœλ‹€.

이런 νŽ˜μ΄μ§€κ°€ λœ¬λ‹€λ©΄ ok!

 

 

 

λ‘œλ“œλ°ΈλŸ°μ„œ 생성 및 μ—°κ²° μž‘μ—…μ€ λ‹€μŒ κΈ€μ—μ„œ μ΄μ–΄μ„œ μž‘μ„±ν•˜κ² λ‹€! πŸ‘Ύ

'DevOps > Terraform' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

[Terraform] 2. λ‘œλ“œλ°ΈλŸ°μ„œ 생성 및 μ—°κ²°  (0) 2023.08.08

λŒ“κΈ€