DevOps/Terraform

[Terraform] CDKTF Docker Provisioning Demo

Michael Kim 2022. 11. 29. 13:07

테라폼 공식 홈페이지에 제공되는 CDKTF 기반 Docker Provisioning

 

 

Docker Install

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
 echo \
  "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
  sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io

# 설치 확인
docker -v

# 접속 사용자 Docker 권한 추가
sudo usermod -aG docker $USER

 

Create Project 

# cdktf-docker 폴더 생성 및 이동
mkdir learn-cdktf-docker
 cd learn-cdktf-docker

 

사용할려는 언어를 지정해야 한다.

각 언어를 사용하기 위해선 로컬에 해당  프로그래밍 언어가 설치되어 있어야 한다.

# TypeScript
cdktf init --template=typescript --local

# Python
cdktf init --template=python --local

# Go
cdktf init --template=go --local

# C#
cdktf init --template=csharp --local

# Java
cdktf init --template=java --local

 

 

파이썬을 사용하기 위해 파이썬 설치

 

버전 필수 사항은 Python 3.7 이상, pipenv 5.29 이상을 요구하고 있음으로 버전에 유의하여 설치해야한다.

sudo add-apt-repository ppa:deadsnakes/ppa
sudo apt update 
sudo apt install python3.11
sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.11 2

sudo apt install pip3

PYTHON_BIN_PATH="$(python3 -m site --user-base)/bin"
PATH="$PATH:$PYTHON_BIN_PATH"

sudo apt install pipenv

빌드 언어 지정 

Python을 사용

cdktf init --template=python --local

 

Docker Provider 설치 

pipenv install cdktf-cdktf-provider-docker
cdktf provider add kreuzwerker/docker

 

Python 기반 Code 작성

기존의 main.py 파일은 삭제한 후 아래 코드로 새로 main.py 생성

main.py

#!/usr/bin/env python

from constructs import Construct
from cdktf import App, TerraformStack
from cdktf_cdktf_provider_docker.image import Image
from cdktf_cdktf_provider_docker.container import Container
from cdktf_cdktf_provider_docker.provider import DockerProvider


class MyStack(TerraformStack):
    def __init__(self, scope: Construct, ns: str):
        super().__init__(scope, ns)

        DockerProvider(self, 'docker')

        docker_image = Image(self, 'nginxImage',
            name='nginx:latest',
            keep_locally=False)

        Container(self, 'nginxContainer',
            name='tutorial',
            image=docker_image.name,
            ports=[{
                'internal': 80,
                'external': 8000
            }])


app = App()
MyStack(app, "learn-cdktf-docker")

app.synth()

위의 코드는 아래 HCL문법과 동일한 구성을 가지고 있다.

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
  }
}

 

Deploy Container

cdktf deploy

Plan 된 내용에서 Approve를 하여 리소스를 생성한다.

옵션 의미
Approve Plan 된 내용을 적용
Dismiss Plan 된 내용을 적용하지 않음, 스택이 Plan을 할 필요 없음
Stop Plan 된 내용을 적용하지 않음, 현재 스택을 완료시킴

 

리소스와 서비스가 정상 구동되었는지 확인

docker ps

sudo apt install curl

curl localhost:8000

docker ps 결과
curl localhost:8000 결과

 

해당 리소스와 서비스가 정상적으로 구동된 것을 확인 할 수 있다.

 

Demo가 끝났으므로 해당 리소스를 제거하면된다.

 

기존 HCL 문법과 같이 destroy를 사용하여 리소스를 제거하면 된다.

cdktf destroy

Plan 결과

Deploy와 같이 Plan 된 내용을 확인 후 리소스를 삭제하면 된다.

 

리소스 삭제 확인

docker ps

curl localhost:8000