はじめに
今回はAWS Transfer FamilyのSFTPサーバーを使ってS3にファイルを転送するハンズオン記事を書きました。実務では使っていないのですが、以前SAA試験の対策でサービスの理解を深めるために作成した内容です。
今回やること
AWS Transfer Familyを使ってフルマネージドのSFTPサーバーを構築し、ローカルからAmazon S3にファイルをアップロードする仕組みを作ります。
また、AWS Transfer Familyには、3つのエンドポイントタイプがありますが、今回はVPCの設定が不用でインターネット経由でSFTPプロトコルを使ってファイル転送可能な「パブリックエンドポイント」を利用します。
作成するリソースは以下の通りです。
| 作成するもの | 名前 | 目的 |
|---|---|---|
| S3バケット | saa-sftp-server-bucket |
SFTP転送ファイルの保存先として |
| IAMポリシー | SftpS3UserAccessPolicy |
S3バケット内の特定のパスへの操作権限を定義 |
| IAMロール | SftpS3UserAccessRole |
Transfer FamilyがS3にアクセスするために引き受ける権限。Transfer Familyユーザーにアタッチする。 |
| Transfer Familyサーバー | (自動) | SFTP経由でファイルを受け入れ、S3と連携する仮想サーバー |
| Transfer Familyユーザー | sftp-test-user01 |
SFTP接続を行うクライアントユーザー |
| SSHキーペア(ローカル) | sftp_user_key |
SFTPユーザー認証用の公開鍵と秘密鍵。ローカルで生成し、Transfer Familyに公開鍵を登録する。 |
AWS Transfer Family とは
ハンズオンの前にAWS Transfer Familyの概要を簡単にまとめます。
AWS Transfer Familyとは、ファイル転送プロトコル(SFTP、FTPS、FTP、AS2)経由でAWSストレージサービス(Amazon S3、Amazon EFS)との間でファイルを転送できる、フルマネージド型のサービスです。
AWS Transfer Familyでは、選択したプロトコルに応じたサーバーとエンドポイントが自動的に作成・管理されるため、自分でEC2を構築してSFTPサーバーを運用するといった必要がなく、安全なファイル転送環境を簡単に利用することが可能になります。
📦 1. S3バケットの作成
ここから、AWSコンソールを開いて手を動かしていきます。
まずはファイル転送先の箱を作ります。
S3 > バケット を開き、バケットを作成してください。設定は全てデフォルトの選択肢でOKです。(バケット名はsaa-sftp-server-bucketとする)
🔐 2. IAMロール作成
AWS Transfer Familyは自分自身ではS3を操作する権限を持たないため、まず最初にS3へのアクセス権限を定義するIAMポリシーと、それをTransfer Familyが利用できるようにするIAMロールを作成する必要があります。
2-1. ポリシー作成
IAM > ポリシー > ポリシーの作成 を開き、次のJSONでポリシーを作成します。(ポリシー名: SftpS3UserAccessPolicy)
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "s3:ListBucket",
"Resource": "arn:aws:s3:::saa-sftp-server-bucket",
"Condition": {
"StringLike": {
"s3:prefix": "sftp-test-user01/*"
}
}
},
{
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:PutObject",
"s3:DeleteObject"
],
"Resource": "arn:aws:s3:::saa-sftp-server-bucket/sftp-test-user01/*"
}
]
}
-
s3:ListBucket: S3バケット全体の情報を取得する操作。ResourceはバケットARN全体 (:::saa-sftp-server-bucket) に指定し、Conditionでユーザー名プレフィックス配下しか見えないように制限します。 -
s3:GetObject/PutObjectなど: 個々のファイル操作です。Resourceはユーザー専用のパス(:::saa-sftp-server-bucket/sftp-test-user01/*) に指定することで、他のユーザーのファイルへのアクセスを防いでいます。
2-2. ロール作成
IAM > ロール > ロールの作成 を開きます。
- Step1:
- 信頼されたエンティティタイプ: 「AWSのサービス」を選択
- ユースケース: 「Transfer」を選択
- Step2:
- 先ほど作成したポリシー
SftpS3UserAccessPolicyを選択しアタッチ
- 先ほど作成したポリシー
- Step3:
-
SftpS3UserAccessRoleと入力し、ロールを作成
-
🖥️ 3. SFTPサーバーの作成
AWS Transfer Familyサービスに移動し、「サーバーの作成」をクリックします。
- Step1:
- プロトコル:「SFTP」を選択
- Step2:
- IDプロパイダーのタイプ:「サービスマネージド」を選択
- Step3:
- エンドポイントのタイプ:「パブリック」を選択
- Step4:
- ドメイン:「Amazon S3」 を選択
- Step5:
- 追加の詳細を設定: 全てデフォルトのまま進む
- Step6:
- 以上の設定項目を確認して「サーバーを作成」をクリック
👤 4. ユーザーの追加
サーバー作成後に接続用のユーザーを個別に登録する必要があります。ユーザーごとに認証情報やアクセス可能なS3 パスを設定しできます。
4-1. SSHキーペアの準備
SFTP接続には公開鍵認証を使用するため、まずクライアント側でSSH キーペアを作成しておきます。
# RSA キーペアを作成
ssh-keygen -t rsa -b 4096 -f ~/.ssh/sftp_user_key
作成された公開鍵(.pubファイルの内容)をクリップボードにコピーしておきます。
# ターミナルで公開鍵の内容を確認・コピー (Macの場合)
cat ~/.ssh/sftp_user_key.pub | pbcopy
4-2. ユーザーの追加
AWSコンソールに戻り、作成したサーバーの詳細画面を開き「ユーザーを追加」に進みます。
| 項目 | 設定値 | SAAポイント/注意点 |
|---|---|---|
| ユーザー名 | sftp-test-user01 |
IAMポリシーでこのユーザー名を前提に設定しています。 |
| ロール | SftpS3UserAccessRole |
先ほど作成したロールを指定します。 |
| ポリシー | なし | ロールにポリシーが含まれているため不要です。 |
| ホームディレクトリ | /saa-sftp-server-bucket/sftp-test-user01/ |
IAMポリシーで制限したパスと完全に一致させます。これにより、ユーザーは自分のホームディレクトリの外に出られなくなります。 |
| SSH パブリックキー | (先ほどコピーした公開鍵の内容) | 作成したキーペアの公開鍵を貼り付けます。 |
設定を確認し、ユーザーを作成します。
📡 5. SFTP接続 & ファイル転送
まずはSFTP接続情報を確認します。
- Transfer Family > サーバー > {サーバーID} の画面を開く
- エンドポイントの詳細にある「エンドポイント」 を確認
(s-xxxxxxxxx.server.transfer.ap-northeast-1.amazonaws.comのような形)
次に、ローカル環境のターミナルやSFTPクライアントソフト(WinSCP、Cyberduckなど)を使用して接続します。ここではmacのターミナルでsftpコマンドを使います。
# ターミナルでの接続コマンド例
sftp -i ~/.ssh/sftp_user_key sftp-test-user01@<サーバーのエンドポイント>
例として、デスクトップにあるtest.htmファイルを次のコマンドでS3にアップロードします。
sftp> lcd ~/Desktop # ローカルの作業ディレクトリをデスクトップに変更
sftp> put test.html # ローカルの test.html をS3にアップロード
sftp> ls # S3上に test.html が存在することを確認
sftp> exit # SFTPセッションを終了
AWS S3コンソールを開き、saa-sftp-server-bucket/sftp-test-user01/ の中に test.html が格納されていることを確認できたら成功です!
🔥 注意点
最後に、不要なコストを避けるために、使い終わったらサーバーを「削除」してください。
サーバーを停止しただけでは料金は発生し続けるため注意が必要です!
※ ちゃんと削除すれば、今回のハンズオン内容だけで発生する通信コストはほぼ無視できるレベルで小さいです
参照:
参考
「AWS Black Belt Online Seminar AWS Transfer Family FTP/FTPS/SFTP によるデータ転送」

