AWS Transfer Family のプロトコルをFTPS 、ユーザー管理をカスタム ID プロバイダーで構築してみた

2023.08.18

はじめに

AWS Transfer Familyで、プロトコルがFTPS、ユーザー管理をカスタムIDプロバイダーの場合、構築方法を記事としてまとめました。

各設定は下記の通りです。

  • ユーザー管理
    • カスタムIDプロバイダー(Lambdaのみ)
  • プロトコル
    • FTPS
  • エンドポイントタイプ
    • VPC(インターネット向け)

ただし、プロトコルは、可能な限りSFTPを利用しましょう。

Transfer Familyの基本的な設定などは、下記をご参照下さい。

事前準備

以下を事前に用意しておきます。

  • VPCとパブリックサブネット
  • Elastic IPを2つ
  • S3バケットを作成
  • Route53のパブリックホストゾーンでxxxx.siteを登録
    • 別のDNS管理サーバーを使用してもよいです。
  • FTPSの証明書として利用するACMを作成
    • *.xxxx.sitexxxx.siteで登録

事前に作成しておく構成は、以下の通りです。

完成構成図

作成するリソースは、以下の通りです。

  • Transfer FamilyのVPCエンドポイントにアタッチするセキュリティグループ
  • Transfer FamilyがS3バケットにアクセスするためのIAMロール
  • Transfer Familyのユーザー認証用のLambda
  • Transfer Family

セキュリティグループを作成

Transfer Familyを作成する時、VPCエンドポイントにアタッチするセキュリティグループが必要なため、事前に作成します。

Transfer FamilyのFTPSサーバーは、ポート21(コントロールチャネル)とポート範囲8192〜8200(データチャネル)を利用するため、開けておきます。

0.0.0.0/0の全開放ではなく、可能であれば、特定のIPのみに限定しましょう。

IAMロール作成

Transfer FamilyがS3バケットにアクセスするためのIAMロールを作成します。

AmazonS3FullAccessポリシーをアタッチしたTransferを信頼するロールを作成します。

名前をTransfer-Family-Roleとしました。

Lambdaを作成

Transfer Familyのユーザー管理は、今回カスタムIDプロバイダー を利用するため、認証用のLambdaを作成します。

本来であれば、SecretManagerを利用する方がよいですが、今回は検証のため、Lambdaのコード内にユーザー情報を入れます。

実行ロールを基本的な Lambda アクセス権限で新しいロールを作成にし、ランタイムはPython 3.11で作成します。

コードは下記の通りの最小コードにしています。あくまでもサンプルコードとご認識ください。IAMロールのARNは、各々変えてください。

def lambda_handler(event, context):
    if event["username"] == "class" and event["password"] == "method":
        return { 'Role': 'arn:aws:iam::アカウントID:role/Transfer-Family-Role' }
    return {}

処理としては、ユーザー情報を判定し、作成するTransfer Familyにロール情報を渡しています。

後ほど、Transfer FamilyがLambdaを呼ぶための権限をLambdaに設定しますが、Transfer FamilyのARNが必要なため、Transfer Family作成後に行います。

Transfer Familyの構築

Transfer Familyのサーバーを構築します。

プロトコルはFTPSを選択します。

[カスタムIDプロバイダー]では、先程作成したLambdaを選択します。

エンドポイントは、VPCのインターネット向けを選択します。

カスタムホスト名は、sftp.xxxx.siteとしました。

sftpというのは、SFTPでも利用したため、この名前になっております。本来は、ftpsの方がよかったですね。

先程作成したセキュリティグループを選択します。

ドメインはS3を選択します。

詳細設定はデフォルトのままで作成します。

Route53に自動設定

Transfer Familyが作成されますと、Route53では自動的に新しいホストゾーンとCNAMEレコードが追加されます。

このCNAMEレコードの値は、Transfer Familyのエンドポイント名で、CNAMEは、Transfer Familyのカスタムホスト名です。

Lambdaのアクセス権限設定

Transfer FamilyがLambdaを呼ぶための権限をLambdaに設定します。

Lambdaのリソースベースポリシーステートメントからアクセス権限を追加をクリックします。

下記の用に入力します

  • ステートメントID(一意であればよい)
    • transferfamily-GetUserConfigLambdaPermission
  • プリンシパル
    • transfer.amazonaws.com
  • ソースのARN(作成したTransfer FamilyのARN)
    • arn:aws:transfer:ap-northeast-1:アカウントID:server/s-c4b3a3d676f24fb6b
  • アクション
    • lambda:InvokeFunction

テスト

Lambdaのコード内のユーザー情報を入力します。送信元IPは、セキュリティグループのインバウンドルールを特定のIPにしている場合は、その値にしましょう。

下記は成功したときの応答です。

下記は失敗したときの応答です。

接続してみる

PC(MacBook)のクライアントソフトウェアとして、FileZiilaを利用します。

暗号化は、明示的なFTP over TLSが必要、ポートは21に接続します。

下記の応答があれば、成功です。S3バケットにファイル転送できます。

参考