ちょっと話題の記事

[アップデート] AWS Transfer for SFTP が FTP および FTPS に対応!そして AWS Transfer Family へ

突然のFTP対応
2020.04.24

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

本日のアップデートで AWS Transfer for SFTP に、FTP および FTPS プロトコル対応が追加されました。

サービス名称としては AWS Transfer Family となっているようです。

何がうれしいのか

これまで SFTP のみに対応していましたが、FTPS および FTP の対応によって SFTP に対応していない端末からも AWS Transfer Family が利用可能となります。

ただし、AWS Transfer for SFTP と違って、FTPS および FTP はパブリックエンドポイントに対応しておらず VPC エンドポイントでのみ利用可能です。また、FTP においては VPC エンドポイントの中でも EIP を使った Internet Facing には対応しておらず Internal のみでの利用になります。表にすると以下のとおりです。

タイプ Public VPC(Internet Facing) VPC(Internal)
SFTP OK OK OK
FTPS NG OK OK
FTP NG NG OK

VPC 内に限らず、DirectConnect や Site-to-Site で接続された先のレガシーなシステムから FTPS, FTP で S3 にファイル転送が可能となりました。

対応リージョン

AWS Transfer for FTPS および FTP は、AWS Transfer for SFTP が現在利用可能なすべてのリージョンで利用できます。

料金

エンドポイント料金および、データ転送料金は下記のとおりです。

項目 価格
エンドポイント料金 $0.30
アップロード $0.04/GB
ダウンロード $0.04/GB

執筆時点で各プロトコルに料金差はありませんが、ココが大事なので見落とさないでください。

各プロトコルごとにエンドポイント料金が発生します

ですので、なんとなく 「SFTP も FTP も使えたほうがいいよねぇー」 なんて気持ちで複数プロトコルを有効にしないでください!

クライアントの制限

プロトコルによるクライアント側の制限がありますので、注意ください。

  • AWS FTPS では、暗号化通信は Explicit モードのみがサポート。Implicit モードはサポートされない
  • AWS FTP および AWS FTPS では、接続方式はパッシブモードのみサポート
  • AWS FTP および AWS FTPS では、転送モードは STREAM モードのみサポート
  • AWS FTP および AWS FTPS では、データ型はイメージ/バイナリモードのみサポート
  • AWS FTP および AWS FTPS では、TLS 通信の PROT サブコマンドのデフォルト値は "C"(保護されない生データ)

やってみる

FTPS, FTP の ID プロバイダに従来の Service managed が利用できないため、API Gateway でカスタム ID プロバイダを準備しておく必要があります。今回は公式ガイドで紹介されているサンプルテンプレートを利用して、以下のように CloudFormation で準備しました。

UserRoleArn で指定する IAM ロールは AWS Transfer Family が引き受けるロールになります。つまり、この IAM ロールでアクセスできる S3 バケットの権限を指定しておく必要があります。事前に以下のような IAM ポリシーをアタッチした IAM ロールを作成し、その IAM ロール ARN に書き換えてください。また UserName および UserPassword は FTP アクセスする際の ID とパスワードになります。

※デフォルトで入力されている arn:aws:iam::000000000000:role/MyUserS3AccessRole で作成してもアクセスできません。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
            "s3:ListBucket",
            "s3:GetBucketLocation"
       ],
      "Resource": ["arn:aws:s3:::<bucketname>"]
    },
    {
      "Effect": "Allow",
      "Action": [
        "s3:PutObject",
        "s3:GetObject",
        "s3:DeleteObject",              
        "s3:DeleteObjectVersion",
        "s3:GetObjectVersion",
        "s3:GetObjectACL",
        "s3:PutObjectACL"
      ],
      "Resource": ["arn:aws:s3:::<bucketname>/*"]
    }
  ]
}

テンプレートを実行すると SFTP に対応した AWS Transfer サーバーが起動します。作成された Server ID をクリックします。

作成された AWS Transfer サーバーはパブリックエンドポイントになっていますが、今回は FTP で試してみたいと思いますので、パブリックエンドポイントを VPC エンドポイントに変更します。エンドポイントタイプの変更にはサーバー停止が必要ですので Actions から stop を実行します。

Endpoint detailsStatusOffline に変わりましたら、Edit を開きます。

Endpoint typeVPC hosted に変更し、Internal を選択します。対象の VPC を選択しサブネットを指定し、Save します。

Endpoint type が変更できましたので、次にプロトコルを変更します。ProtocolsEdit を開きます。

すると、これまでにはなかった FTPSFTP が追加されていることが確認できます。1 つの AWS Transfer サーバーに対して複数のプロトコルを選択することが可能です。

今回は FTP のみに変更して進みます。

ちなみに FTPS を選択した場合は、サーバーを識別するための証明書に ACM を利用することが可能なようです。

プロトコルの変更によってエンドポイント料金が変わる(プロトコルごとにエンドポイント料金が発生します)とのメッセージが表示されますので Save で進みます。

プロトコルを FTP に変更できました。

最後に Actions から Start を選択し、サーバーを起動します。

VPC エンドポイントのセキュリティグループ変更

VPC エンドポイントに変更したタイミングで、com.amazonaws.ap-northeast-1.transfer.server の VPC エンドポイントが作成されていますが、デフォルトセキュリティグループがアタッチされていますので、必要に応じてセキュリティグループを変更してください。

FTP の場合、アクセス元から Custom TCP Rule TCP 21 および Custom TCP Rule TCP 8192 - 8200 が許可されている必要があります。

接続確認

Actionstest を実行します。今回のテンプレートでデプロイした場合、Username は myuser パスワードは MySuperSecretPassword になっています。

