AWS Transfer for SFTPがFTP/FTPSをサポートしました!

記事タイトルとURLをコピーする

こんにちは、技術1課の小倉です。
2020/4/23にアップデートがあり、AWS Transfer for SFTPがFTP/FTPSをサポートしました!

Introducing the AWS Transfer Family with fully managed support for SFTP, FTPS, and FTP 2018年11月にAWS Transfer for SFTPがリリースされましたが、今回さらにFTP/FTPSがサポートされました。今までFTP/FTPSを利用していて、SFTPに切り替えることができないアプリケーションで利用できます。

FTP/FTPSの接続方法はVPCエンドポイントのみで、FTPはVPC内からのアクセスのみ(インターネット経由では利用できない)です。

また、クライアント通信に制限があるので、注意が必要です。

  • AWS FTPSの場合、明示モードのみがサポートされます。暗黙モードはサポートされていません。
  • AWS FTPおよびAWS FTPSでは、パッシブモードのみがサポートされています。
  • AWS FTPおよびAWS FTPSでは、STREAMモードのみがサポートされています。
  • AWS FTPおよびAWS FTPSの場合、イメージ/バイナリモードのみがサポートされます。
  • AWS FTPおよびAWS FTPSの場合、データ接続のTLS-PROT C(無保護)TLSがデフォルトです。

詳細はAWSドキュメント(2020/4/29現在、英語サイトのみ)に記載されています。

AWS Transfer Familyとは

SFTP, FTP, FTPSプロトコルを使用して、S3バケットにファイルを転送するフルマネージド型のサービスです。それぞれのプロトコルの違いです。

  • FTP : クライアントとサーバ間でファイルを平文で転送するプロトコル
  • FTPS : クライアントとサーバ間でファイルをSSL/TLSを利用して暗号化して転送するプロトコル
  • SFTP : FTPで転送するファイルをSSHを利用して暗号化するプロトコル

AWS Transfer Family

AWS Transfer Family の料金は公式サイトに記載されていますが、プロトコルのエンドポイントごとに料金がかかりますので、必要な分だけエンドポイントを作成するようにしましょう。

AWS Transfer Family の料金

設定方法

2020/4/29現在、FTP/FTPSは、SFTPで利用できていたIdentity providerのService managed(Transfer for SFTPのコンソールで接続ユーザの追加が可能)が利用できません。そのため、API Gatewayを利用するCustomを選択する必要があります。

以下の画像は、Step 1でプロトコルにFTPを選択して、Step 2のIdentity providerにService managedを選択したところです。FTPとFTPSはService managedがサポートされていないため警告が表示されます。

今回はAWS公式サイトで公開されているCloudFormationのテンプレートを使用して準備します(Transfer for SFTP、API Gateway、Lambdaが作成されます)。パラメータ入力で、UserRoleArnの部分だけは事前にIAMロールを準備して、作成したIAMロールのARNを入力します。

作成するIAMロールのポリシーはTransfer FamilyがS3へのアクセスできるようにします。IAMロールを作成するときにAWSサービスにTransferを選択し、以下のポリシーを適用しました。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "s3:*",
            "Resource": [
                "arn:aws:s3:::<bucketname>",
                "arn:aws:s3:::<bucketname>/*"
            ]
        }
    ]
}

また、接続先のS3バケット(今回は20200429-oguratest)に接続した後に確認できるようにファイルを置いておきます。

FTPの設定と接続

設定

CloudFormationのテンプレートを実行したあとにマネジメントコンソールのAWS Transfer Familyを開いたら、プロトコルがSFTPのサーバが起動しています。この設定をFTPに変更します。まずは [Server ID] をクリックして詳細設定を開きます。

SFTPからFTPに変更するためにはサーバの停止が必要ですので、右上の[Actions] - [stop]をクリックします。Endpoint detailsのステータスがOfflineになったら[Edit]をクリックします。

以下の内容を変更して、[Save]をクリック

  • Endpoint type : VPC hostedに変更 (FTPはPublicly accessibleに対応していません)
  • Access : Internalに変更 (FTPはInternet Facingに対応していません)
  • VPC : エンドポイントを作成するVPC IDを選択します
  • Subnet ID : エンドポイントを作成するサブネットを選択します

