본문 바로가기

작업 흐름 자동화 도구 n8n에 Python 설치하고 실행하는 컨테이너 정의

Automate your data processing pipeline in 9 steps – n8n Blog

Kubernetes 매니페스트 파일은 n8n 작업 흐름 자동화 도구에 Python 3를 설치하고 실행하는 컨테이너를 정의하는데 사용할 수 있습니다. 이 예시에서는 n8npython3를 함께 설치하고 실행할 수 있는 Dockerfile을 사용하여 커스텀 이미지를 만들고, 이를 Kubernetes 클러스터에서 실행하는 방법을 보여줍니다.

1단계: Dockerfile 작성

n8n과 Python 3를 포함하는 Docker 이미지를 생성하기 위한 Dockerfile을 작성합니다. 아래 Dockerfile은 n8nio/n8n 이미지를 기반으로 하며 Python을 추가로 설치합니다.

# 기본 이미지
FROM n8nio/n8n

# Python3 및 pip 설치
USER root
RUN apt-get update && \
    apt-get install -y python3 python3-pip

# 사용자를 다시 n8n으로 설정
USER node

# n8n 포트 노출
EXPOSE 5678

이 Dockerfile을 사용하여 이미지를 빌드하고 Docker Hub 또는 개인 컨테이너 레지스트리에 푸시합니다.

2단계: Kubernetes 매니페스트 파일 작성

Kubernetes에서 이 이미지를 사용하여 Pod를 배포하는 매니페스트 파일을 작성합니다. 아래 YAML 파일은 DeploymentService 오브젝트를 정의합니다.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: n8n-python
  labels:
    app: n8n-python
spec:
  replicas: 1
  selector:
    matchLabels:
      app: n8n-python
  template:
    metadata:
      labels:
        app: n8n-python
    spec:
      containers:
      - name: n8n-python
        image: <your-registry>/n8n-python:latest  # 여기서 이미지 경로를 조정하세요.
        ports:
        - containerPort: 5678

---
apiVersion: v1
kind: Service
metadata:
  name: n8n-python-service
spec:
  type: NodePort
  selector:
    app: n8n-python
  ports:
    - protocol: TCP
      port: 5678
      targetPort: 5678
      nodePort: 30000  # 원하는 포트로 조정하세요.

이 매니페스트 파일은 n8n과 Python3를 포함하는 Pod를 생성하고, NodePort 서비스를 통해 외부에서 접근 가능하도록 합니다. 사용 중인 클러스터의 네트워크 정책에 따라 LoadBalancer 또는 Ingress를 사용할 수도 있습니다.

3단계: 적용 및 실행

매니페스트 파일을 작성한 후, Kubernetes 클러스터에 적용하기 위해 다음 명령을 사용합니다.

kubectl apply -f n8n-python.yaml

이제 Kubernetes 클러스터에서 n8n과 Python3가 포함된 컨테이너가 실행되며, 지정된 포트를 통해 접근할 수 있습니다.

 

GitLab과 Argo CD를 사용하여 Kubernetes에 애플리케이션을 배포하는 프로세스를 추가 구성하기 위해 몇 단계로 나눌 수 있습니다. 이 프로세스는 Docker 이미지를 빌드하고, 이미지를 레지스트리에 푸시한 다음, Argo CD를 사용하여 Kubernetes에 자동으로 배포하는 단계를 포함합니다.

4단계: 프로젝트 설정

GitLab 리포지토리 생성

GitLab에서 새 리포지토리를 만들고 로컬 시스템과 연결합니다. 리포지토리에는 Dockerfile, Kubernetes 매니페스트 파일, 그리고 필요한 모든 구성 파일을 포함해야 합니다.

Dockerfile 및 Kubernetes 매니페스트 파일

이전 단계에서 언급한 Dockerfile과 Kubernetes 매니페스트 파일(n8n-python.yaml)을 리포지토리에 추가합니다.

5단계: CI/CD 파이프라인 설정

.gitlab-ci.yml 설정

GitLab CI/CD 파이프라인을 설정하기 위해 .gitlab-ci.yml 파일을 프로젝트 루트에 생성합니다. 이 파일은 Docker 이미지를 빌드하고, 이미지를 레지스트리에 푸시하는 작업을 정의합니다.

