AWS Transfer로 Serverless SFTP 구현

개요

프로젝트 진행중에 외부에서 SFTP를 통해 데이터를 받아 처리하는 로직을 구현할 일이 있었습니다. 데이터는 SFTP서버를 거쳐 최종적으로 S3에 저장되어 람다로 처리하는 로직이었습니다.

이러한 조건에서 EC2로 SFTP 서버를 구성하지 않고 AWS Transfer를 사용해 서버 없이 SFTP 서버를 구축하고 파일을 S3로 보관하는 솔루션을 소개하고 CloudFormation 템플릿을 공유하려 합니다.

아키텍쳐 다이어그램


AWS Transfer

AWS Transfer Family는 Amazon S3 또는 Amazon EFS에서 파일을 직접 송수신할 수 있는 완전관리형 서비스입니다.링크. 이번 솔루션에서는 AWS Transfer의 여러 서비스중 SFTP 서비스를 사용해 별도의 서버 구성 없이 SFTP 서버를 제공합니다. 거기다 바로 S3로 데이터를 전송해주기까지 하기 때문에 프로젝트에는 매우 적절한 서비스였습니다.

한 가지 고려할점은 AWS Transfer의 가격은 주관적인 기준에서 그리 싼 편이 아닙니다.
AWS Transfer 가격(서울 리전 기준)

M5 시리즈의 가격(서울 리전 기준)

그림처럼 AWS Transfer는 활성 시간당 $0.3 + 전송된 데이터의 GB당 $0.04 입니다. 전송 데이터를 제외하고는 일반적으로 사용하는 EC2 M5.xLarge 보다 조금 비싸고 M5.2xLarge보다 조금 싼 가격입니다. xLarge는 단순히 SFTP서버로만 사용하기에는 EC2 기준으론 매우 높은 가격입니다.

물론 이는 EC2를 이용해 SFTP 서버를 구축할때 필요한

  • EBS의 가격
  • SFTP서버 구성
  • 이중화 및 고가용성 확보
  • S3로의 데이터 전송 구현

에 해당하는 기회비용을 생각하면 적절한 가격일 수도 있습니다. 이런 비용에 관한 부분은 프로젝트의 규모와 솔루션의 내용에 따라 가치 판단이 필요한 부분입니다.


SSH 퍼블릭 키 생성

SFTP의 경우 서버에 인증을 위해 SSH키파일을 사용합니다. 추후 설명할 AWS Transfer에 유저를 생성하려면 유저에게 부여할 SSH 키를 만들어야 합니다.

여러 방법이 있겠지만 이번 포스팅에서는 윈도우즈 기준으로 puttyGen을 사용하여 만들어보겠습니다.

  • 우선 puttyGen을 설치합니다.링크 윈도우즈의 경우 다음 페이지에서 GUI 버전을 다운로드 받을 수 있습니다. 링크

  • 다운받은 PuttyGen을 적절히 설치합니다.

  • PuttyGen을 실행시키면 다음 화면을 보실 수 있습니다. 화면에서 Generate 버튼을 클릭합니다.

Putty 화면

  • 난수 생성을 위해 화면안에서 마우스를 움직이라고 요청합니다. 평소 실력을 발휘해 마우스를 요리조리 움직여 줍니다.

마우스를 움직일 때 마다 게이지가 차오릅니다.

  • 화면의 상단에(초록 테두리) 생성된 퍼블릭 키를 확인할 수 있습니다. 이제 Save Private Key(빨간 테두리)를 눌러 키를 적절한 이름으로 저장합니다. 이 때 키의 암호를 부여할 것인지 물어보는데 필요 없기 때문에 예를 눌러 진행합니다.

키가 생성되었습니다.

  • 저장후 위 그림의 초록색 테두리 안의 퍼블릭 키를 복사해 메모장에 저장해둡니다. 추후 유저를 생성할 때 복사/붙여넣기가 필요합니다.

AWS Transfer 설정

아래 부터의 내용은 마지막에 첨부한 CloudFormation 템플릿이 모든 과정을 포함하고 있으니 가볍게 보시기만 해도 됩니다.

AWS Trasnfer for SFTP를 사용하기 전에 몇 가지 준비사항이 필요합니다.

  • 데이터를 저장할 S3 버킷 생성
  • S3에 접근을 위한 역할(role)생성

의 순서로 진행하겠습니다.


S3 버킷 생성

AWS Transfer는 S3 혹은 EFS로 파일 전송이 가능합니다. 이번 포스팅에서는 S3에서 파일을 저장할 예정이기 때문에 S3 버킷을 생성하겠습니다.

S3 버킷을 적절한 이름(예시에서는 awstransfer-s3-bucket-test) 으로 생성합니다. 생성 과정은 기본적이 내용이라 생략하겠습니다.

적절한 이름으로 S3 버킷을 생성합니다.


IAM 역할 생성

AWS Transfer에서 S3에 데이터를 읽고 쓰기 위해서는 해당 버킷에 접근하기 위한 역할이 필요합니다.

  • IAM의 역할로 접근해 역할 만들기를 클릭합니다.

