파이썬과 DevOps

옛날에 JavaEE 노인들은 J2EE라고 불렀고, 요즘에는 Jakarta EE라는 더 존재감 없는 이름으로 부르는 라는 동네의 WAS 제품으로 IBM WebSphereOracle WebLogic이라는 물건이 있었습니다. 지금은 알아도 별로 영양가 없는 것들인데요. 아무튼 이 서버들은 관리자용 API를 제공했었는데, 바로 Python을 JVM에서 구동하는 Jython이라는 물건으로 만들어진 것이었지요. (참고로 자이썬의 문법은 파이썬이랑 똑같습니다.)

왜 파이썬이었을까요?

시스템 엔지니어가 작업을 할 때 sh(쉘 스크립트)bat(배치 파일)로 스크립트를 작성해서 관리하던 시절이 있었습니다. 물론 지금도 많이 사용하고 있긴 하지만, 이것들을 잘 쓰려면 매우 어렵습니다.배워봤자 돈벌이도 안 되고요 하지만 파이썬을 사용하면 쉘 스크립트나 배치 파일로 작성할 때의 복잡함을 극복하고 체계적으로 스크립트를 작성할 수 있습니다. 파이썬의 문법과 제어구조를 가지고 스크립트를 작성하는 것이 더 쉽고, 또 가독성도 좋습니다.

파이썬으로 작성된, 혹은 파이썬을 지원하는 DevOps 도구(인프라 프로비저닝, CI/CD 스크립트, 쿠버네티스 매니페스트)도 많이 나와있습니다. 예를 들면, 무스마에서 사용하는 AWS SDK(Boto3), AWS CDK, AWS CDK8s (죄다 AWS???) 같은 것들이 있지요. 이 도구들은 원래 TypeScript로 작성되었지만, 나름 메이저에 속하는 파이썬을 위해서도 API를 제공하고 있습니다.

여기서는 파이썬을 활용할 수 있는 DevOps 도구들을 몇가지 알려드리고자 합니다.


1. AWS SDK (Boto3)

다른 언어 버전들은 그냥 AWS SDK for JavaScript, AWS SDK for Java라고 부르는데, 파이썬 버전인 이 녀석만 특이하게도 Boto3라는 별명을 갖고 있습니다. (왜?)

이걸로 AWS 서비스를 호출할 수 있습니다.

import boto3

sqs = boto3.client('sqs')
response = sqs.send_message(QueueUrl='...', MessageBody='...')

파이썬용 SDK의 API는 기본적으로 동기식(synchronous) 호출을 사용하는 것 같습니다.

아마 파이썬에 Node.js의 callback, Promise, async/await와 같은 것이 있는가 궁금하신 분들이 있을 겁니다. 네, asyncio라는 것이 있습니다. boto3도 async/await를 지원하는 aioboto3라고 따로 있습니다.

비동기 호출을 지원하는 aioboto3를 사용하는 것이 더 좋을 것 같네요.


2. AWS CDK

읽어보세요

[무스마 기술블로그] 코드로 인프라 관리: AWS CDK

클라우드 인프라 프로비저닝 도구의 양대 산맥 Terraform과 CDK 중에서 무스마에서는 CDK를 주로 사용하고 있습니다.

지금까지 R&D팀에서 AWS를 이용하면서 EC2, S3, Rekognition 같은 것들은 조금씩 사용해 보았지만, 무스마의 성장세로 볼 때 앞으로 이런 것들도 사용해볼 기회가 많아지지 않을까 기대해봅니다.

이를 위해 AWS 서비스 자원을 좀 더 체계적으로 관리할 수 있도록 CDK에 익숙해질 필요가 있습니다.

읽어보세요

Python으로 AWS Cloud Development Kit 시작하기

CDK도 원래 TypeScript로 개발한 도구이지만 파이썬을 잘 지원하고 있습니다. 커뮤니티를 보니 파이썬으로 CDK를 사용하시는 분들도 제법 많았습니다.

모르는 것이 있으면 AWS 한국 사용자 그룹 #cdk 슬랙 채널에 오셔서 질문을 올려주시거나, 무스마에서 CDK를 가장 잘 하는 조성훈 주임님을 찾아주세요.


읽어보세요

[무스마 기술블로그] AWS SSM으로 EC2 인스턴스에 접근하기 (SSH 대체)


3. AWS CDK8S

R&D팀이 AI/ML 워크로드 배포를 위한 쿠버네티스 클러스터 구축 사업을 수행하게 되었습니다. 앞으로 무스마가 전사 R&D 부문에서 쿠버네티스 활용을 고도화하는 기회가 될 것으로 기대하고 있습니다.