stages:
  - build
  - deploy

build_image:
  stage: build
  image: docker:19.03.12
  services:
    - docker:19.03.12-dind
  script:
    - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
    - docker build -t $CI_REGISTRY_IMAGE:$CI_COMMIT_REF_SLUG .
    - docker push $CI_REGISTRY_IMAGE:$CI_COMMIT_REF_SLUG

deploy_to_k8s:
  stage: deploy
  image: alpine:latest
  script:
    - apk add --no-cache curl
    - curl -sSL --fail $ARGOCD_SERVER/api/v1/session -X POST -d $'{"username":"$ARGOCD_USER","password":"$ARGOCD_PASSWORD"}' -H 'Content-Type: application/json' > auth.json
    - AUTH_TOKEN=$(cat auth.json | jq -r .token)
    - curl -sSL --fail $ARGOCD_SERVER/api/v1/applications -X POST -d @./argocd-app.json -H "Authorization: Bearer $AUTH_TOKEN" -H 'Content-Type: application/json'
  environment:
    name: production
  only:
    - master

이 파이프라인은 두 단계로 구성됩니다. build에서는 Docker 이미지를 빌드하고 푸시하며, deploy에서는 Argo CD를 통해 Kubernetes에 배포합니다.

환경 변수 설정

GitLab의 CI/CD 설정에서 필요한 환경 변수(CI_REGISTRY_USER, CI_REGISTRY_PASSWORD, ARGOCD_SERVER, ARGOCD_USER, ARGOCD_PASSWORD)를 설정해야 합니다.

6단계: Argo CD 설정

Argo CD 설치

Kubernetes 클러스터에 Argo CD를 설치하고 구성합니다.

kubectl create namespace argocd
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml

Argo CD로 액세스

Argo CD 웹 인터페이스에 액세스하여 사용자 인터페이스를 통해 또는 CLI를 통해 애플리케이션을 설정합니다.

argocd-app.json 설정

Argo CD 애플리케이션 정의 파일을 리포지토리에 추가합니다. 이 JSON 파일은 배포할 애플리케이션의 세부 정보를 정의합니다.

{
  "apiVersion": "argoproj.io/v1alpha1",
  "kind": "Application",
  "metadata": {
    "name": "n8n-python",
    "namespace": "argoc

d"
  },
  "spec": {
    "project": "default",
    "source": {
      "repoURL": "https://gitlab.com/<your-username>/<your-repository>.git",
      "targetRevision": "HEAD",
      "path": "."
    },
    "destination": {
      "server": "https://kubernetes.default.svc",
      "namespace": "default"
    },
    "syncPolicy": {
      "automated": {
        "selfHeal": true,
        "prune": true
      }
    }
  }
}

위 설정으로 Docker 이미지가 빌드되고 Kubernetes에 자동으로 배포됩니다. GitLab과 Argo CD의 강력한 조합을 통해 코드 변경 사항이 자동으로 적용되어 배포 프로세스가 간소화됩니다.

 

그리고, n8n에서 "Execute Command" 노드를 사용하여 컨테이너 내부에 설치된 Python 3를 실행하는 방법에 대해 설명하겠습니다. 이 과정을 통해 자동화된 워크플로우 내에서 Python 스크립트를 실행할 수 있습니다.

n8n에서 Python 스크립트 실행하기

  1. 워크플로우 설정
    • n8n 인터페이스를 열고 새 워크플로우를 생성하거나 기존 워크플로우를 수정합니다.
  2. Execute Command 노드 추가
    • 워크플로우 편집 화면에서 "+" 버튼을 클릭하여 노드를 추가합니다.
    • "Execute Command" 노드를 검색하고 선택하여 워크플로우에 추가합니다.
  3. Command 설정
    • "Execute Command" 노드의 설정 패널에서, 실행할 커맨드를 입력합니다. 예를 들어, 간단한 Python 스크립트를 직접 입력하거나, 파일로 저장된 스크립트를 실행할 수 있습니다.
    • 직접 스크립트 실행: python3 -c "print('Hello from Python!')"
    • 파일에서 스크립트 실행: 만약 script.py 라는 파일이 있고, 이 파일을 실행하고 싶다면 python3 /path/to/script.py 라는 커맨드를 입력합니다. 파일 경로는 스크립트가 저장된 정확한 위치로 설정해야 합니다.
  4. 추가 설정
    • 필요에 따라 "Add Option"을 클릭하여 추가적인 설정을 할 수 있습니다. 예를 들어, 실행 디렉토리나 환경 변수 등을 설정할 수 있습니다.
  5. 노드 실행 및 결과 확인
    • 설정을 마친 후, 워크플로우를 저장하고 실행합니다. "Execute Command" 노드의 실행 결과를 확인하여 Python 스크립트의 출력을 검토할 수 있습니다.
  6. 에러 처리
    • Python 스크립트나 커맨드 실행 중 에러가 발생하면, n8n은 에러 메시지와 함께 실패한 노드의 상세 정보를 제공합니다. 이를 통해 문제를 진단하고 수정할 수 있습니다.