次にProtocolsの [Edit] をクリックします。
SFTPのチェックを外し、FTPにチェックを入れて、[Save] をクリックします。

変更後の設定はこのようになっています。この状態で右上の [Actions] - [Start]をクリックしてサーバを起動します。Endpoint detailsのステータスがOnlineになったら使用可能です。

念のため認証のテストをします。右上の [Actions] - [Test] をクリックします。
以下の画面に以下の情報を入力して、[Test] をクリックします。

  • Username : myuser
  • Password : MySuperSecretPassword
    ※ユーザとパスワードはCloudFormationテンプレートのパラメータで指定した値です

テスト結果で、"StatusCode" : 200, が表示されていれば認証は問題ありません。

FTPの接続先の確認をします。VPCにアクセスして、 [エンドポイント] をクリックします。サービス名にtransferと入っている設定を選択し、画面下の詳細タブのDNS名が接続先です。

エンドポイントのセキュリティグループにデフォルトが設定されているので、FTP通信ができるように以下のルールが設定されているセキュリティグループに変更します。

ここまででFTPサーバ側の設定が完了です。

ここからクライアントからの接続確認をします。
今回はEC2からFTP通信をするので、作成したエンドポイントと同じVPCにEC2(Amazon Linux2)を用意します。
ログインして以下のコマンドを実行してFTP接続をしてみます。

# ホームディレクトリにアップロードテスト用のファイルを置いておきます。
$ ls
ftp03.txt

# FTPをインストールします。
$ sudo yum -y install ftp

# FTPサーバに接続します。
$ ftp vpce-023750f0cc2f66a42-2lnud5rh.vpce-svc-0cee93c75e789f90b.ap-northeast-1.vpce.amazonaws.com
Connected to vpce-023750f0cc2f66a42-2lnud5rh.vpce-svc-0cee93c75e789f90b.ap-northeast-1.vpce.amazonaws.com (172.31.32.70).
220 Service ready for new user.
Name (vpce-023750f0cc2f66a42-2lnud5rh.vpce-svc-0cee93c75e789f90b.ap-northeast-1.vpce.amazonaws.com:ec2-user): myuser
331 User name okay, need password for myuser.
Password:
230 User logged in, proceed.
Remote system type is UNIX.
ftp> ls
227 Entering Passive Mode (172,31,32,70,32,8)
150 File status okay; about to open data connection.
226 Closing data connection.

# 最初に作成したIAMロールのポリシーで20200429-oguratestバケットのみにアクセス許可をしていたので、なにも表示されないです。
# 20200429-oguratestに移動してファイルが表示されるかを確認します。

ftp> cd 20200429-oguratest
250 Directory changed to /20200429-oguratest
ftp> ls
227 Entering Passive Mode (172,31,32,70,32,1)
150 File status okay; about to open data connection.
-rw-------   1 - -            9 Apr 29 03:57 ftp01.txt
-rw-------   1 - -            9 Apr 29 03:57 ftp02.txt
226 Closing data connection.

# ファイルのアップロードの確認をします。

ftp> put ftp03.txt
local: ftp03.txt remote: ftp03.txt
227 Entering Passive Mode (172,31,32,70,32,6)
503 ASCII (Text) data type is not supported for file transfer operations. Please configure your FTP client to use IMAGE (Binary) type and try again.

# バイナリモードしかサポートしていないので、変更してから再度アップロードします。

ftp> bi
200 Command TYPE okay.
ftp> put ftp03.txt
local: ftp03.txt remote: ftp03.txt
227 Entering Passive Mode (172,31,32,70,32,1)
150 File status okay; about to open data connection.
226 Transfer complete.
9 bytes sent in 3.8e-05 secs (236.84 Kbytes/sec)
ftp> ls
227 Entering Passive Mode (172,31,32,70,32,3)
150 File status okay; about to open data connection.
-rw-------   1 - -            9 Apr 29 03:57 ftp01.txt
-rw-------   1 - -            9 Apr 29 03:57 ftp02.txt
-rw-------   1 - -            9 Apr 29 04:05 ftp03.txt
226 Closing data connection.

# ファイルのダウンロードの確認をします。