以下のように StatusCode : 200 が返ればテストは成功です。

{
    "Response": "{\"Role\": \"arn:aws:iam::XXXXXXXXXXXX:role/MyUserS3AccessRol\",\"HomeDirectory\": \"/\"}",
    "StatusCode": 200,
    "Message": "",
    "Url": "https://o25153b773.execute-api.ap-northeast-1.amazonaws.com/prod/servers/s-c177371b53b94b9b8/users/myuser/config"
}

対象のバケットには以下のようなファイルをアップロードしておきました。FTP 接続してファイルが参照できることを確認します。

VPC 内の EC2 より、lftp コマンドでアクセスしてみます。アクセスする先は VPC エンドポイント の DNS 名になります。

$ sudo yum install lftp
$ lftp -d ftp://vpce-0b24a96b27b03b8a0-mdsofy5p.vpce-svc-0cee93c75e789f90b.ap-northeast-1.vpce.amazonaws.com -u 'myuser, MySuperSecretPassword'

この状態で ls でファイルのリストを確認してみます。

lftp myuser@vpce-0b24a96b27b03b8a0-mdsofy5p.vpce-svc-0cee93c75e789f90b.ap-northeast-1.vpce.amazonaws.com:/> ls
(中略)
---> LIST
<--- 150 File status okay; about to open data connection.
---- Got EOF on data connection
---- データソケットを閉じています
<--- 226 Closing data connection.

AWS Transfer for FTP サーバーにはアクセスできているようですが、S3 のファイルが見えませんね、、。

これは、先ほどのログインではあくまで AWS Transfer for FTP サーバーにログインしただけで、どこの S3 バケットを使用するのかマッピングされていないためです。S3 バケットの指定は単純にディレクトリを移動することで可能です。今回は cm-marumo-ftp というバケットを使っていますので cd /cm-marumo-ftp に移動して ls を実行してみましょう。

lftp myuser@vpce-0b24a96b27b03b8a0-mdsofy5p.vpce-svc-0cee93c75e789f90b.ap-northeast-1.vpce.amazonaws.com:/> cd cm-marumo-ftp
lftp myuser@vpce-0b24a96b27b03b8a0-mdsofy5p.vpce-svc-0cee93c75e789f90b.ap-northeast-1.vpce.amazonaws.com:/cm-marumo-ftp> ls
---> PROT P
<--- 431 Security is disabled.
---> PASV
<--- 227 Entering Passive Mode (192,168,0,7,32,8)
---- データソケットを (192.168.0.7) のポート 8200 に接続中
---- Data connection established
---> LIST
<--- 150 File status okay; about to open data connection.
---- Got EOF on data connection
---- データソケットを閉じています
-rw-------   1 - -            5 Apr 23 22:24 test.txt
-rw-------   1 - -            5 Apr 23 22:24 test2.txt
<--- 226 Closing data connection.

もちろん put も可能です。

lftp myuser@vpce-0b24a96b27b03b8a0-mdsofy5p.vpce-svc-0cee93c75e789f90b.ap-northeast-1.vpce.amazonaws.com:/cm-marumo-ftp> put test3.txt
---> TYPE I
<--- 200 Command TYPE okay.
---> PASV
<--- 227 Entering Passive Mode (192,168,0,7,32,1)
---- データソケットを (192.168.0.7) のポート 8193 に接続中
---- Data connection established
---> ALLO 5
<--- 502 Command ALLO not implemented.
---> STOR test3.txt
<--- 150 File status okay; about to open data connection.
---- データソケットを閉じています
<--- 226 Transfer complete.
---> SITE UTIME 20200423224250 test3.txt
<--- 502 Command SITE not implemented.
---> SITE UTIME test3.txt 20200423224250 20200423224250 20200423224250 UTC
<--- 502 Command SITE not implemented.
5 バイト転送済、1 秒経過 (4B/s)

lftp myuser@vpce-0b24a96b27b03b8a0-mdsofy5p.vpce-svc-0cee93c75e789f90b.ap-northeast-1.vpce.amazonaws.com:/cm-marumo-ftp> ls
---> PROT P
<--- 431 Security is disabled.
---> TYPE A
<--- 200 Command TYPE okay.
---> PASV
<--- 227 Entering Passive Mode (192,168,0,7,32,5)
---- データソケットを (192.168.0.7) のポート 8197 に接続中
---- Data connection established
---> LIST
<--- 150 File status okay; about to open data connection.
---- Got EOF on data connection
---- データソケットを閉じています
-rw-------   1 - -            5 Apr 23 22:24 test.txt
-rw-------   1 - -            5 Apr 23 22:24 test2.txt
-rw-------   1 - -            5 Apr 23 23:12 test3.txt
<--- 226 Closing data connection.

という感じで、FTP で S3 にアクセスすることが確認できましたね!検証は以上です。

さいごに

AWS Transfer for SFTP が AWS Transfer Family として生まれ変わり、FTP および FTPS に対応したことで、SFTP に対応していないレガシーな端末でも FTP で S3 にアクセスすることが可能になりましたね!

あくまで SFTP に対応していないレガシー端末の救済かと思います。セキュリティ上、プレーンテキストの利用は極力避けるべきであることに変わりありませんので、安易に FTP を利用するのではなく、まずは SFTP への置き換えが出来ないかを検討するべきでしょう。

また、SFTP と違って FTP および FTPS ではユーザー認証をカスタム ID プロバイダーで行う必要があるため運用コストとしては AWS Transfer for SFTP ほどのお手軽さに欠ける部分もあります。そういった意味でも基本的には SFTP の利用を第一に検討するべきでしょう。

以上!大阪オフィスの丸毛(@marumo1981)でした!

参考