ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Trraform] 테라폼으로 EC2생성 하기 (3)
    공부 2025. 11. 11. 16:28

    설치 후 다음단계인 EC2 생성 홈페이지 예제에는 us-east2 리전으로 설정되어 있어서 

    도쿄리전으로 실습해보려다가 이상한 에러 때문에 한참 해맸다..

     

    Create infrastructure | Terraform | HashiCorp Developer

    Authenticate to AWS and create infrastructure with Terraform. Write and validate Terraform configuration, initialize a configuration directory, and plan and apply a configuration to create infrastructure.

    developer.hashicorp.com

     

    1.  테라폼 파일을 실행할 디렉터리 생성 

    #디렉터리 명은 상관없음 
    mkdir my-terraform
    
    #생성이 되면 이동한다.
    cd my-terraform

     

    2. tf 파일 생성 & 편집

    테라폼의 원리는 테라폼 고유언어로 작성된 tf파일을 실행시켜서

    코드를 정의하여 원하는 인프라를 구축하고 관리하는 형태인듯 하다.

    #이동한 경로에서 
    vi terraform.tf

     

    예시 코드 

    #terraform.tf
    
    terraform {
      required_providers {
        aws = {
          source  = "hashicorp/aws"
          version = "~> 5.92"
        }
      }
    
      required_version = ">= 1.2"
    }

     

    - terraform {..}  : Terraform 자체를 구성하는 부분으로, 설치할 공급자 인프라 프로비저닝에 사용할 Terraform 버전을 입력(포함)한다.

     

    - providers : Terraform은 리소스를 관리를 위해 호출되는 프로바이더(provider)라는 바이너리 플러그인을 사용

                          Terraform provider는 Terraform과 별도로 배포되고 버전이 관리되기때문에.

                          바이너리에서 공급자를 분리함으로써 API를 사용하는 모든 인프라 공급업체를 지원가능.

                          위  예시 블록을 사용하면 테라폼 구성에 사용되는 버전에 제약을 걸 수 있다. 

     

    - HashiCorp를 사용하여 Terraform 레지스트리에서 required_providers를 관리하고, 여기서 공개 Terraform provider와 module을
       가져올 수 있다.

     

    - version : 버전에 제약 조건을 거는 부분으로, 버전으로 인한 오류를 줄이기 위해 사용한다.
                      가능한 한 그 범위 내에서 가장 최신의 패치 버전을 선택한다.

     

    - required_version : 최소한 이 버전 이상으로 해달라하는 최소 버전의 제약 조건

     

    다음으로는 공급자(클라우드), 리전을 어디로 할지, AMI 등 설정을 main.tf에 추가한다.

     

    # 클라우드 공급자, 리전 선택
    provider "aws" {
      region = "ap-northeast-1"
    }
    
    # Amazon Linux 2 AMI 조회
    data "aws_ssm_parameter" "amazon_linux2_ami" {
      name = "/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2"
    }

     

     

    provider 부분을 보면 AWS의 도쿄리전을 선택했고, 아래 AMI관한 부분은 리전에 따라 차이가 있어서 검색해보거나 GPT한테 물어보면 금방 수정가능하다.

     

    data : Terraform에서 data 블록은 이미 존재하는 AWS 리소스, 외부데이터를 read하기 위한 블록(부분)이다.

               즉, 기존 리소스 정보를 가져오는 역할을 한다.

     

    aws_ssm_parameter : AWS의 Systems Manager Parameter Store 안에 저장된 파라미터 값을 읽는 기능을 제공

    ->  AWS에서는 공식적으로 최신 Amazon Linux AMI ID 등을  Systems Manager Parameter Store에 자동 등록하고 있다.

    ->  즉, 매번 콘솔에 최신 AMI ID를 수동 복사할 필요 없이 Terraform 코드로 조회가 가능하다. 

     

    name : 조회할 SSM 파라미터의 전체 경로를 지정 

    name = "/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2"
    
    #/aws/service/ :  AWS가 공식적으로 제공하는 SSM 파라미터 네임스페이스
    
    #ami-amazon-linux-latest/ : 최신 Amazon Linux AMI 목록을 담은 하위 경로
    
    #amzn2-ami-hvm-x86_64-gp2 : Amazon Linux 2, HVM 방식, x86_64 아키텍처, gp2 스토리지 타입의 최신 AMI ID

     

    그리고 이제 단순히 EC2를 작성하고 싶다면 다음 코드를 작성한다. 

    # EC2 인스턴스 생성
    resource "aws_instance" "example" {
      ami                    = data.aws_ssm_parameter.amazon_linux2_ami.value
      instance_type          = "t2.micro"
    }

     

    최종 코드 main.tf

    #보통 아래 코드를 실행하면 기본 VPC, Subnet...등을 알잘딱깔센으로 찾아서 생성하는거 같은데
    #환경이 달라서 그런가.. VPC부터 하나씩 지정했더니 성공했다. (혹시 안된다면 정의해보시길..)
    #거기서 yes를 입력하면 완료 
    
    provider "aws" {
      region = "ap-northeast-1"
    }
    
    data "aws_ssm_parameter" "amazon_linux2_ami" {
      name = "/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2"
    }
    
    resource "aws_instance" "app_server" {
      ami           = data.aws_ssm_parameter.amazon_linux2_ami.value
      instance_type = "t4g.micro"
      tags = {
        Name = "ExampleAppServerInstance"
      }
    }

     

    순서대로 실행 

    terraform init (초기화명령)

    terraform plan (바로 실행되지 않고, 실행되는지 확인)

    terraform apply(실제로 적용)

    terraform state list (생성확인)  

     

    테라폼언어의 구조를 보면 Provider라는 블록, resouce라는 블록 등 Block으로 나누는 특징이 있다.

    실제로 제일 많이 쓰는것은 resouce타입으로 인프라를 생성하는 블록을 넣는다. 

     

    만약 그리고 기존 인프라를 이용해서 생성하고 싶다면 data 블록을 사용해야한다. 

    #data.tf
    data "aws_vpc" "test_vpc" {
      id = "vpc-0053xxxxxxxxxx"
    }
    data "aws_subnet" "test_subnet" {
        id = "subnet-0053xxxxxxxxxx" 
    }

     

    위와 같이 기존에 생성된 vpc id, subnet id를 data 블록에 정의하고 

    #main.tf
    resource "aws_security_group" "test_sg" {
         vpc_id = data.aws_vpc.test_vpc.id
    
        ingress {
            from_port = 22
            to_port = 22
            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 = "test_sg"
      }
    }
    
    resource "aws_instance" "test_ec2" {
        ami = "ami-xxxxxxxxxxxxxxxx"
        instance_type = "t2.micro"
        subnet_id = data.aws_subnet.test_subnet.id
        vpc_security_group_ids = [aws_security_group.test_sg.id]
        associate_public_ip_address = true
    
        tags = {
            Name = "test_ec2"
        }
    }

    이렇게 정의한 기존 리소스 ID를 가져와서 EC2를 생성할 수 있다.

     

    (기본 VPC가 없는 환경이고 따로 생성한 VPC가 있다면 서브넷을 지정해야 EC2생성이 가능함)

    그리고 혹시 실패한다면 환경변수에서 접근키, 비밀키를 설정이 빠졌는지도 확인해보시길 

     

Designed by Tistory.