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
해당 리소스와 서비스가 정상적으로 구동된 것을 확인 할 수 있다.
Demo가 끝났으므로 해당 리소스를 제거하면된다.
기존 HCL 문법과 같이 destroy를 사용하여 리소스를 제거하면 된다.
cdktf destroy
Plan 결과
Deploy와 같이 Plan 된 내용을 확인 후 리소스를 삭제하면 된다.
리소스 삭제 확인
docker ps
curl localhost:8000