AWS Transfer Family 를 사용하여 SFTP로 S3와 통신하기
안녕하세요 클래스메소드의 서은우입니다.
AWS Transfer Family 는 SFTP, FTPS, FTP 및 AS2 프로토콜을 사용하여 S3, EFS로 파일을 전송할 수 있게 하는 서비스입니다.
본 블로그에서는 콘솔 상에서 직접 AWS Transfer Family 를 이용하여 SFTP 서버를 생성하고 S3와 통신하는 방법에 대해 알아보도록하겠습니다.
아키텍쳐
AWS Transfer Family 를 이용하여 SFTP 서버를 생성하기에 앞서 고려해야할 사항은 다음과 같습니다.
- SFTP 서버를 인터넷에 공개할 것인지
- 액세스를 제한이 필요한지
위와 같은 사항에 따라 SFTP 서버를 액세스 제한 없이 인터넷에 공개하거나 VPC 내부에서만 사용가능 하게 하는 등 각기 다른 아키텍처를 채택할 수 있습니다. 본 블로그에서 구현할 아키텍처는 다음과 같습니다.
인터넷을 통해 SFTP 서버에 접속할 수 있으며, 보안 그룹을 설정하여 액세스를 제어 할 수 있습니다.
직접해보기
사전에 필요한 것
퍼블릭 서브넷이 있는 VPC 환경과 EIP, 액세스 제어를 위한 보안 그룹이 필요합니다. 또한 SFTP 서버 유저에게 부여할 S3에 파일을 업로드 권한을 가진 IAM Role과 유저 인증을 위한 SSH 키가 미리 준비되어있어야합니다.
- Public Subnet
- EIP
- Security Group
- IAM Role
- 공식 문서에서 SFTP 서버 유저에 부여할 IAM Role에 관한 정보를 확인할 수 있습니다.
- SSH key
SFTP 서버 생성
1. AWS Transfer Family 서버 생성 화면으로 이동
AWS Transfer Family 의 콘솔 화면에 액세스하여 [Create server] 버튼을 눌러 서버 생성 화면으로 이동합니다.
2. 프로토콜 선택
사용할 프로토콜을 선택합니다. 본 블로그에서는 SFTP를 선택합니다.
3. 자격 증명 프로바이더 선택
- Service managed: AWS Transfer Family 에 사용자 ID와 키를 저장할 수 있습니다.
- AWS Directory Service: AD를 사용하여 유저를 인증할 수 있습니다.
- Custom identity provider: Lambda와 API Gateway 중 자격 증명 프로바이더를 선택할 수 있습니다.
본 블로그에서는 Service managed 를 선택합니다.
4. 엔드포인트 설정
엔드포인트 타입은 VPC hosted 이며 액세스는 Internet Facing 를 선택합니다.
그리고 대상이 되는 VPC와 AZ, 생성해 둔 EIP와 보안 그룹을 설정합니다.
5. 도메인 설정
S3 에 파일을 업로드하기 위해 도메인으로 S3를 선택합니다.
6. 기타 설정
CloudWatch 로깅을 위한 IAM Role의 설정이나 암호화 알고리즘과 같은 기타 옵션들을 설정한 후 서버를 생성합니다.
7. 생성된 서버 확인
서버 생성까지는 수 분 정도가 소요됩니다. 생성이 완료되면 서버 ID 를 클릭하여 서버의 상세 정보를 확인할 수 있습니다.
8. 유저 작성
생성한 SFTP 서버를 이용하기 위해서는 해당 서버를 이용할 수 있는 유저를 등록할 필요가 있습니다. Add user 버튼을 눌러 유저 작성을 시작할 수 있습니다.
9. 유저 작성
- IAM Role: 유저가 S3 버켓에 파일을 업로드 하기 위해서는 권한이 필요합니다. 해당 권한이 있는 IAM Role 을 선택합니다.
- Home directory: 파일을 저장할 S3 버켓과 유저가 로그인 할 때 위치할 디렉토리 경로를 지정합니다.
- SSH public key: SSH 퍼블릭 키 내용을 입력합니다.
각종 설정을 입력한 후 Add 버튼을 눌러 유저 작성을 완료합니다.
10. SFTP 서버 엔드포인트 확인
해당 서버의 상세 정보 화면에서 생성된 SFTP 서버 SFTP에 접속하기 위한 엔드포인트를 확인할 수 있습니다.
11. SFTP 서버에 접속
다음과 같은 명령어를 입력하여 SFTP 서버에 접속합니다.
sftp -i SSH개인키 유저명@엔드포인트 # sftp -i transfer-key sftp_user@service_endpoint
12. 파일 업로드
다음과 같은 명령어를 입력하여 파일을 업로드할 수 있습니다.
put 파일명.형식
생성한 SFTP 서버에서 사용 가능한 명령어는 다음과 같은 명령어를 통해 확인할 수 있습니다.
sftp> help Available commands: bye Quit sftp cd path Change remote directory to 'path' chgrp grp path Change group of file 'path' to 'grp' chmod mode path Change permissions of file 'path' to 'mode' chown own path Change owner of file 'path' to 'own' df [-hi] [path] Display statistics for current directory or filesystem containing 'path' exit Quit sftp get [-afPpRr] remote [local] Download file reget [-fPpRr] remote [local] Resume download file reput [-fPpRr] [local] remote Resume upload file help Display this help text lcd path Change local directory to 'path' lls [ls-options [path]] Display local directory listing lmkdir path Create local directory ln [-s] oldpath newpath Link remote file (-s for symlink) lpwd Print local working directory ls [-1afhlnrSt] [path] Display remote directory listing lumask umask Set local umask to 'umask' mkdir path Create remote directory progress Toggle display of progress meter put [-afPpRr] local [remote] Upload file pwd Display remote working directory quit Quit sftp rename oldpath newpath Rename remote file rm path Delete remote file rmdir path Remove remote directory symlink oldpath newpath Symlink remote file version Show SFTP version !command Execute 'command' in local shell ! Escape to local shell ? Synonym for help
대상 S3 버켓의 경로로 이동하여 파일이 제대로 업로드 된 것을 확인할 수 있습니다.
끝으로
AWS Transfer Family를 이용하여 간단하게 SFTP 프로토콜로 S3 버킷에 파일을 업로드할 수 있다는 점이 매우 좋았던 것 같습니다. 또한 본 블로그에서 다룬 구성과 프로토콜 이외에도 다양한 옵션이 있기 때문에 활용도가 높은 서비스라고 생각되었습니다.