Connecting

모두의 Terraform(테라폼) PART 2 - 설치방법 본문

IaC

모두의 Terraform(테라폼) PART 2 - 설치방법

팬도라 2023. 3. 16. 17:28
반응형

Terraform Installation

WIndows

choco install terraform

Linux (Ubuntu)

sudo apt update && sudo apt install gpg gnupg software-properties-common -y 
wget -O- https://apt.releases.hashicorp.com/gpg | gpg --dearmor | sudo tee /usr/share/keyrings/hashicorp-archive-keyring.gpg
gpg --no-default-keyring --keyring /usr/share/keyrings/hashicorp-archive-keyring.gpg --fingerprint
echo "deb [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 -y 

Mac OS

brew tap hashicorp/tap
brew install hashicorp/tap/terraform
brew update
brew upgrade hashicorp/tap/terraform

Enable tab completion

Bash

terraform -install-autocomplete

source ~/.bashrc 

Zsh

terraform -install-autocomplete

source ~/.zshrc 

설치 확인

terraform -help

Usage: terraform [global options] [args]
The available commands for execution are listed below.
The primary workflow commands are given first, followed by
less common or more advanced commands.
....
terraform -help plan

Usage: terraform [global options] plan [options]
Generates a speculative execution plan, showing what actions Terraform
would take to apply the current configuration. This command will not
actually perform the planned actions.
....

Terraform Docker Example

테라폼을 활용하여 Nginx를 Docker에서 실행하는 예제를 실행하도록 하겠습니다.

각 환경에 Docker가 설치되어 있다고 가정하겠습니다. 

