AWS Transfer Familyが FTPS + VPC(インターネット向け)の構成で、VPC内のEC2インスタンスからファイル転送してみた

2023.08.21

はじめに

エンドポイントタイプがVPC(インターネット向け)のTransfer Familyを、内部VPC向けとしても活用したいと思い、その手順を記事にまとめました。

以前投稿した下記記事では、Transfer FamilyのFTPS + VPC(インターネット向け)の構成を紹介しました。

構成図は、次の通りです。

この構成において、インターネット経由でTransfer Familyを利用しファイル転送は可能ですが、プライベートサブネット上のEC2インスタンスからもVPCエンドポイントを経由してファイル転送したい要件がありました。

以下の構成であれば、エンドポイントタイプがVPC(インターネット向け)のTransfer Familyは、VPC(内部向け)としても問題なく利用できることが分かりました。

事前準備

まず、先程紹介したブログの手順に従い、Transfer Familyなどの設定を行います。

ブログの手順に従って構成すると、Transfer Familyの設定内容は次のようになります。

  • ユーザー管理
    • カスタムIDプロバイダー(Lambdaのみ)
  • プロトコル
    • FTPS
  • 証明書(ACM)
    • xxxx.site
      • ACMのドメインは、xxxx.site*.xxxx.siteの2つを設定しています
  • カスタムホスト名
    • ftps.xxxx.site
  • Route53のパブリックホストゾーンでxxxx.siteを登録済み
    • 別のDNS管理サーバーを使用してもよいです。
  • エンドポイントタイプ
    • VPC(インターネット向け)

Transfer Familyの各設定値は、以下に示すような内容がコンソール上に表示されます。

EC2インスタンスの構築

上記の構築に加え、EC2インスタンスを作成し、以下の環境を設定します。

  • EC2インスタンスにログインできる状態
    • ログイン方法は、EIC エンドポイント、セッションマネージャー、踏み台サーバーなど何でも良いです。
  • OSは、Amazon Linux2023
  • S3にアクセスできる環境
    • sudo dnf -y install lftpコマンドでlftpをインストールするためです。
    • パブリックサブネットにS3のGateway型のVPCエンドポイントやNATGatewayを設置しましょう

構成図

事前に作成する構成図としては、以下の通りです。

  • インターネット経由
    • ホスト名ftps.xxxx.siteを用いて、インターネット経由でS3にファイル転送します。
  • 内部
    • ホスト名ftps-internal.xxxx.siteを用いて、EC2インスタンスがVPCエンドポイント経由で、S3にファイル転送します。

今回設定する内容は、以下の通りです

  1. Route53にレコード追加
  2. TLSセッション再開モードを有効に変更
  3. EC2インスタンスからTransfer Familyに接続し、ファイル転送する

Route53にレコード追加

まずは、EC2インスタンスがVPC内部からホスト名ftps-internal.xxxx.siteで、Transfer FamilyにアクセスできるようにRoute53にレコードを追加します。

Route53のパブリックホストゾーンに、Transfer Family VPCエンドポイントDNS名のレコードを登録します。

レコード名 タイプ
ftps-internal.xxxx.site CNAME Transfer Family VPCエンドポイントDNS名
(vpce-x.vpce-svc-x.region名.vpce.amazonaws.com)

なお、VPCエンドポイントDNS名はなく、Transfer FamilyのVPCエンドポイントのプライベートIPを使用することも可能です。

レコード名 タイプ
ftps-internal.xxxx.site A Transfer Family VPCエンドポイントのプライベートIP

TLSセッション再開モードを強制から有効に変更

Transfer FamilyのプロトコルがFTPS対応の場合、TlsSessionResumptionMode(TLSセッション再開モード)がデフォルトでENFORCED(強制)されます。

TLSセッション再開モードとは、「クライアントとFTPSサーバー間で直近に共有された秘密鍵を複数のセッション間で再利用する機能」です。

