AWS Transfer Family で SFTP を使ってみよう

AWS Transfer Family は、ファイルを送受信できる安全な転送サービスです。Amazon S3 や、Amazon EFS といったストレージサービスに SFTP、FTP、FTPS のプロトコルで送受信を行うことができます。
従来の AWS CLI やコンソールを用いたアクセスではプロトコルは HTTPS になり、エンドユーザーによる IAM ユーザーの管理等が必要になりますが、SFTP、FTP、FTPS で S3 や EFS へファイル送受信を行いたいユーザーの方も多いのではないでしょうか。
そこで今回は、S3 に SFTP を使ってファイルを送受信する方法についてご紹介していきます。
目次
AWS Transfer Family のエンドポイントタイプについて
AWS Transfer Family には現在4つのエンドポイントタイプがあります。
- パブリックエンドポイント
- 内部アクセスを持つ Amazon Virtual Private Cloud (Amazon VPC) エンドポイント
- インターネット向けアクセスを持つ VPC エンドポイント
- VPC_ENDPOINT
ユースケースにあわせて上記を利用し、最適な構成を検討していきましょう。
また、アクセス方法は次のように分類できます。
インターネット経由でアクセスしたい場合
- パブリックエンドポイント
メリット : まずは、気軽にインターネット経由で AWS Transfer Family を使いたい。
デメリット: 接続元IPアドレス制限をかけることができません。
- インターネット向けアクセスを持つ VPC エンドポイント
メリット : 接続元IPアドレス制限をかけることが可能。Elastic IP アドレスを利用可能。
デメリット: VPC を利用するため構築時に、VPC の基礎知識が必要になります。
VPC 内部、VPN や AWS Direct Connect (DX) 経由でアクセスしたい場合
- 内部アクセスを持つ Amazon Virtual Private Cloud (Amazon VPC) エンドポイント
メリット : 内部アクセスで利用可能。NLB とネットワーク ACL を併用することでインターネット経由アクセスも併用可能。
デメリット: NLB を用いない場合は、インターネット経由アクセス不可。NLB とネットワーク ACL を併用する場合は、NLB の料金とネットワーク ACL の運用が必要。
- VPC_ENDPOINT
メリット : 新規に作成する場合は利用不可のため、特にありません。
デメリット: 2021年5月19日以降、VPC_ENDPOINT の AWS Transfer Family サーバーを所有していない AWS アカウントは新規作成不可。非推奨のため別の選択肢を推奨。
[参考] VPC_ENDPOINT のサポート終了 - AWS Transfer Family ユーザーガイド
その他、各エンドポイントタイプの詳細は、以下のドキュメントをご参照ください。
AWS Transfer Family サーバーのエンドポイントタイプを選択する
AWS Transfer Family でインターネット向けアクセスを持つ VPC エンドポイントを構築しよう
それでは、インターネット経由アクセスと接続元制限が可能な「インターネット向けアクセスを持つ VPC エンドポイント」を実際に構築してみたいと思います。
1| プロトコルを選択
ここでは SFTP を選択します。
2| ID プロバイダーを選択
ここでは AWS Transfer Family でユーザーを作成管理するサービスマネージドを選択します。AD 連携を行いたい場合は AWS Directory Service、任意の ID プロバイダーとの統合したい場合はカスタム ID プロバイダーを選択ください。
3| エンドポイントを選択
VPC でホストを選択します。今回は AZ 冗長化のためにバプリックサブネット2つ、EIP が2つ利用できる VPC 上にホストするように構築します。
セキュリティグループでは、許可したいIPアドレスから22ポートを許可しています。

4| 追加の詳細を設定
アップロード後のファイル処理のワークフロー等の設定が可能です。
今回はデフォルトで進めます。

