본문 바로가기

IaC

테라폼 스터디 3주차

테라폼 설치

Linux

wget -O - https://apt.releases.hashicorp.com/gpg |  sudo gpg --dearmor -o /usr/share/keyrings/hashicorp-archive-keyring.gpg
 echo  "deb [arch= $( dpkg --print-architecture ) signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] https://apt.releases.hashicorp.com $( lsb_release -cs ) main"  |  sudo  tee /etc/apt/sources.list.d/hashicorp.list
 sudo  apt update &&  sudo  apt install terraform

 

 

설치 확인

terraform -help

 

 

Terraform 명령에 대해 Tab 완성을 활성화할 수 있습니다.

 

Bash

touch ~/.bashrc

 

 


 

(선택) vscode extension 설치

terraform extension

 

terraform 코드를 자동완성 하거나, 보기 좋게 키워드 색상을 변경해 주는 익스텐션 설치

 

 

Getting started with terraform

준비 사항 : docker 설치

 

 

작업 디렉토리에 다음과 같은 .tf파일을 구성합니다.

 

main.tf

terraform {
  required_providers {
    docker = {
      source  = "kreuzwerker/docker"
      version = "~> 3.0.1"
    }
  }
}

provider "docker" {}

resource "docker_image" "nginx" {
  name         = "nginx"
  keep_locally = false
}

resource "docker_container" "nginx" {
  image = docker_image.nginx.image_id
  name  = "tutorial"

  ports {
    internal = 80
    external = 8000
  }
}

 

 

 

테라폼 실행에 필요한 공급자 플러그인을 다운받는 terraform init 명령어를 실행합니다.

terraform init

 

terraform init

 

 

 

실제로 리소스를 생성하기 전에, terraform plan을 이용하여 미리 생성되는 리소스를 확인할 수 있습니다.

 

terraform plan

 

terraform plan

 

 

 

terraform apply를 통해 실제로 리소스를 생성할 수 있습니다.

 

terraform apply

 

terraform apply를 하기 전에, 진행할 것인지 묻는다

 

terraform apply 명령어를 실행하였을 때, 먼저 plan한 결과를 보여준 후, apply를 진행할 것인지 한번 더 묻습니다.

 

이 부분에서 'yes'가 아닌 값을 입력하게 되면, apply는 취소됩니다.

 


 

 

'yes' 라고 입력한 경우에는, apply가 진행되어, 리소스가 생성됩니다.

apply를 진행한 모습

 

 

실제로 리소스가 생성된 것을 확인할 수 있습니다.

 

docker ps

 

 

 

 

리소스를 제거합니다.

 

terraform destroy

 


 

예제 테라폼 코드 분석

terraform {
  required_providers {
    docker = {
      source  = "kreuzwerker/docker"
      version = "~> 3.0.1"
    }
  }
}

 

  • terraform 블럭은 terraform 설정을 정의하는 블록이다.
  • required_providers 섹션은 Terraform이 사용할 provider를 정의한다. 여기서는 Docker provider
    • source : 해당 provider의 위치
    • version : 해당 provider의 버전 / '~> 3. 0. 1' 은 3.0.1 을 최소 버전을 사용하되, 3.x 버전대에서 호환되는 최신 버전을 사용하겠다~
provider "docker" {}

 

  • docker provider에 대한 설정
  • docker host의 기본 설정을 사용한다.

 

resource "docker_image" "nginx" {
  name         = "nginx"
  keep_locally = false
}

 

  • 리소스는 '도커 이미지', 이름은 'nginx' (리소스 블록의 이름 / 리소스를 식별하는 데 사용됨)
  • name : 사용할 이미지의 이름 (실제 도커 이미지의 이름)
  • keep_locally : 컨테이너 실행 후, 이미지를 로컬에 남길지, 제거할지 결정

 

resource "docker_container" "nginx" {
  image = docker_image.nginx.image_id
  name  = "tutorial"

  ports {
    internal = 80
    external = 8000
  }
}

 

  • 리소스는 도커 컨테이너, 이름은 nginx
  • image : 컨테이너가 사용할 이미지, 앞서 정의된 docker_image 리소스의 이름과 이미지 id를 참조한다. (docker_image.nginx.image_id)
  • name : 컨테이너 이름
  • ports.internal : 컨테이너 내에서 80번 포트 사용
  • ports.external : 호스트 시스템에서 8000번 포트가 외부와 연결됨. 8000:80 / 8000번 포트를 통해 컨테이너의 80포트에 접근할 수 있게 된다.

