[LLM 경제 뉴스 요약 서비스] # 05. N8N 배포 (ECR, ECS)

2026. 1. 19. 16:20Programming/Project

 

 

안녕하세요-

이번에는 N8N을 ECS에 배포하는 과정을 포스팅하겠습니다.

작업 순서

1. EFS 추가
2. ECS 배포
2-1. 클러스터 정의
2-2. 태스크 정의
2-3. 보안그룹 설정
2-4. 서비스 정의

1. EFS 추가

우선 n8n은 공식 레포에서 도커 이미지를 pull 받고,

워크플로우는 개별 스토리지에 저장하게 됩니다.

 

그래서 스토리지를 연결하지 않으면 DB처럼 매번 서비스가 새로 배포될 때마다 초기화 됩니다.

따라서 태스크에 별도의 스토리지를 연결해줘야합니다.

 

여기서 n8n은 내부적으로 아래와 같이 동작합니다. 

  • workflow JSON을 파일로 저장
  • execution 상태를 파일로 flush
  • binary node 결과를 disk에 write
  • 큐 모드에서 worker 간 filesystem 동기화

따라서 여러 스토리지중에 파일시스템구조인 EFS를 사용하게 되었습니다.

 

액세스 포인트 생성

AWS > EFS 에서 파일시스템 생성 > 액세스 포인트 탭에서 아래와 같이 생성을 진행합니다.

 

2. ECS 배포

이제 ECS에 N8N을 배포해봅시다.

2-1. 클러스터 정의

클러스터는 이전 fastapi 배포 때 사용한 클러스터를 동일하게 사용했습니다.

https://keeper.tistory.com/72

 

[LLM 경제 뉴스 요약 서비스] # 03. FastAPI 서버 배포 (ECR, ECS)

이번 포스팅에서는 저번에 구현한 FastAPI/Postgresql 을 배포해보려합니다.작업 순서1. DB EC2 배포2. Docker Build3. ECR에 Docker 이미지 Push4. ECS 배포4-1. 클러스터 정의4-2. 태스크 정의 (PostgreSQL, FastAPI)4-3.

keeper.tistory.com

 

2-2. 태스크 정의

이제 태스크를  정의해보겠습니다-

 

port는 5678로 열어주고, 여기서 중요한 점은 EFS를 연결해 줘야합니다.

moutPoints를 통해 EFS 파일시스템에 저장된 루트에서 데이터를 가져와 컨테이너를 mount 시켜줍니다.

volumes 설정에 1번에서 생성한 EFS 파일시스템과 액세스 포인트의 ID를 설정해주면 연결됩니다.

 

저는 mountPoints 설정을 빼먹었다가.. 새배포 때, 워크플로우가 날아간 경험을 했습니다...
볼륨을 연결해도 mount 설정을 안해주면 의미가 없으니 주의하세요!

 

...
            "mountPoints": [
                {
                    "sourceVolume": "n8n_volume",
                    "containerPath": "/home/node/.n8n",
                    "readOnly": false
                }
            ],
            ...
    "volumes": [
        {
            "name": "n8n_volume",
            "efsVolumeConfiguration": {
                "fileSystemId": <EFS 파일시스템 ID>,
                "rootDirectory": "/",
                "transitEncryption": "ENABLED",
                "authorizationConfig": {
                    "accessPointId": <EFS 액세스포인트 ID>
                    "iam": "DISABLED"
                }
            }
        }
    ],
    ...

 

태스크 정의 전체
{
    "family": "llm-economy-n8n-task",
    "containerDefinitions": [
        {
            "name": "n8n-container",
            "image": "n8nio/n8n:latest",
            "cpu": 0,
            "portMappings": [
                {
                    "name": "5678",
                    "containerPort": 5678,
                    "hostPort": 5678,
                    "protocol": "tcp",
                    "appProtocol": "http"
                }
            ],
            "essential": true,
            "environment": [
                {
                    "name": "N8N_SECURE_COOKIE",
                    "value": "false"
                }
            ],
            "mountPoints": [
                {
                    "sourceVolume": "n8n_volume",
                    "containerPath": "/home/node/.n8n",
                    "readOnly": false
                }
            ],
            "volumesFrom": [],
            "logConfiguration": {
                "logDriver": "awslogs",
                "options": {
                    "awslogs-group": "/ecs/llm-economy-n8n-task",
                    "awslogs-create-group": "true",
                    "awslogs-region": "us-west-2",
                    "awslogs-stream-prefix": "ecs"
                }
            },
            "systemControls": []
        }
    ],
    "executionRoleArn": "arn:aws:iam::<accountID>:role/service-role/ecsTaskExecutionRole",
    "networkMode": "awsvpc",
    "volumes": [
        {
            "name": "n8n_volume",
            "efsVolumeConfiguration": {
                "fileSystemId": <EFS 파일시스템 ID>,
                "rootDirectory": "/",
                "transitEncryption": "ENABLED",
                "authorizationConfig": {
                    "accessPointId": <EFS 액세스포인트 ID>
                    "iam": "DISABLED"
                }
            }
        }
    ],
    "placementConstraints": [],
    "requiresCompatibilities": [
        "FARGATE"
    ],
    "cpu": "512",
    "memory": "1024",
    "runtimePlatform": {
        "cpuArchitecture": "X86_64",
        "operatingSystemFamily": "LINUX"
    },
    "enableFaultInjection": false
}

 

2-3. 보안그룹 설정

이제 5678 포트와 EFS를 위한 2049포트를 태스크의 보안그룹에 연결해줘야합니다.

 

ALB를 사용하신다면 

유형 - TCP / 소스 - ALB 보안그룹 / 포트 - 5678

유형 - TCP / 소스 - NFS / 포트 - 2049

 

ALB를 사용하지 않는다면

유형 - TCP / 소스 - 0.0.0.0/0 / 포트 - 5678

유형 - TCP / 소스 - NFS / 포트 - 2049

 

로 인바운드 규칙을 추가해줍니다.

 

ALB 설정은 FastAPI와 동일해서 아래 포스팅을 참고해주세요.

https://keeper.tistory.com/72

 

[LLM 경제 뉴스 요약 서비스] # 03. FastAPI 서버 배포 (ECR, ECS)

이번 포스팅에서는 저번에 구현한 FastAPI/Postgresql 을 배포해보려합니다.작업 순서1. DB EC2 배포2. Docker Build3. ECR에 Docker 이미지 Push4. ECS 배포4-1. 클러스터 정의4-2. 태스크 정의 (PostgreSQL, FastAPI)4-3.

keeper.tistory.com

 

2-4. 서비스 정의

이제 마지막으로 생성한 태스크로 서비스를 생성해주기만 하면 끝입니다-

 

이제 접속해보면 초기화된 화면을 만나볼 수 있답니다..!

이제 로컬에서 작업하던 workflow에서 json으로 export하고 배포한 n8n에서 import해주면 가져와집니다-

다만 인증 관련 내용은 새로 다시 설정해줘야합니다-

 

그렇다면 진짜 최종 끝입니다!

 

간단회고

n8n 배포과정은 fastapi랑 거의 흡사하지만 EFS를 연결하는 부분만 달랐던 것 같네요!
덕분에 n8n이 어떤방식으로 데이터를 관리하는지 알아볼 수 있었습니다.

다음 포스팅에서는 프론트엔드 작업 및 호스팅에 대해서 가져오겠습니다-!

 

 

 

 

참고 자료

https://medium.com/@destiya.dian/how-to-deploy-n8n-to-aws-part-i-ecs-710742460128

 

반응형