AWS Transfer FamilyとMSADでFTP環境を構築してみる

AWS Transfer Familyを利用してFTP環境を構築してみました。

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、AWS事業本部のニシヤマです。

先日、Transfer FamilyでFTP対応サーバーの作成をする機会があったので備忘録も兼ねてご紹介します。

注意点

プロトコルFTPの場合、ID プロバイダーは以下の2つから選択が可能です。

  • AWS Directory Service for Microsoft Active Directory (MSAD)
  • カスタム ID プロバイダー

また、パブリックにアクセス可能なエンドポイントはサポートされていません。

前提

すでに図の様な構成のVPCとMSADが作成され、ドメインに参加させたWindowsサーバからActive Directoryの操作可能な状態であること。

MSADの立ち上げと、Windowsサーバのドメイン参加は以下を参照してください。

AWS Directory Service(Microsoft AD)でActive Directoryを立ててWindowsを参加させる

やってみる

では上記構成の環境構築が完了している状態から始めます。

FTPサーバ専用のセキュリティグループを作成

後でも作成は可能ですが事前にFTPサーバ専用のセキュリティグループを作成します。

インバウンドルールですが以下のドキュメントにある通り21番(コントロールチャネル)と、8192-8200(データチャネル)を許可します。今回はVPC内から許可するように設定します。

https://docs.aws.amazon.com/ja_jp/transfer/latest/userguide/create-server-ftp.html

Transfer Family 用の FTP サーバは、ポート 21(コントロールチャネル)およびポート範囲 8192-8200(データチャネル)で動作します。

作成手順は省略しますが以下のセキュリティグループを作成しました。

FTP用のActive Directoryのグループの作成

次にActive DirectoryでFTP用ユーザを作成します。Transfer FamilyでFTPを利用する場合、グループのSIDが必要になるのでまずはドメインに参加させたEC2インスタンスでActive Directory ユーザーとコンピューターを起動しFTPユーザ用グループを作成します。

以下のドキュメントの開始する前にに記載の通り、PowerShell コマンドを使用して、グループのSIDを取得しておきます。後で利用するのでSIDは控えておいてください。

https://docs.aws.amazon.com/ja_jp/transfer/latest/userguide/directory-services-users.html

FTP用のActive Directoryのユーザの作成

次にFTP用のユーザを作成し、上記で作成したFTPユーザ用グループに追加します。今回はftpuser1というユーザを作成しグループに追加しました。

以上でFTPユーザの作成が完了です。

保存先がEFSの場合

Transfer Familyの場合、アップロードしたファイルの保存先にS3バケットとEFSを選択が可能です。 まずは保存先にEFSを選択する手順をご紹介します。

EFSの作成方法は以下を参照してください。

Amazon EFSを使ってみた

EFSの作成が完了しました。

FTP用ユーザのIAMロール作成

Transfer Familyのユーザのアクセス権限に関してはIAMロールを利用する為、FTPユーザ用にIAMロールを作成します。

こちらの作成手順も省略しますが信頼されたエンティティでtransfer.amazonaws.comを選択、また今回ポリシーはAmazonElasticFileSystemClientFullAccessをアタッチして作成します。

FTPサーバを作成

それではTransfer Familyの設定を行っていきます。Transfer Familyの画面でサーバの作成をクリックします。

プロトコルを選択で「FTP」を選択して次へをクリックします。

ID プロバイダーを選択の画面でAWS Directory Serviceを選択し、事前に作成しておいたMSADのを選択し次へをクリックします。

エンドポイントを選択の画面では以下のパラメータを指定して次へをクリックします。

  • エンドポイントのタイプ:VPC でホスト
  • アクセス:内部
  • VPC:事前に作成していたVPC ID
  • アベイラビリティーゾーン:任意のAZにチェックを入れサブネットを指定
  • セキュリティグループ:FTPサーバ専用のセキュリティグループを指定

ちなみに、エンドポイントのタイプのパブリックアクセスや、アクセスでインターネット向けを指定すると以下の様にFTPが利用できないエラーが表示されます。

ドメインを選択ではAmazon EFSを選択し次へをクリックします。

