Terraform으로 구현한 스마트 팩토리 모니터링 시스템 (v 1.0)

프로젝트 배경

최근 Docker Compose로 구축했던 스마트 팩토리 모니터링 시스템을 Terraform으로 마이그레이션했다. Terraform은 IaC 도구 중 하나이다. Infra as Code 의 두문자어로, 인프라를 코드를 통해 관리할 수 있게 해준다.

기술 스택

  • IaC: Terraform v1.5+
  • 메시징: MQTT (Eclipse Mosquitto)
  • 데이터 수집: Telegraf
  • 시계열 DB: InfluxDB 2.0
  • 시각화: Grafana
  • 보안: TLS/SSL 인증서

프로젝트 구조

pearl_terraform/
├── main.tf                     # 메인 인프라 정의
├── variables.tf                # 변수 선언
├── terraform.tfvars           # 변수 값 (gitignore)
├── conf/
│   ├── mosquitto.conf.tpl    # Mosquitto 설정 템플릿
│   └── telegraf.conf.tpl     # Telegraf 설정 템플릿
├── certs/                     # SSL 인증서 (gitignore)
├── grafana/
│   ├── provisioning/
│   │   ├── dashboards/       # 대시보드 설정
│   │   └── datasources/      # 데이터소스 설정
│   └── dashboards/           # 대시보드 JSON

핵심 구현 사항

1. 템플릿 기반 설정 관리

민감한 정보를 변수화하고 템플릿을 통해 설정 파일을 동적으로 생성:

resource "local_file" "telegraf_config" {
  content = templatefile("${path.module}/conf/telegraf.conf.tpl", {
    influxdb_token  = var.influxdb_token
    influxdb_org    = var.influxdb_org
    influxdb_bucket = var.influxdb_bucket
    username        = var.telegraf_username
    password        = var.telegraf_password
  })
  filename = "${path.module}/conf/telegraf.conf"
}

2. 네트워크 격리

전용 Docker 네트워크를 생성하여 컨테이너 간 안전한 통신:

resource "docker_network" "IOT" {
  name = "IOT"
}

resource "docker_container" "mosquitto" {
  # ...
  networks_advanced {
    name = docker_network.IOT.name
  }
}

3. 의존성 관리

컨테이너 간 의존성을 명시적으로 선언:

resource "docker_container" "telegraf" {
  # ...
  depends_on = [
    docker_container.influxdb,
    docker_container.mosquitto
  ]
}

4. Grafana 프로비저닝

대시보드와 데이터소스를 자동으로 구성:

# datasources/influxdb.yml
datasources:
  - name: InfluxDB
    type: influxdb
    url: http://influxdb-terra:8086
    jsonData:
      version: Flux
      organization: pearl-factory
      defaultBucket: sensor

보안 고려사항

민감 정보 관리

variable "influxdb_token" {
  description = "InfluxDB auth token"
  type        = string
  sensitive   = true  # 로그에 노출 방지
}

SSL/TLS 구성

# mosquitto.conf.tpl
cafile /mosquitto/certs/ca.crt
certfile /mosquitto/certs/server.crt
keyfile /mosquitto/certs/server.key
require_certificate false

실행 방법

# 초기화
terraform init

# 계획 확인
terraform plan

# 인프라 배포
terraform apply

# 변수 파일 사용
terraform apply -var-file="production.tfvars"

Docker Compose 대비 장점

  1. 상태 관리: terraform.tfstate를 통한 인프라 상태 추적
  2. 변경 사항 미리보기: plan 명령으로 변경 내용 사전 확인
  3. 멱등성 보장: 동일한 코드는 항상 동일한 결과
  4. 모듈화: 재사용 가능한 컴포넌트로 분리 가능
  5. 롤백 지원: 이전 상태로 쉽게 복원

모니터링 대시보드

구현된 대시보드는 다음 메트릭을 실시간으로 표시:

  • Real-time Message Flow: 10초당 메시지 처리량
  • 활성 센서 수: 현재 작동 중인 센서 카운트
  • 센서별 상태: Temperature, Humidity, Vibration, Pressure, Production
  • 평균값 게이지: 각 센서 타입별 평균값 시각화

결론

처음 Terraform 문법을 접했을 때는 살짝 어지러웠는데, 막상 해보니 생각보다 어렵지 않았다. k8s를 deploy 하기 위해 yaml파일을 작성하는 것보다 훨씬 쉽게 느껴진다. 앞으로의 인프라 프로젝트는 웬만하면 Terraform 을 통해 만들어볼 생각이다.


Tags: #Terraform #IaC #IoT #MQTT #InfluxDB #Grafana #Docker #SmartFactory

코멘트

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다