5| サーバーを作成
最後に、確認画面で内容をチェックし、任意のパラメータであることが確認できましたら作成します。
「サーバーを作成」を押下すると
Creating the server may take a couple of minutes. Please do not close or refresh the window while create is in progress.
とメッセージが出ますので、しばらくそのまま待機しましょう。

AWS Transfer Family でサービス管理ユーザーを追加しよう
サーバー作成が完了したら、SFTP 接続に使用するユーザーを作成しましょう。
まずはユーザー作成画面に進む前に IAM ロールを準備します。
IAM ロールの準備
IAM の画面から「ロールを作成」を実行します。
ユースケースの選択では、「Transfer」を選びます。
アタッチするポリシーは、「Amazon S3 FullAccess」を選択しました。
Transfer Family でユーザーを追加
ロールの作成が完了したら、実際に SFTP サーバーにユーザーを追加しましょう。

ロールには、先ほど作成したロールを選択します。
ポリシーは今回は「なし」を選択します。
ロールとポリシーはどちらも同じような制限が可能ですが、使い分けは以下のようにイメージしています。
ロール : アクセス可能な S3 バケットの制限等を行うことが可能。
ポリシー: ユーザーに対して、S3 バケットの特定の階層へのアクセス制限等を行うことが可能。
ロールとポリシーについての詳細は AWS 公式のユーザーガイドをご参照ください。
アクセスコントロールの管理 - AWS Transfer Family ユーザーガイド
ホームディレクトリを指定しない場合は、ユーザーの名前のディレクトリが作成/指定されます。
SSH パブリックキーでは、ユーザーが使用する秘密鍵のペアになる公開鍵をペーストします。筆者は Mac を使っているので、Terminal で秘密鍵と公開鍵のペアを作成してみます。
ssh-keygen -t rsa
Generating public/private rsa key pair.
キーの名前を入力
Enter file in which to save the key (/Users/matsuo/.ssh/id_rsa): test.key
パスフレーズを入力。パスフレーズを無くしたい場合はそのままエンター
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in test.key
Your public key has been saved in test.key.pub
秘密鍵の権限を設定する
chmod 600 test.key
秘密鍵である「test.key」と公開鍵の「test.key.pub」が作成されました。SSH パブリックキーの入力欄に、「test.key.pub」の中身をコピー&ペーストします。

以上でユーザーの作成が完了です。
SFTP 接続してファイルを転送しよう
作成したサーバーとユーザーを使って SFTP 接続を試してみましょう。
今回は Mac の Terminal から SFTP コマンドを使用します。Cyberduck や OpenSSH 等のGUIクライアントも利用可能です。
詳細は以下の AWS 公式ユーザーガイドをご参照ください。
チュートリアル: AWS Transfer Family で開始 - AWS Transfer Family ユーザーガイド
SFTP 接続で使用するコマンド例は以下です。
sftp -i 秘密鍵 ユーザー名@サーバー名
実際にファイルをアップロードしてみます。
sftp -i test.key test@サーバー名
Connected to サーバー名
sftp> put test.txt
Uploading test.txt to /S3バケット名/test/test.txt
test.txt 100% 0 0.0KB/s 00:00
sftp>
無事にユーザーのホームディレクトリにアップロードされていることが確認できました。

AWS Transfer Family で SFTP を使ってみよう(まとめ)
いかがでしたでしょうか?
AWS Transfer Family はエンドポイントタイプと利用可能なプロトコルが複数あるため、最適な構成の選択が重要になります。ご興味がある方は、一度ご利用を検討してみてはいかがでしょうか?
ブログを読んでみたけれど、「自社で対応できるかな・・・」と不安をお持ちの方もご安心ください。弊社が提供する「cloud link」というサービスでは、QAサポートや AWS コンソール内の操作代行をAWS認定資格を取得した弊社エンジニアにお任せいただくことが可能です。
AWS運用について少しでも気になられる方は、ぜひお気軽に弊社までご相談ください。
元記事発行日: 2022年06月23日、最終更新日: 2023年03月28日