つまり、一度接続が確立され、秘密鍵が交換された後、次にそのクライアントが接続を要求したとき、秘密鍵を再利用します。

これにより、新たな接続ごとに鍵の交換を行う必要がなくなり、接続の確立がより速く効率的に行えるようになります。

ただし、すべてのFTPSクライアントがセッションを再利用できるわけではなく、EC2インスタンスでlftpコマンドでファイル転送する際は、利用できないOSも存在します。

そのため、Transfer FamilyのTLSセッション再開モードをENFORCED(強制)からENABLED(有効)に変更します。

ENABLED(有効)は、TLSセッションの再開をサポートするクライアントと、その機能を利用しないクライアントの両方を受け入れます。

コンソールから設定変更

コンソール画面から、作成時もしくは作成後に、TLSセッション再開モードを有効化に変更します。

  • 適用(ENFORCED)
  • 有効化(ENABLED)
  • 無効化(DISABLED)

CloudShellで設定変更

CLIからも以下のコマンドを実行して設定を変更できます。

$ aws transfer update-server --server-id TRANSFER_FAMILY_SERVER_ID --protocol-details TlsSessionResumptionMode=ENABLED

成功すると下記のようなJSON形式の応答が返ってきます。

[cloudshell-user]$ aws transfer update-server --server-id s-77f50e95209a4356a --protocol-details TlsSessionResumptionMode=ENABLED
{
    "ServerId": "s-77f50e95209a4356a"
}

EC2インスタンスからファイル転送してみる

FTPSプロトコルでファイル転送するため、lftpコマンドをインストールします。

lftpは、ftpコマンドからさまざまな便利な機能を追加されたコマンドです。

$ sudo dnf -y install lftp
~省略~
Complete!

下記のコマンドでTransfer Familyサーバーに接続できます。

$ lftp -u ユーザー名 -p ポート番号 -e "set ftp:ssl-force true; set ftp:ssl-protect-data true;" ホスト名
Password:
  • set ftp:ssl-force true
    • サーバーがSSLをサポートしていない場合、パスワードを暗号化せずに送信することを拒否します
  • set ftp:ssl-protect-data true
    • データ転送にSSL接続を要求します

以下のように設定しないで接続することも可能ですが、安全性を確保するためにFTPSプロトコルで転送を強制することを推奨します。

$ lftp -u ユーザー名 -p ポート番号 ホスト名
Password:

それでは、実際に接続してみましょう。

$ lftp -u class -p 21 -e "set ftp:ssl-force true; set ftp:ssl-protect-data true;" ftps-internal.xxxx.site
Password:
lftp class@ftps-internal.xxxx.site:~> ls
drwxr--r--   1 - -            0 Jan  1  1970 <S3のバケット名>

S3バケットに移動し、EC2インスタンス内のファイル(test.txt)をS3バケットに転送してみましょう

lftp class@ftps-internal.xxxx.site:~> cd S3のバケット名
lftp class@ftps-internal.xxxx.site:/S3のバケット名> ls
lftp class@ftps-internal.xxxx.site:/S3のバケット名> put test.txt
lftp class@ftps-internal.xxxx.site:/S3のバケット名> ls
-rwxr--r--   1 - -            0 Aug 20 06:53 test.txt

無事ファイル転送ができました!

lftpのオプション内容は、下記の記事によくまとめられてました。

エラー対応

TLSセッション再開モードが強制されている場合

EC2インスタンスのOSがAmazon Linux2023の場合は、TLSセッション再開モードを強制しても接続が可能でした。

しかし、OSがAmazon Linux2の場合、以下のエラーが出ました。

$ lftp -u class -p 21 -e "set ftp:ssl-force true; set ftp:ssl-protect-data true;" ftps-internal.xxxx.site
Password:
lftp class@ftps-internal.xxxx.site:~> ls
ls: Access failed: 522 Data connection must use cached TLS session

TLSセッション再開モードを有効化(ENABLED)に変更することで解決します。