설치가 되어있지 않다면 [Docker](https://docs.docker.com/engine/)를 참고하여 설치하세요. 

Windows

mkdir learn-terraform-docker-container
cd learn-terraform-docker-container

main.tf 파일을 생성합니다.

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

provider "docker" {
  host    = "npipe:////.//pipe//docker_engine"
}

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

resource "docker_container" "nginx" {
  image = docker_image.nginx.latest
  name  = "tutorial"
  ports {
    internal = 80
    external = 8000
  }
}
terraform init
terraform apply

docker ps 

terraform destroy

Linux

mkdir learn-terraform-docker-container
cd learn-terraform-docker-container

vi main.tf 
terraform {
  required_providers {
    docker = {
      source  = "kreuzwerker/docker"
      version = "~> 2.13.0"
    }
  }
}

provider "docker" {}

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

resource "docker_container" "nginx" {
  image = docker_image.nginx.latest
  name  = "tutorial"
  ports {
    internal = 80
    external = 8000
  }
}
terraform init
terraform apply

docker ps 

terraform destroy

Troubleshooting

Docker 데몬은 TCP 포트가 아닌 Unix 소켓에 바인딩 됩니다. 기본적으로 root는 Unix 소켓을 소유한 사용자이며 다른 사용자는 sudo를 사용하여 Docker 데몬이 root 사용자로 실행됩니다.

이에따라 테라폼을 실행할시 다음과 같은 오류 메시지가 포함될 수 있습니다.

docker: Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: 

다음은 Docker에 root 수준의 권한을 부여하는 방법을 보여줍니다.

sudo groupadd docker
sudo usermod -aG docker $USER
newgrp docker

docker run hello-world

일부 머신에 따라 재부팅이 필요할 수 있습니다.
시스템 부팅시 Docker가 자동으로 실행하고자 한다면 다음과 같이 명령을 수행합니다.

sudo systemctl enable docker.service
sudo systemctl enable containerd.service

Mac OS

open -a Docker
mkdir learn-terraform-docker-container
cd learn-terraform-docker-container

vi main.tf 
terraform {
  required_providers {
    docker = {
      source  = "kreuzwerker/docker"
      version = "~> 2.13.0"
    }
  }
}

provider "docker" {}

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

resource "docker_container" "nginx" {
  image = docker_image.nginx.latest
  name  = "tutorial"
  ports {
    internal = 80
    external = 8000
  }
}
terraform init
terraform apply

docker ps 

terraform destroy

Terraform & AWS 설정하기

테라폼을 활용하여 AWS의 리소스를 생성, 변경, 삭제 하는 기본 방법에 대해 학습합니다.
본 실습을 진행하기 위해 AWS에 IAM 계정 및 AWS CLI 설치가 필요합니다. 링크

AWS CLI Installation

Linux (Ubuntu)

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

ARM인 경우 주소는 다음과 같이 변경됩니다.

  • curl "https://awscli.amazonaws.com/awscli-exe-linux-aarch64.zip" -o "awscliv2.zip"

Mac OS

brew install awscli 

OR

curl "https://awscli.amazonaws.com/AWSCLIV2.pkg" -o "AWSCLIV2.pkg"
sudo installer -pkg AWSCLIV2.pkg -target /

WIndows

msiexec.exe /i https://awscli.amazonaws.com/AWSCLIV2.msi

AWS CLI Version Check

aws --version 
aws-cli/2.9.19 Python/3.9.11 Linux/5.15.0-1028-aws exe/x86_64.ubuntu.22 prompt/off
이전 버전이 설치되어 있을 경우 [링크](https://dev.classmethod.jp/articles/lim-awscli-version-up/) 를 참고하여 업그레이드를 진행합니다. 

AWS CLI 설정

AWS CLI를 구성하기 위해 AWS에 IAM 사용자를 생성하고 엑세스 키를 구성합니다.

IAM 사용자 생성

  • AWS 콘솔에서 IAM(Identity and Access Management)에 접속합니다.
  • IAM -> 사용자에 접속하여 사용자 추가를 클릭합니다.
  • 사용자 세부 정보에서 사용자 이름을 다음과 같은 예시와 같이 작성합니다.
  • 이후 권한 설정에서 테라폼이 리소스를 생성, 수정, 삭제할 수 있는 적절한 권한을 부여합니다.
    • 본 예제에서는 AdministatorAcess 권한을 부여합니다.
  • 검토 및 생성에서 사용자 세부 정보를 확인하고 이상이 없으면 사용자 생성 버튼을 클릭합니다.
  • 생성된 사용자에 하단 항목에 엑세스 키 항목을 찾아 엑세스 키 만들기를 클릭합니다.
  • CLI 항목에 체크하고 다음을 눌러 키를 생성합니다.
  • 엑세스 키와 비밀 엑세스 키 2개가 만들어 지면, 이를 잘 보관하며, 유출되지 않도록 각별하게 유의합니다.

AWS Configure

생성된 키를 다음 명령에 입력하여 AWS CLI와 연동할 수 있도록 합니다.

aws configure

AWS Access Key ID [None]: **********
AWS Secret Access Key [None]: **********
Default region name [None]: ap-northeast-2 
Default output format [None]

AWS CLI는 aws configure를 사용하여 지정하는 민감한 자격 증명 정보를 홈 디렉터리의 credentials라는 폴더에 있는 .aws라는 로컬 파일에 저장합니다. aws configure를 사용하여 지정하는 덜 민감한 구성 옵션은 config라는 로컬 파일에 저장되며, 홈 디렉터리의 .aws 폴더에도 저장됩니다.
홈 디렉터리 위치는 운영 체제에 따라 달라지지만 Windows에서는 %UserProfile% 환경 변수를, Unix 기반 시스템에서는 $HOME 또는 ~(물결표) 환경 변수를 사용하여 참조됩니다. AWS_CONFIG_FILEAWS_SHARED_CREDENTIALS_FILE 환경 변수를 다른 로컬 경로로 설정하여 파일에 대해 기본이 아닌 위치를 지정할 수 있습니다. 세부 정보는 환경 변수를 사용하여 AWS CLI 구성 단원을 참조하세요.

예를 들어 aws configure로 구성된 기본 프로파일에 대해 AWS CLI에서 생성된 파일은 다음과 유사합니다.
~/.aws/credentials

[default]
aws_access_key_id=**********
aws_secret_access_key=**********

~/.aws/config

[default]
region=ap-northeast-2
output=json

설정이 완료되면 다음 명령을 통해 인증정보가 정상적으로 불러오는지 확인합니다.

aws sts get-caller-identity 

{
    "UserId": "********************",
    "Account": "0000000000",
    "Arn": "arn:aws:iam::0000000000:user/terraform"
}
Comments