n8n을 EC2 인스턴스에 배포해보자 🚀🚀🚀

발행: (2025년 12월 10일 오후 10:05 GMT+9)
8 min read
원문: Dev.to

Source: Dev.to

나는 자동화를 정말 좋아한다

워크플로우에서 자동화를 하는 것을 언제나 즐겨왔다. n8n을 우연히 발견했을 때, 솔직히 감탄했다. 그전까지 가졌던 아이디어들—예를 들어 Google Sheets 업데이트, 소셜 미디어에 포스팅, 자체 API 호스팅, Google Drive를 S3 버킷과 동기화 등—이 모두 새로운 프레임워크나 라이브러리를 배울 필요 없이 현실화될 수 있었다. n8n은 실제로 배포되어 일상 업무에 도움이 되는 작은 자동화를 훨씬 쉽게 만들 수 있게 해 주었고, 그래서 나는 n8n에 푹 빠졌다.

아래는 AWS EC2 인스턴스에 n8n을 배포하여 자체 인프라에서 자동화를 실행할 수 있도록 하는 단계별 가이드이다.

1. EC2 인스턴스 생성

  1. AWS Management Console에 로그인하고 EC2 Dashboard로 이동한다.

  2. Launch instance를 클릭한다.

  3. Name – 인스턴스를 알아보기 쉬운 이름으로 지정한다. 예: n8n.

  4. Application and OS Images (AMI)Amazon Linux 2023 AMI(Free Tier 사용 가능)를 선택한다.

  5. Architecture – 비용 효율성을 위해 **64-bit (ARM)**을 선택한다(Graviton 프로세서).

  6. Instance type – 이 튜토리얼에서는 t4g.medium(2 vCPU, 4 GB RAM)을 사용한다.

    왜 t4g.medium인가?

    • 유사한 x86 인스턴스 대비 약 40 % 더 나은 가격‑성능.
    • n8n과 여러 워커를 구동하기에 충분한 리소스.
    • CPU 크레딧을 이용한 버스트 성능.
    • t3.medium 대비 약 40 % 저렴.
    • 프로덕션에 적합(t4g.micro와는 달리).
    인스턴스vCPURAMTypical Use
    t4g.micro11 GBFree Tier 전용, 제한적
    t4g.medium24 GB소규모‑중간 규모 배포(권장)
    t4g.large28 GB대용량 워크플로우
  7. Key pair (login) – 기존 키 페어를 선택하거나 새로 만든다. SSH 접속에 필요하다.

  8. Network settings – 다음 인바운드 규칙을 가진 새 보안 그룹을 만든다:

    RulePortProtocolSourcePurpose
    SSH22TCPYour IP (or 0.0.0.0/0 for testing only)원격 터미널 접근
    HTTP80TCP0.0.0.0/0웹 트래픽(HTTPS로 리다이렉트)
    HTTPS443TCP0.0.0.0/0n8n UI용 보안 웹 트래픽
  9. Storage – 기본 8 GiB gp3 볼륨이면 기본 설치에 충분하다.

  10. Advanced detailsUser data 필드에 다음 섹션의 스크립트를 붙여넣는다.

  11. 요약을 검토하고 Launch instance를 클릭한다.

2. User Data 스크립트 (자동 설정)

다음 스크립트를 User data 텍스트 박스에 붙여넣는다. 시스템을 업데이트하고 Git, Docker, Docker Compose를 설치하며 Docker 권한을 설정한다.

#!/bin/bash
yum install -y git docker

# Install Docker Compose plugin (system-wide)
mkdir -p /usr/local/lib/docker/cli-plugins
curl -SL "https://github.com/docker/compose/releases/latest/download/docker-compose-linux-$(uname -m)" \
  -o /usr/local/lib/docker/cli-plugins/docker-compose
chmod +x /usr/local/lib/docker/cli-plugins/docker-compose

# Enable and start Docker
systemctl enable docker
systemctl start docker

# Allow ec2-user to run Docker without sudo
usermod -aG docker ec2-user

인스턴스가 부팅될 때 스크립트가 자동으로 실행되어 여러 수작업 단계를 절약한다.

3. 인스턴스에 연결

  1. EC2 콘솔에서 실행 중인 인스턴스를 선택하고 Connect를 클릭한다.
  2. EC2 Instance Connect 탭을 선택하고 기본 사용자 이름 ec2-user를 유지한 뒤 Connect를 클릭한다.
  3. 브라우저 기반 터미널이 열릴 것이다. Docker Compose가 정상적으로 설치됐는지 확인한다:
