Amazon Web Services에 n8n 호스팅하기
n8n v2.34요약
이 호스팅 가이드는 Amazon Web Services(AWS)로 n8n을 셀프 호스팅하는 방법을 보여줍니다. AWS는 n8n을 호스팅하기에 적합한 여러 방법을 제공하며, 여기에는 EC2(가상 머신)와 EKS(쿠버네티스로 실행되는 컨테이너)가 포함됩니다.
이 호스팅 가이드는 Amazon Web Services(AWS)로 n8n을 셀프 호스팅하는 방법을 보여줍니다. 필요한 리소스와 리버스 프록시를 관리하기 위해 쿠버네티스를 사용하여, 데이터베이스 백엔드로 Postgres를 사용하는 n8n을 다룹니다.
호스팅 옵션#
AWS는 n8n을 호스팅하기에 적합한 여러 방법을 제공하며, 여기에는 EC2(가상 머신)와 EKS(쿠버네티스로 실행되는 컨테이너)가 포함됩니다.
이 가이드에서는 호스팅 옵션으로 EKS를 사용합니다. 쿠버네티스를 사용하려면 추가적인 복잡성과 구성이 필요하지만, 수요 변화에 따라 n8n을 확장하는 데 가장 좋은 방법입니다.
사전 준비 사항#
이 가이드의 단계는 AWS UI와 EKS용 eksctl CLI 도구를 함께 사용합니다.
eksctl 문서에는 언급되어 있지 않지만, AWS CLI 도구도 설치하고 해당 도구의 인증을 구성해야 합니다.
이 섹션의 상세 내용은 n8n 공식 문서를 참조하세요.
이 섹션의 상세 내용은 n8n 공식 문서를 참조하세요.
클러스터 생성#
eksctl 도구를 사용하여 다음 명령으로 이름과 리전을 지정해 클러스터를 생성합니다.
eksctl create cluster --name n8n --region <your-aws-region>
클러스터를 생성하는 데 다소 시간이 걸릴 수 있습니다.
클러스터가 생성되면 eksctl이 자동으로 kubectl 컨텍스트를 해당 클러스터로 설정합니다.
구성 리포지터리 클론#
쿠버네티스와 n8n에는 일련의 구성 파일이 필요합니다. 이 리포지터리에서 클론할 수 있습니다. 아래 단계는 각 파일의 역할과 변경해야 할 설정을 설명합니다.
다음 명령으로 리포지터리를 클론합니다.
git clone https://github.com/n8n-io/n8n-hosting.git
그리고 디렉터리를 변경합니다.
cd n8n-hosting/kubernetes
Postgres 구성#
대규모 n8n 배포의 경우, Postgres는 SQLite보다 더 견고한 데이터베이스 백엔드를 제공합니다.
영구 스토리지용 볼륨 구성#
파드가 재시작되는 사이에도 데이터를 유지하려면 Postgres 배포에 영구 볼륨이 필요합니다. AWS의 기본 스토리지 클래스인 gp3가 이 목적에 적합합니다. 이는 postgres-claim0-persistentvolumeclaim.yaml 매니페스트에 정의되어 있습니다.
…
spec:
storageClassName: gp3
accessModes:
- ReadWriteOnce
…
Postgres 환경 변수#
Postgres는 컨테이너에서 실행되는 애플리케이션에 전달할 몇 가지 환경 변수를 설정해야 합니다.
예시 postgres-secret.yaml 파일에는 사용자 세부 정보와 사용할 데이터베이스에 대해 자신의 값으로 교체해야 하는 자리 표시자가 들어 있습니다.
PostgreSQL은 설정 및 관리를 위해 루트 사용자(POSTGRES_USER)를 사용하지만, n8n을 위해서는 별도의 루트가 아닌 사용자(POSTGRES_NON_ROOT_USER)를 만드는 것이 모범 사례입니다. 루트 사용자는 전체 제어 권한을 가지는 반면, n8n은 실행을 위해 루트가 아닌 사용자 권한만 필요로 합니다. 두 사용자를 모두 구성하면 보안이 향상되고 데이터베이스 시스템에 대한 우발적인 변경을 방지하는 데 도움이 됩니다.
이후 postgres-deployment.yaml 매니페스트는 이 매니페스트 파일의 값을 사용하여 애플리케이션 파드로 전달합니다.
n8n 구성#
파일 스토리지용 볼륨 생성#
n8n을 실행하는 데 필수는 아니지만, 영구 볼륨을 사용하면 n8n 사용 중에 업로드된 파일을 유지하는 데 도움이 되며, 재시작 사이에 수동 n8n 암호화 키를 유지하려는 경우 시작 시 해당 키를 담은 파일을 파일 스토리지에 저장합니다.
n8n-claim0-persistentvolumeclaim.yaml 매니페스트가 이를 생성하며, n8n Deployment는 n8n-deployment.yaml 매니페스트의 volumes 섹션에서 해당 claim을 마운트합니다.
…
volumes:
- name: n8n-claim0
persistentVolumeClaim:
claimName: n8n-claim0
…
파드 리소스#
쿠버네티스를 사용하면 애플리케이션 컨테이너에 필요한 최소 리소스와 실행 가능한 한도를 지정할 수 있습니다. 위에서 클론한 예시 YAML 파일에는 n8n-deployment.yaml 파일의 resources 섹션에 다음이 포함되어 있습니다.
…
resources:
requests:
memory: "250Mi"
limits:
memory: "500Mi"
…
이는 컨테이너당 최소 250mb, 최대 500mb를 정의하며, CPU는 쿠버네티스가 관리하도록 합니다. 필요에 맞게 이 값을 변경할 수 있습니다. 참고로, n8n 클라우드 제품의 리소스 값은 다음과 같습니다.
이 섹션의 상세 내용은 n8n 공식 문서를 참조하세요.
선택 사항: 환경 변수#
환경 변수를 사용해 n8n 설정과 동작을 구성할 수 있습니다.
n8n-secret.yaml 파일을 생성합니다. n8n 환경 변수에 대한 자세한 내용은 환경 변수를 참고하세요.
배포#
두 개의 배포 매니페스트(n8n-deployment.yaml, postgres-deployment.yaml)는 쿠버네티스에 n8n과 Postgres 애플리케이션을 정의합니다.
매니페스트는 다음을 정의합니다.
- 정의된 환경 변수를 각 애플리케이션 파드로 전달합니다
- 사용할 컨테이너 이미지를 정의합니다
- 리소스 사용 한도를 설정합니다
- 앞서 정의한
volumes와, 컨테이너 내에서 볼륨을 마운트할 경로를 정의하는volumeMounts - 스케일링 및 재시작 정책. 예시 매니페스트는 각 파드에 대해 인스턴스 하나를 정의합니다. 필요에 맞게 변경해야 합니다.
서비스#
두 개의 서비스 매니페스트(postgres-service.yaml, n8n-service.yaml)는 기본적으로 각각 5432와 5678 포트를 사용해 쿠버네티스 로드 밸런서로 서비스를 외부에 노출합니다.
쿠버네티스 클러스터로 전송#
n8n-kubernetes-hosting 디렉터리에서 다음 명령을 실행하여 모든 매니페스트를 클러스터로 전송합니다.
kubectl apply -f .
네임스페이스 오류
해당 리소스가 아직 준비되지 않았기 때문에 "n8n" 네임스페이스를 찾을 수 없다는 오류 메시지가 표시될 수 있습니다. 같은 명령을 다시 실행하거나, 다음 명령으로 네임스페이스 매니페스트를 먼저 적용할 수 있습니다.
kubectl apply -f namespace.yaml
DNS 설정#
n8n은 일반적으로 서브도메인에서 운영됩니다. 사용 중인 제공업체에서 서브도메인에 대한 DNS 레코드를 생성하고 이를 인스턴스의 정적 주소로 지정합니다.
인스턴스에서 실행 중인 n8n 서비스의 주소를 찾으려면 다음 단계를 따르세요.
- AWS 콘솔에서 Amazon Elastic Kubernetes Service 페이지의 Clusters 섹션을 엽니다.
- 클러스터 이름을 선택하여 해당 구성 페이지를 엽니다.
- Resources 탭을 선택한 후 Service and networking > Services를 선택합니다.
- n8n 서비스를 선택하고 Load balancer URLs 값을 복사합니다. DNS에는 이 값에 n8n 서비스 포트(5678)를 붙여서 사용합니다.
HTTP 사용
이 가이드는 n8n-deployment.yaml과 같은 곳에서 정의하는 서비스에 HTTP 연결을 사용합니다. 그러나 Load balancer URLs 값을 클릭하면 EKS는 오류가 발생하는 "HTTPS" URL로 이동시킵니다. 이를 해결하려면 n8n 서브도메인을 열 때 반드시 HTTP를 사용하세요.
리소스 삭제#
설정을 삭제해야 하는 경우, 다음 명령으로 매니페스트가 생성한 리소스를 제거할 수 있습니다.
kubectl delete -f .
다음 단계#
이 섹션의 상세 내용은 n8n 공식 문서를 참조하세요.