이렇게 설정하면 n8n의 "Execute Command" 노드를 사용하여 컨테이너에서 Python 스크립트를 자동으로 실행할 수 있습니다. 이 기능은 데이터 처리, 자동화된 분석 작업, 다른 시스템과의 통합 등 다양한 작업에 활용할 수 있습니다.

 

n8n에서 Python 스크립트를 "Execute Command" 노드를 사용해 실행할 때 추가 인자값을 전달할 때, 이전 노드에서 생성된 JSON 데이터를 Python 스크립트에 전달하고 싶은 경우, 해당 데이터를 문자열로 변환하여 인자로 사용할 수 있습니다.

Python 스크립트 인자로 JSON 데이터 전달하기

  1. Python 스크립트 준비
    • Python 스크립트가 JSON 형식의 인자를 받아들일 수 있도록 준비합니다. 예를 들어, script.py라는 파일이 있고, 이 스크립트는 명령줄에서 JSON 문자열을 인자로 받아 처리하는 코드를 포함하고 있다고 가정합니다.
      # script.py
      import sys
      import json
      
      # 명령줄 인자를 받아 JSON으로 파싱
      json_input = sys.argv[1]
      data = json.loads(json_input)
      
      # 예시: JSON 데이터에서 특정 필드를 출력
      print("Received name:", data['name'])
  2. n8n 워크플로우 설정
    • n8n 워크플로우에서 "Execute Command" 노드를 추가하고 설정합니다.
  3. Command 설정
    • 실행할 커맨드에 인자로 JSON 데이터를 전달합니다. JSON 데이터는 이전 노드에서 생성된 데이터를 JSON.stringify 함수를 사용하여 문자열로 변환합니다. 이 때, 문자열이 쉘에서 안전하게 처리되도록 적절한 인용 부호를 사용해야 합니다.
    • 예제 커맨드: python3 /path/to/script.py '{{ JSON.stringify($json) }}'
    • 여기서, {{ JSON.stringify($json) }}는 현재 노드에서 사용 가능한 JSON 데이터를 문자열로 변환합니다. $json은 이전 노드의 결과를 나타내며, 이는 n8n의 표현식 언어를 사용하여 참조됩니다.
  4. 노드 실행 및 결과 확인
    • 설정을 완료한 후 워크플로우를 저장하고 실행합니다. "Execute Command" 노드의 실행 결과를 통해 Python 스크립트가 정상적으로 데이터를 받아 처리했는지 확인할 수 있습니다.

주의사항

  • 보안: 외부에서 제공되는 데이터를 스크립트로 직접 전달할 때는 보안에 특별히 주의해야 합니다. 악성 데이터가 코드 실행을 유발할 수 있으므로 입력 데이터를 적절히 검증하는 과정이 필요합니다.
  • 인용 부호 처리: 쉘에서 명령을 안전하게 실행하기 위해 적절한 인용 부호를 사용하는 것이 중요합니다. 복잡한 문자열이나 특수 문자를 포함한 데이터를 전달할 때는 추가적인 인용 부호 처리가 필요할 수 있습니다.

 

이 방법을 사용하여 n8n에서 Python 스크립트에 다양한 형태의 데이터를 유연하게 전달하고 자동화된 워크플로우 내에서 복잡한 데이터 처리를 수행할 수 있습니다.

728x90

댓글