docker compose --version

버전 번호가 표시되면 환경이 준비된 것이다.

4. 사전 구성된 레포지토리로 n8n 배포

git clone https://github.com/coozgan/hosting-n8n-aws.git
cd hosting-n8n-aws

이 레포지토리는 프로덕션 수준의 n8n 배포를 다음과 같이 설정한다:

  • n8n workers – 비동기 워크플로우 실행.
  • Redis – 작업 큐 및 재시도 처리.
  • PostgreSQL – 워크플로우, 실행 기록, 사용자 데이터 영구 저장.
  • Caddy – 자동 SSL/TLS 인증서를 제공하는 리버스 프록시.

4.1 환경 변수 설정

cp .env-example .env
nano .env

다음 변수들을 추가(또는 수정)한다:

# Domain Configuration
DOMAIN=your-domain.com   # 도메인이 없으면 localhost 사용

# n8n Encryption (강력한 랜덤 키 생성)
N8N_ENCRYPTION_KEY=YOUR_STRONG_KEY

# PostgreSQL Database
POSTGRES_PASSWORD=YOUR_POSTGRES_PASSWORD

# Timezone
GENERIC_TIMEZONE=America/New_York

선택 사항 – DuckDNS 도메인(맞춤 도메인 없이 테스트할 경우)

  1. https://www.duckdns.org 에서 서브도메인을 만든다.
  2. curl ifconfig.me 로 얻은 인스턴스의 공인 IP를 DuckDNS 레코드에 추가한다.
  3. .env 파일의 DOMAIN을 해당 DuckDNS 서브도메인으로 설정한다.

Important: N8N_ENCRYPTION_KEYPOSTGRES_PASSWORD는 안전하게 보관한다. 이를 잃어버리면 워크플로우나 데이터를 복구할 수 없다.

Ctrl+XYEnter 로 저장하고 종료한다.

4.2 스택 시작

docker compose up -d

모든 컨테이너가 실행 중인지 확인한다:

docker compose ps

로그를 스트리밍하여 모든 것이 정상적으로 시작됐는지 확인한다:

docker compose logs -f

5. n8n UI에 접근

  • 맞춤 도메인 사용 시: https://your-domain.com
  • 도메인 없이 테스트할 경우: http://

n8n 로그인 화면이 나타날 것이다. 첫 사용자 계정을 만든다.

축하한다! 이제 AWS에 기능하는 n8n 배포가 완성되었다.

6. 확장: 워커 추가

추가 워커 인스턴스를 만들려면 docker-compose.yml을 편집하고 아래 예시와 유사한 항목을 추가한다:

n8n-worker-2:
  extends: n8n-worker
  container_name: n8n-worker-2
  # ...필요 시 추가 설정

n8n-worker-3:
  extends: n8n-worker
  container_name: n8n-worker-3
  # ...필요 시 추가 설정

그런 다음 스택을 재시작한다:

docker compose up -d

7. 성능 최적화 팁

설명
워커 수 조정2~3개의 워커로 시작하고 docker stats 로 CPU/메모리 사용량을 모니터링한다.
데이터베이스 정리compose 파일은 EXECUTIONS_DATA_PRUNE=true(기본 7일 보관)를 설정한다. 필요 시 EXECUTIONS_DATA_MAX_AGE 를 조정한다.
Redis 메모리Redis는 LRU 퇴출 정책을 가진 512 MB 로 제한된다. docker exec redis redis-cli info stats 로 모니터링한다.

8. 보안 모범 사례

  • 사용자 관리N8N_USER_MANAGEMENT_DISABLED=false(기본값) 로 두고 팀원마다 별도 계정을 만든다.
  • SSH 접근 제한 – 보안 그룹을 수정해 SSH를 자신의 IP 주소에서만 허용한다.
  • 비밀 정보 안전하게 보관N8N_ENCRYPTION_KEYPOSTGRES_PASSWORD를 비밀번호 관리 도구나 AWS Secrets Manager에 저장한다.

자동화 즐기세요!

Back to Blog

관련 글

더 보기 »

1283일 차: 시도와 시도

프로페셔널하게 꽤 여유로운 하루였어요. 몇 차례 회의에서 제가 작업해 온 것을 데모했으며 매번 성공적이었습니다. 커뮤니티 질문 몇 개에 답변했습니다.