次の画面でも次へをクリックします。

最後に確認画面でサーバを作成をクリックします。

少し待つとサーバの作成ができました。

ただし、ユーザの列でアクセスなしとなっているのでサーバIDをクリックして詳細画面に移動します。

サーバの詳細画面でアクセスの項目のアクセスの追加をクリックします。

この画面では以下の情報を入力して、追加をクリックします。

  • SID:FTP用のActive DirectoryのグループのSID
  • ユーザー ID:アップロードしたファイルのユーザーID ※今回はec2-userと同じ1000を指定
  • グループ ID:アップロードしたファイルのグループID ※今回はec2-userと同じ1000を指定
  • ロール:作成したFTP用ユーザのIAMロール
  • ホームディレクトリ:保存先のEFSと、ユーザのホームディレクトリに指定するパスを入力
  • 制限付き:ユーザをホームディレクトリより上位階層への移動を制限する場合はチェックする

アクセスの項目に情報が追加されました。

FTPでアクセスしてみる

それでは実際にFTPでアクセスしてみます。今回はVPC内にAmazon Linux 2のEC2を起動して確認してみます。

ホームディレクトリの作成

FTPでアクセスするにあたりアクセスの追加で設定したホームディレクトリを作成する必要があります。EFSをマウントしディレクトリを作成します。ディレクトリの所有者をアクセスの追加で設定したユーザID、グループIDで指定したユーザに変更します。 EFSのマウントに関しては以下を参照して下さい。

(初心者向け)EC2インスタンスにEFSをマウントしてみた

$ sudo mkdir /mnt/efs-mount-point
$ sudo sudo mount -t nfs -o nfsvers=4.1,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2,noresvport fs-0d32cc9ca2cc6f831.efs.ap-northeast-1.amazonaws.com:/   /mnt/efs-mount-point
$ sudo mkdir /mnt/efs-mount-point/ftpuser1
$ sudo chown ec2-user:ec2-user /mnt/efs-mount-point/ftpuser1
$ sudo ls -ld /mnt/efs-mount-point/ftpuser1
drwxr-xr-x 2 ec2-user ec2-user 6144 11月 16 16:55 /mnt/efs-mount-point/ftpuser1

FTPでアクセス

これでやっと準備ができました。それではFTPでアクセスしたいと思います。

アクセスするFTPサーバのDNS名はVPCエンドポイントのDNS名を利用するので、サーバ詳細画面のリンクから確認します。

$ ftp vpce-00938b393feca6853-t1r0xlx1.vpce-svc-0c6fc1c14ceb5b0d8.ap-northeast-1.vpce.amazonaws.com
Trying 10.0.11.118...
Connected to vpce-00938b393feca6853-t1r0xlx1.vpce-svc-0c6fc1c14ceb5b0d8.ap-northeast-1.vpce.amazonaws.com (10.0.11.118).
220 Service ready for new user.
Name (vpce-00938b393feca6853-t1r0xlx1.vpce-svc-0c6fc1c14ceb5b0d8.ap-northeast-1.vpce.amazonaws.com:ec2-user): ftpuser1
331 User name okay, need password for ftpuser1.
Password:
230 User logged in, proceed.
Remote system type is UNIX.
ftp> pwd
257 "/fs-0d32cc9ca2cc6f831/ftpuser1" is current directory.

サーバに接続できました!FTPで適当なファイルをアップロードしてみます。以下ドキュメントにも記載の通りFTPの場合バイナリモードのみがサポートされているためモード変更してからアップロードしてください。

https://docs.aws.amazon.com/ja_jp/transfer/latest/userguide/transfer-file.html

 FTP および FTPS では、イメージ/バイナリモードのみがサポートされています。

ftp> !ls
ftp_upload_file.txt
ftp> bin
200 Command TYPE okay.
ftp> put ftp_upload_file.txt
local: ftp_upload_file.txt remote: ftp_upload_file.txt
227 Entering Passive Mode (10,0,11,118,32,8)
150 File status okay; about to open data connection.
226 Transfer complete.
13 bytes sent in 4.7e-05 secs (276.60 Kbytes/sec)
ftp> ls -l
227 Entering Passive Mode (10,0,11,118,32,5)
150 File status okay; about to open data connection.
-rw-rw-rw-   1 1000 1000           13 Nov 16 17:20 ftp_upload_file.txt
226 Closing data connection.