terraform으로 간단한 AWS 리소스 생성해보기

 

  • Terraform CLI가 설치되어 있어야 합니다. (앞의 과정에서 완료)
  • AWS CLI가 설치되어 있어야 합니다.
  • 리소스 생성에 필요한 AWS 계정과 관련된 credential이 필요합니다.

 

 

 

AWS CLI 설치

무결성을 확인하지 않고 설치하기

curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install

 

 

무결성 확인 후 설치를 위해선 다음 링크를 참조하세요.

 

 

Installing or updating to the latest version of the AWS CLI - AWS Command Line Interface

When updating from a previous version, the unzip command prompts to overwrite existing files. To skip these prompts, such as with script automation, use the -u update flag for unzip. This flag automatically updates existing files and creates new ones as ne

docs.aws.amazon.com

 

 

설치 확인

aws --version

 

 

 

리소스 생성에 필요한 credential 생성하기

 

 

기본적으로 AWS 리소스 생성을 하기 위해선

  • AWS_ACCESS_KEY_ID
  • AWS_SECRET_ACCESS_KEY

이 두가지 값이 필요합니다.

 

 

생성하는 과정은 다음과 같습니다.

  1. AWS IAM 사용자를 생성합니다.
  2. 사용자에 대한 ACCESS KEY와 SECRET ACCCESS KEY를 발급받습니다.
  3. 키를 이용하여 사용자가 가진 권한 내에서 AWS CLI를 통해 AWS 리소스를 조작합니다.

 

하지만, 위 순서에서 한 가지 빠진 점이 있습니다. 바로 권한과 사용자를 매칭시켜주어야 한다는 점입니다.

 

만약 1,2,3 순서로 키를 생성해봤자, 아무런 권한이 없는 키이기 때문에 테라폼으로 리소스를 생성한다는 것은 불가능 할 것입니다.

 

 

 

따라서 아래와 같은 과정이 필요할 것입니다.

 

  1. 특정 리소스, 액션에 대한 권한이 있는 정책사용자 그룹 연결 및 사용자 그룹 생성
  2. 사용자 그룹에 사용자 포함

 

 

권한은 정책으로 설정할 수 있고, 정책은 사용자가 원하는 액션만 포함하여 새롭게 생성할 수 있습니다.

 

모든 리소스, 모든 액션에 대한 정책을 사용자에게 부여한다면, 그 사용자에 대한 정보는 절대로 탈취되어선 안될 중요한 정보일 것입니다.

 

 

 

자세한 생성 과정은 해당 포스팅에서 포함하지 않겠습니다.

 

예제에서 사용한 정책은 다음과 같습니다.

  • AmazonS3FUllAccess

 


 

테라폼으로 AWS S3 조작(생성)하기

 

앞서 생성한 AWS 액세스, 시크릿 키를 환경변수로 설정합니다.

 

  • AWS_ACCESS_KEY_ID
  • AWS_SECRET_ACCESS_KEY

 

export AWS_ACCESS_KEY_ID=
export AWS_SECRET_ACCESS_KEY=

 

 

 

다음 예제로 테라폼을 이용한 버킷을 생성해 보겠습니다.

 

s3.tf

resource "aws_s3_bucket" "example" {
  bucket = "my-tf-example-bucket"
}

resource "aws_s3_bucket_ownership_controls" "example" { # acl 제어를 위해 요구됨
  bucket = aws_s3_bucket.example.id
  rule {
    object_ownership = "BucketOwnerPreferred"
  }
}

resource "aws_s3_bucket_acl" "example" {
  depends_on = [aws_s3_bucket_ownership_controls.example]

  bucket = aws_s3_bucket.example.id
  acl    = "private"
}

 

  • 한국 리전은 ap-northeast-2 입니다.
  • 버킷 이름은 전역적으로 고유해야 하므로, 변경하여 사용하세요.

 

terraform init

 

 

terraform apply

 

 

apply 진행 후, AWS 콘솔에서 실제 버킷이 생성되었는지 확인합니다.

 

terraform destroy

 

 

destroy 진행 후, AWS 콘솔에서 실제 버킷이 제거되었는지 확인합니다.

 

 

'IaC' 카테고리의 다른 글

스터디 5주차 - 모듈 추가 내용  (0) 2025.01.05
테라폼 스터디 5주차 - 모듈  (3) 2025.01.05
테라폼 스터디 - 4주차  (1) 2024.12.29
테라폼 스터디 - 3주차 추가내용  (1) 2024.12.22
테라폼 스터디 - 2주차  (1) 2024.12.14