올해부터 무스마 SW개발팀이 워크로드 배포를 Amazon ECS 기반에서 Amazon EKS 기반으로 전환하면서, 쿠버네티스 리소스 매니페스트 작성 및 관리를 도와주는 AWS CDK8S의 활용 빈도가 크게 늘어났습니다. (작년에는 AWS CDK를 많이 사용했는데, 올해 2021년에는 CDK8S를 더 많이 자주 사용하고 있습니다.)

쿠버네티스를 운용할 때에 CDK8S를 잘 활용하시면 AWS에서 CDK를 사용할 때와 마찬가지로 체계적이고 효율적인 관리가 가능합니다.

데모 영상

시청해보세요.


Chart 코드를 이렇게 작성하시고,

from constructs import Construct
from imports import k8s
from cdk8s import App, Chart

class TimescaleChart(Chart):
    def __init__(self, scope: Construct, ns: str, namespace: str):
        super().__init__(scope, ns, namespace=namespace)

        labels = {
            'app.kubernetes.io/name': 'timescale',
            'app.kubernetes.io/component': 'database'
        }

        k8s.Deployment(self, 'deployment',
            metadata=k8s.ObjectMeta(name='timescale'),
            spec=k8s.DeploymentSpec(
                replicas=1,
                selector=k8s.LabelSelector(match_labels=labels),
                template=k8s.PodTemplateSpec(
                    metadata=k8s.ObjectMeta(labels=labels),
                    spec=k8s.PodSpec(
                        containers=[
                            k8s.Container(
                                name=ns,
                                env=[
                                    k8s.EnvVar(name='TIMESCALEDB_TELEMETRY', value='off'),
                                    k8s.EnvVar(name='POSTGRES_DB', value='tips'),
                                    k8s.EnvVar(name='POSTGRES_USER', value='tips'),
                                    k8s.EnvVar(name='POSTGRES_PASSWORD', value='password')
                                ],
                                image='timescale/timescaledb:latest-pg13',
                                ports=[k8s.ContainerPort(container_port=5432)]
                            )
                        ]
                    )
                )
            )
        )

        k8s.Service(self, 'service',
            metadata=k8s.ObjectMeta(name='timescale'),
            spec=k8s.ServiceSpec(
                ports=[k8s.ServicePort(port=5432)],
                selector=labels
            )
        )

메인 함수는 이렇게 생겼습니다.

from cdk8s import App
from imports import k8s
from charts.message_collector import MessageCollectorChart
from charts.timescale import TimescaleChart

app = App()
# <!-- 여기에 Chart를 넣으세요.

MessageCollectorChart(app, 'message-collector', 'tips-ai')
TimescaleChart(app, 'timescale', 'tips-ai')

# -->
app.synth()

python 코드를 yaml로 컴파일합니다.

$ poetry run cdk8s run synth

그러면 이렇게 YAML 형식의 매니페스트 파일이 생성됩니다.

apiVersion: "apps/v1"
kind: "Deployment"
metadata:
  name: "timescale"
  namespace: "tips-ai"
spec:
  replicas: 1
  selector:
    matchLabels:
      app.kubernetes.io/component: "database"
      app.kubernetes.io/name: "timescale"
  template:
    metadata:
      labels:
        app.kubernetes.io/component: "database"
        app.kubernetes.io/name: "timescale"
    spec:
      containers:
        - env:
            - name: "TIMESCALEDB_TELEMETRY"
              value: "off"
            - name: "POSTGRES_DB"
              value: "tips"
            - name: "POSTGRES_USER"
              value: "tips"
            - name: "POSTGRES_PASSWORD"
              value: "password"
          image: "timescale/timescaledb:latest-pg13"
          name: "timescale"
          ports:
            - containerPort: 5432
---
apiVersion: "v1"
kind: "Service"
metadata:
  name: "timescale"
  namespace: "tips-ai"
spec:
  ports:
    - port: 5432
  selector:
    app.kubernetes.io/component: "database"
    app.kubernetes.io/name: "timescale"

사용 방법은 홈페이지에 잘 나와있습니다. 그리고 무스마 SW개발팀이 아주 잘 사용하고 있으니 궁금한 것이 있으면 물어보시기 바랍니다.


정리

파이썬 도구를 이용해서 클라우드 인프라 프로비저닝, 쿠버네티스 운용 등 DevOps 엔지니어링을 훌륭하게 수행할 수 있습니다.

  • Boto3로 AWS 서비스 호출, 관리
  • AWS CDK로 클라우드 인프라 프로비저닝
  • AWS CDK8S로 쿠버네티스 매니페스트 작성

많은 활용 바랍니다.

다음 Node.js 개발자를 위한 Python 급하게 배워보기 - (3/3) 편에서 계속됩니다.