ftp> get ftp01.txt
local: ftp01.txt remote: ftp01.txt
227 Entering Passive Mode (172,31,32,70,32,1)
150 File status okay; about to open data connection.
226 Transfer complete.
9 bytes received in 0.417 secs (0.02 Kbytes/sec)
ftp> quit
221 Goodbye.

# ファイルがダウンロードできていることが確認できました。

$ ls
ftp01.txt  ftp03.txt

FTPで接続できることが確認できました。

FTPSの設定と接続

事前準備

設定

CloudFormationのテンプレートを実行したあとにマネジメントコンソールのAWS Transfer Familyを開いたら、プロトコルがSFTPのサーバが起動しています。この設定をFTPに変更します。まずは [Server ID] をクリックして詳細設定を開きます。

SFTPからFTPに変更するためにはサーバの停止が必要ですので、右上の[Actions] - [stop]をクリックします。Endpoint detailsのステータスがOfflineになったら[Edit]をクリックします。

今回はAccessにInternet Facingを指定するのですが、事前にElasticIPを取得する必要があります。
以下の内容を変更して、[Save]をクリック

  • Endpoint type : VPC hostedに変更 (FTPSはPublicly accessibleに対応していません)
  • Access : Internet Facingに変更(FTPSはInternalも指定可能)
  • VPC : エンドポイントを作成するVPC IDを選択します
  • Subnet ID : エンドポイントを作成するサブネットを選択します
  • IPv4 Address : 事前に取得したElastic IPを選択します

次にProtocolsの [Edit] をクリックします。
SFTPのチェックを外し、FTPSにチェックを入れて、事前に設定したACMの証明書を選択して、[Save] をクリックします。

右上の [Actions] - [Start]をクリックしてサーバを起動します。Endpoint detailsのステータスがOnlineになったら使用可能です。接続先のエンドポイントはEndpoint detailsのEndopointで確認できます。

念のため認証のテストをします。右上の [Actions] - [Test] をクリックします。
以下の画面に以下の情報を入力して、[Test] をクリックします。

  • Username : myuser
  • Password : MySuperSecretPassword
    ※ユーザとパスワードはCloudFormationテンプレートのパラメータで指定した値です

テスト結果で、"StatusCode" : 200, が表示されていれば認証は問題ありません。

ここまででFTPSサーバ側の設定が完了です。

接続確認

ここからクライアントからの接続確認をします。
今回はインターネットから接続可能にしていますので、私のPCのWinSCPを使って接続します。

以下を入力して、[ログイン] をクリックします。

  • 転送プロトコル : FTPを選択
  • 暗号化 : 明示的なTLS/SSL暗号化を選択
  • ホスト名 : 接続先のエンドポイントを入力
  • ポート番号 : 21
  • ユーザ名 : myuser
  • パスワード : MySuperSecretPassword

証明書の警告が出ますが、そのまま[はい]をクリックするとログインできます。

最初に作成したIAMロールのポリシーで20200429-oguratestバケットのみにアクセス許可をしていたので、なにも表示されないです。 20200429-oguratestに移動してファイルが表示されるかを確認します。
[ディレクトリ・お気に入りを開く]をクリックし、移動するディレクトリを入力して、[開く]をクリックします。

ファイルが表示されることを確認しました。ファイルのアップロードやダウンロードはドラックアンドドロップでできます。

FTPSで接続できることが確認できました。

まとめ

AWS Transfer for SFTPがFTP/FTPSをサポートしました。FTP/FTPSを利用していて、様々な理由によりSFTPへ移行ができないアプリケーションで利用することができます。試しに利用してみてはいかがでしょうか。

また、本ブログの内容は2020/4/30(木) 12:00よりYouTube Liveで配信される「30分でわかる AWS UPDATE!」でも取り上げる予定ですので、ぜひご覧ください!
もしリアルタイムで見逃しても、アーカイブ動画から内容を確認できます。
https://youtu.be/I0wqhDRyhjI

小倉 大(記事一覧)

アプリケーションサービス部ラーニングエクスペリエンス課 札幌在住

AWSトレーニングの講師をしています。

最近は5歳の息子と遊ぶのが楽しいです!

Twitter: @MasaruOgura