역할 만들기를 클릭합니다.

  • 사용 서비스에서 아래쪽에 위치한 Transfer를 클릭하여 진행합니다.

Transfer를 위한 역할이기 때문에 Trasnfer를 선택합니다.

  • 역할 정책 필터중 AmazonS3FullAccess 를 선택합니다. (추후에 유저별로 홈 디렉토리 접근 권한이외에는 권한을 제한할 예정이기 때문에 FullAccess를 부여하겠습니다.)

일반적으로는 FullAccess는 지양해야 합니다.

  • 적절한 이름으로 역할을 생성합니다. (예시에서는 AWSTransfer-S3Role)

이름과 설명을 부여합니다.


AWS Transfer 생성

AWS Transfer에서 SFTP 서버를 생성하겠습니다.

  • AWS Transfer로 이동해 서버 생성을 클릭합니다.

서버 생성을 클릭합니다.

  • 활성화 프로토콜중 SFTP를 선택합니다.

다른 프로토콜도 선택 가능하지만 이번 포스팅에서는 SFTP만을 선택합니다.

  • 엔드포인트 구성에서 공개적 엑세스를 선택하고 호스트이름은 없음으로 선택합니다. 참고로 Route53을 통해 엔드포인트를 보유한 도메인으로 연결시킬 수 있습니다.

필요시 Route53도 연동 가능합니다.

  • 도메인은 S3를 선택합니다.

EFS 도 가능합니다.

  • 생성에 시간이 좀 걸리기 때문에 조금 기다립니다.

AWS Transfer 유저 생성

생성한 SFTP 서버에서 유저를 생성하고 유저의 디렉토리를 지정해주고 해당 디렉토리 이외에는 권한을 제한하여 보안을 유지하겠습니다.

-생성된 서버를 클릭하여 사용자 추가를 클릭합니다.

사용차 추가 클릭합니다.

  • 사용자 이름을 정합니다(예시에서는 test).액세스 역할은 전에 생성한 역할을 선택합니다.(예시에서는 AWSTransfer-S3Role). 정책은 없음으로 선택합니다.
  • 홈 디렉터리에서 S3버킷은 이전에 생성한 S3버킷을 생성합니다. (예시는 awstransfer-s3-bucket-test). 디렉토리 주소는 유저명과 동일한 test 로 입력합니다. 즉 유저의 기본 디렉토리는 test입니다.

  • 제한됨 체크박스를 클릭합니다. 이 체크박스를 선택하면 해당 유저는 지정한 홈 디렉토리 이외에는 접근이 불가능합니다.(즉 / 에 올린 파일은 s3 버킷의 test/ 에 업로드 됩니다.)

위의 내용처럼 입력합니다.

  • SSH 퍼블릭 키에 이전에 PuttyGen으로 생성한 후 복사한 퍼블릭 키를 복사 붙여넣기로 넣습니다. 이후 추가로 유저 생성을 완료합니다.

SSH키 퍼블릭키는 이전에 생성한 내용 전체를 붙여넣기 해야 합니다.


SFTP 테스트

테스트는 아무 SFTP를 지원하는 클라이언트로도 가능하지만 예시에서는 FileZila를 사용하겠습니다.

  • 우선 서버 화면에서 앤드포인트를 확인 후 복사합니다.

엔드포인트를 복사합니다.

  • 새 연결에서 프로토콜을 SFTP로 선택하고 호스트는 복사한 엔드포인트를 붙여넣기 합니다. 사용자명은 이전에 생성한 test, 키 파일은 이전에 puttyGen으로 생성한 Private 키 파일을 선택해줍니다.

화면처럼 설정합니다.

  • 연결 클릭하면 하면 핑거프린트와 관련해 계속할지를 물어보는데 예를 클릭해 진행합니다.

  • 우선 아무 파일이나 전송합니다.

예시로 test.png를 전송했습니다.

  • 아까 생성한 S3버킷에 유저 디렉토리에 해당 파일이 생성되었는지 확인합니다.

파일이 생성되었습니다.


CloudFormation 템플릿

위의 모든 내용을 담아 Cloudformation 템플릿을 구성하였습니다. 아래 템플릿은

  1. 지정된 이름의 S3 버킷을 생성
  2. AWS Transfer로 해당 S3버킷을 데이터 저장소로 활용하는 SFTP 서버를 생성
  3. 지정된 SSH키를 사용하는 지정된 이름의 유저를 생성

합니다.

템플릿 다운로드

파라메터 값
- BucketName: S3버킷 명
- RESKey: puttyGen으로 생성한 퍼블릭 키
- UserName: 유저명


마치며

이번 포스팅에서는 AWS Transfer로 간편하게 Serverless 로 SFTP 서버를 구축하였습니다. 파일이 S3로 저장된 후 처리하는 로직을 위한 람다를 실행하여 로직을 처리하였는데, 이 부분은 다음 시간에 다루도록 하겠습니다.


WRITTEN BY
Dev Lead | Certified Professional AWS Solutions Architect/Devops Engineer

댓글