본문 바로가기

DevOps/Terraform

[T102 3주차] (9) 테라폼 도전과제

cloudNet@ 팀의 가시다 님이 진행하는 테라폼 102 스터디 2주차 정리입니다.

3주차 내용: 

테라폼 기본사용법 (3) + 도전과제

  • 조건문을 활용하여 (각자 편리한) AWS 리소스를 배포하는 코드를 작성해보자! 
  • 내장 함수을 활용하여 (각자 편리한) 리소스를 배포하는 코드를 작성해보자! 
  • AWS EC2 배포 시 remote-exec/file 프로비저너 혹은 terraform-provider-ansible를 활용하는 코드를 작성해보자! 
  • terraform_data 리소스와 trigger_replace 를 사용한 테라폼 코드를 작성해보자!

1.  조건문 활용 AWS 리소스 배포

  • ami 리소스에 instance type을 조건문을 활용하여 
  • variable 변수를 입력하지 않았을때 자동으로 t2.micro를 입력
provider "aws" {
  region  = "ap-northeast-2"
}

variable ec2_type {
  type        = string
  default     = ""
  description = "description"
}


data "aws_ami" "last_ami" {
  most_recent = true

  filter {
    name   = "owner-alias"
    values = ["amazon"]
  }

  filter {
    name   = "name"
    values = ["amzn2-ami-hvm-*-x86_64-ebs"]
  }

  owners = ["amazon"]
}

resource "aws_instance" "server" {
  count = 1

  ami           = data.aws_ami.last_ami.id
  instance_type = var.ec2_type != "" ? var.ec2_type : "t2.nano"

  tags = {
    Name = "Server ${count.index}"
  }
}

2. 내장 함수

  • 내장함수 timestamp 활용하여 EC2 tag에 생성시간 태깅하기
locals {
  timestamp = "${timestamp()}"
  timestamp_sanitized = "${replace("${local.timestamp}", "/[- TZ:]/", "")}"

}

resource "aws_instance" "myec2" {
  
  depends_on = [
    aws_internet_gateway.myigw
  ]
  count = 4
  key_name        = "koo-seoul"
  ami                         = "ami-04341a215040f91bb"
  associate_public_ip_address = true
  instance_type               = "t2.medium"
  vpc_security_group_ids      = ["${aws_security_group.mysg.id}"]
  subnet_id                   = aws_subnet.mysubnet1.id

  tags = {
    Name = "Koo-kubespray"
    Timestamp = "${local.timestamp_sanitized}"
  }
}
  • 태깅은 유용하게 쓸수 있을것 같다.


3.  remote-exec 를 활용

  • terraform을 통해 ec2 를 배포하고 그후 remote-exec을 통해 접속하여 스크립트를 실행할것
  • remote 접속시 key pair을 로컬 경로에 위치하여 connection을 맺는다.
provider "aws" {
  region = "ap-northeast-2"
}

resource "aws_security_group" "instance" {
  name = "t101sg"

  ingress {
    from_port   = 80
    to_port     = 80
    protocol    = "tcp"
    cidr_blocks = ["0.0.0.0/0"]
  }

  ingress {
    from_port   = 22
    to_port     = 22
    protocol    = "tcp"
    cidr_blocks = ["0.0.0.0/0"]
  }

}

resource "aws_instance" "example" {
  ami                    = "ami-0c9c942bd7bf113a2"
  instance_type          = "t2.micro"
  subnet_id              = "subnet-6ab23401"
  private_ip             = "172.31.0.100"
  key_name               = "koo-seoul" # 각자 자신의 EC2 SSH Keypair 이름 지정
  vpc_security_group_ids = [aws_security_group.instance.id]

  user_data = <<-EOF
              #!/bin/bash
              echo "Hello, T101 Study" > index.html
              nohup busybox httpd -f -p 80 &
              EOF

  tags = {
    Name = "koo-Web"
  }

}

resource "aws_eip" "myeip" {
  #vpc = true
  instance = aws_instance.example.id
  associate_with_private_ip = "172.31.0.100"
}

resource "null_resource" "echomyeip" {
  provisioner "remote-exec" {
    connection {
      host = aws_eip.myeip.public_ip
      type = "ssh"
      user = "ubuntu"
      private_key =  file("/Users/mzc01-kook/Downloads/koo-seoul.pem") # 각자 자신의 EC2 SSH Keypair 파일 위치 지정
      #password = "qwe123"
    }
    inline = [
      "echo ${aws_eip.myeip.public_ip}"
      ]
  }
}
output "public_ip" {
  value       = aws_instance.example.public_ip
  description = "The public IP of the Instance"
}

output "eip" {
  value       = aws_eip.myeip.public_ip
  description = "The EIP of the Instance"
}
  • output으로 eip와 public ip를 출력한다.
eip = "43.200.209.108"
public_ip = "3.38.250.201"


 

[도전과제 7번] vSphre 프로바이더를 사용하여 인스턴스를 배포해보세요! 

다음 게시물에서 확인하세요! 

https://themapisto.tistory.com/204