アップロードできました!マウントしているターミナルからも確認してみます。

$ ls -l /mnt/efs-mount-point/ftpuser1/
合計 4
-rw-rw-rw- 1 ec2-user ec2-user 13 11月 16 17:20 ftp_upload_file.txt

確認できました。ダウンロードも確認してみます。

ftp> ls -l
227 Entering Passive Mode (10,0,11,118,32,2)
150 File status okay; about to open data connection.
-rw-rw-r--   1 1000 1000           52 Nov 16 17:27 ftp_download_file.txt
-rw-rw-rw-   1 1000 1000           13 Nov 16 17:20 ftp_upload_file.txt
226 Closing data connection.
ftp> get ftp_download_file.txt
local: ftp_download_file.txt remote: ftp_download_file.txt
227 Entering Passive Mode (10,0,11,118,32,0)
150 File status okay; about to open data connection.
226 Transfer complete.
52 bytes received in 0.152 secs (0.34 Kbytes/sec)
ftp> !ls
ftp_download_file.txt  ftp_upload_file.txt

ダウンロードもできました。

保存先がS3バケットの場合

せっかくなので保存先をS3バケットにした場合も確認してみます。FTPサーバを作成の手順のドメインを選択でS3バケットを選択します。

アクセスの追加の画面ではSIDと、IAMロール、ホームディレクトリでアップロード先のS3バケットを指定します。 ホームディレクトリでパスを指定した場合は事前にS3バケット上にフォルダを作成しておいて下さい。

また、FTP用ユーザのIAMロールにはS3バケットへのアクセス権限を付与しておいてください。では先ほどと同じようにVPCエンドポイントからDNS名を確認し、FTPでアクセスしてアップロードしてみます。

ftp> bin
200 Command TYPE okay.
ftp> put ftp_upload_file.txt
local: ftp_upload_file.txt remote: ftp_upload_file.txt
227 Entering Passive Mode (10,0,12,208,32,4)
150 File status okay; about to open data connection.
226 Transfer complete.
13 bytes sent in 3.5e-05 secs (371.43 Kbytes/sec)
ftp> ls -l
227 Entering Passive Mode (10,0,12,208,32,0)
150 File status okay; about to open data connection.
-rwxr--r--   1 - -           13 Nov 16 17:45 ftp_upload_file.txt
226 Closing data connection.

S3バケットへのアップロードもできてます!

ftp> ls
227 Entering Passive Mode (10,0,12,208,32,8)
150 File status okay; about to open data connection.
-rwxr--r--   1 - -           13 Nov 16 17:45 ftp_upload_file.txt
-rwxr--r--   1 - -        61690 Nov 16 17:48 s3_ftp_download_file.txt
226 Closing data connection.
ftp> get s3_ftp_download_file.txt
local: s3_ftp_download_file.txt remote: s3_ftp_download_file.txt
227 Entering Passive Mode (10,0,12,208,32,0)
150 File status okay; about to open data connection.
226 Transfer complete.
61690 bytes received in 0.721 secs (85.58 Kbytes/sec)
ftp> !ls -l
合計 132
-rw-rw-r-- 1 ec2-user ec2-user 61690 11月 16 17:47 ftp_download_file.txt
-rw-rw-r-- 1 ec2-user ec2-user    13 11月 16 17:16 ftp_upload_file.txt
-rw-rw-r-- 1 ec2-user ec2-user 61690 11月 16 17:50 s3_ftp_download_file.txt

S3バケットからダウンロードもできました!

以上です。

まとめ

いかがでしたでしょうか。以前CentOS7でFTPサーバ構築をした時に比べ、ちょっと大掛かりではありましたがマネージドサービスだけでFTP環境を構築できるのは便利ですね。まだまだFTPを利用するシステムもあるかと思いますのでAWSとのファイル連携の際などに参考にしてみてください。