AWS Transfer Family のプロトコルをFTPS 、ユーザー管理をカスタム ID プロバイダーで構築してみた
はじめに
AWS Transfer Familyで、プロトコルがFTPS、ユーザー管理をカスタムIDプロバイダーの場合、構築方法を記事としてまとめました。
各設定は下記の通りです。
- ユーザー管理
- カスタムIDプロバイダー(Lambdaのみ)
- プロトコル
- FTPS
- エンドポイントタイプ
- VPC(インターネット向け)
ただし、プロトコルは、可能な限りSFTPを利用しましょう。
Transfer Familyの基本的な設定などは、下記をご参照下さい。
事前準備
以下を事前に用意しておきます。
- VPCとパブリックサブネット
- Elastic IPを2つ
- S3バケットを作成
- Route53のパブリックホストゾーンで
xxxx.site
を登録- 別のDNS管理サーバーを使用してもよいです。
- FTPSの証明書として利用するACMを作成
*.xxxx.site
とxxxx.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バケットにファイル転送できます。