こんにちは。ES課で研修中の深瀬です。
当記事では、SFTPコネクタを使いSFTPサーバーとAmazon S3間でファイルの送信ができることを確認します。
本記事はサーバーワークスAdvent Calendar 2024の13日目の記事です。 qiita.com
Transfer Family のSFTPコネクタとは
SFTPサーバーとAmazon S3間でファイルを送信することができるAWSのマネージドサービスです。
SFTPのやり取りが可能なサーバーであれば、プログラムは必要なく簡単にAmazon S3へファイルを送信できます。
データセンター内にあるサーバーのファイルをAmazon S3に送信することで、AWSで稼働しているシステムへのファイル連係や、データ分析、AIの学習などさまざまな用途で利用できます。

料金
東京リージョンでは以下の通りです。(2024/12/11現在)
| 料金 | 備考 | |
|---|---|---|
| コネクタコール当たりのコスト | 0.001USD | 次のSFTPコネクタAPIコマンドを使用する回数(※) - StartFileTransfer API - StartDirectoryListingAPI - ListFIleTransferResults API |
| データ転送のGBあたりのコスト | 0.40USD/送受信したGB |
(※) 各APIコマンドについて
- StartFileTransfer API
- リモートSFTPサーバーとの間でファイル転送を行うためのAPIです。
- StartDirectoryListing API
- リモートSFTPサーバーのディレクトリのファイル一覧を表示します。
- 1回の実行で最大1,000項目取得でき、1,000項目超えるごとに0.001USDが発生します。
- ListFileTransferResults API
- ファイル転送オペレーションの現在のステータスを表示します。
動作検証用の環境構築
動作検証を行うため、今回はAWS上にSFTPサーバーを構築します。 SFTPサーバーからAmazon S3、Amazon S3からSFTPサーバーにファイルが送信できることを確認します。
システム構成図

事前準備
以下を構築します。当記事では割愛します。
- VPC、サブネット構築
- EC2構築(Amazon Linux 2023,t3.mediumを使用)
- セキュリティグループ設定(SFTPコネクタのIPアドレスからSSHを許可)
- Amazon S3(設定はすべてデフォルト)
注意点は以下の通りです。
- EC2をパブリックサブネットに配置するため、適切な設定を行わない場合、悪意あるユーザーに不正アクセスを受ける可能性があります。
- 通信の向きは常にSFTPコネクタからSFTPサーバーになります。SFTPコネクタには静的IPアドレスが割り振られるため、SFTPコネクタのIPアドレスのみSSHを許可するセキュリティグループをSFTPサーバーに設定してください。
SFTPサーバーの設定
SFTPユーザーの作成
SFTPサーバーにSFTPユーザーを作成します。 SFTPサーバーの操作はAWS Systems Managerのセッションマネージャーを使用します。
$ sudo useradd sftpuser $ sudo passwd sftpuser
SSHキーの作成
SFTPで使用するSSHキーを作成します。 なお、ssh-keygenでキーペアを作成する際、パスフレーズは設定しないでください。 SFTPコネクタの仕様上、パスフレーズは設定できません。
$ sudo su - sftpuser $ mkdir .ssh $ chmod 700 .ssh $ cd .ssh # 公開鍵/秘密鍵キーペア作成 $ ssh-keygen -t rsa -b 4096 -m PEM -f [キー名] -N "" # 公開鍵をauthorized_keyに保存 $ cat [キー名].pub >> authorized_keys $ chmod 600 authorized_keys # 秘密鍵をメモ。Seacret Managerに保管するための形式で表示。 $ jq -sR . [キー名]
ホストキーの確認
接続先のSFTPサーバーを識別するため、ホストキーを確認します。
$ ssh-keyscan [SFTPサーバーのパブリックドメイン名] # ドメイン名:22 SSH-2.0-OpenSSH_8.7 ドメイン名 ecdsa-sha2-nistp256 XXXXXXXXXXXXXXXXXXXX # ドメイン名:22 SSH-2.0-OpenSSH_8.7 # ドメイン名:22 SSH-2.0-OpenSSH_8.7 ドメイン名 ssh-ed25519 XXXXXXXXXXXXXXXXXXXX # ドメイン名:22 SSH-2.0-OpenSSH_8.7 # ドメイン名:22 SSH-2.0-OpenSSH_8.7
「ドメイン名 ecdsa-sha2-nistp256 XXXXXXXXXXXXXXXXXXXX」が今回使用するホストキーです。
シークレットの作成
AWS Secrets Managerを利用し、SFTPサーバーの情報を格納します。シークレットを作成する際、「Other type of secret」を選択し、「Key/value」ではなく「Plaintext」で以下を入力してください。
{"Username":"sftpuser","Password":"[sftpuserのパスワード]","PrivateKey":"SFTP用秘密鍵(jq -sRで出力した文字列)"}

SFTPコネクタ用IAMロールの作成
SFTPコネクタがAmazon S3とシークレットにアクセスできるよう、IAMロールを作成します。 まずはポリシーを作成します。
ポリシーの作成
ポリシー作成画面で以下のJSONを入力し、ポリシーを作成します。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowListingOfUserFolder",
"Action": [
"s3:ListBucket",
"s3:GetBucketLocation"
],
"Effect": "Allow",
"Resource": [
"arn:aws:s3:::[バケット名]"
]
},
{
"Sid": "HomeDirObjectAccess",
"Effect": "Allow",
"Action": [
"s3:PutObject",
"s3:GetObject",
"s3:DeleteObject",
"s3:DeleteObjectVersion",
"s3:GetObjectVersion",
"s3:GetObjectACL",
"s3:PutObjectACL"
],
"Resource": "arn:aws:s3:::[バケット名]/*"
},
{
"Sid": "GetConnectorSecretValue",
"Effect": "Allow",
"Action": [
"secretsmanager:GetSecretValue"
],
"Resource": "[シークレットのARN]"
}
]
}
ロールの作成
次にロールを作成します。
Use Caseでは「Transfer」を選択します。

ポリシーの選択画面では、先ほど作成したポリシーを選択します。

SFTPコネクタの作成
AWS Transfer Familyコンソールを開き、左側のナビゲーションペインからConnectorsをクリックします。

「Create connector」をクリックします。

「SFTP」を選択し、「Next」をクリックします。

「Create Connector」では、以下の情報を入力し、「Create connector」をクリックします。
- URL:sftp://[SFTPサーバーのパブリックドメイン名]:22
- Role:前段で作成したロール名
- Connector credentials:前段で作成したシークレット名
- Trusted host keys:ssh-keyscanで確認したホストキー

作成されました。

セキュリティグループにSFTPコネクタ用の設定追加
SFTPコネクタのIPアドレスを確認します。

SFTPサーバーのセキュリティグループのインバウンドに、上記IPアドレスからのSSHを許可します。 ※手順は省略します。
動作検証
接続テスト(CloudShell)
接続テスト用コマンドをCloudShellで実行します。
$ aws transfer test-connection --region ap-northeast-1 --connector-id [Connector ID]
{
"Status": "OK",
"StatusMessage": "Connection succeeded"
}
問題ないようです。
SFTPサーバーからAmazon S3へファイル送信
SFTPサーバーにファイルを作成
SFTPサーバーにAmazon S3へのデータ転送用ファイルを作成します。
$ cd /home/sftpuser $ mkdir sftptest $ cd sftptest $ echo "sftp server to s3" > sftpServerToS3.txt
SFTPサーバーのリストを作成(CloudShell)
Amazon S3にSFTPサーバーのリストを作成してみます。
aws transfer start-directory-listing --region ap-northeast-1 --connector-id [Connector ID] --remote-directory-path /home/sftpuser/sftptest --output-directory-path /[バケット名]
{
"ListingId": "bcb30188-615c-44c1-9317-637a485b4a22",
"OutputFileName": "c-b5319e1ecd0b4c9eb-bcb30188-615c-44c1-9317-637a485b4a22.json"
}
Amazon S3にOutputFileが作成されています。

OutputFileの内容は以下の通りです。
"files" : [ { "filePath" : "/home/sftpuser/sftptest/sftpServerToS3.txt", "modifiedTimestamp" : "2024-12-11T08:25:09Z", "size" : 18 } ], "paths" : [ ], "truncated" : false }
SFTPサーバーからAmazon S3へのファイル送信(CloudShell)
SFTPサーバーで作成したファイルをAmazon S3に送信します。
$ aws transfer start-file-transfer --region ap-northeast-1 --connector-id [Connector ID] --retrieve-file-paths /home/sftpuser/sftptest/sftpServerToS3.txt --local-directory-path /[バケット名]
{
"TransferId": "1ec7b444-559d-46a4-a5ea-1920593fd217"
}
転送結果
転送結果に問題がないことを確認します。
$ aws transfer list-file-transfer-results --region ap-northeast-1 --connector-id [Connector ID] --transfer-id 1ec7b444-559d-46a4-a5ea-1920593fd217
{
"FileTransferResults": [
{
"FilePath": "/home/sftpuser/sftptest/sftpServerToS3.txt",
"StatusCode": "COMPLETED"
}
]
}
ファイルの確認
Amazon S3を確認します。

SFTPサーバーのファイルがAmazon S3に送信されていました!
ファイルの内容は以下の通りでした。
sftp server to s3
Amazon S3からSFTPサーバーへのファイル送信
Amazon S3にファイルを格納(Amazon S3)
SFTPサーバーへのデータ送信用に、Amazon S3にファイルを格納します。 ローカル端末でファイルを作成し、管理コンソールからアップロードします。(ファイル名:S3ToSftpServer.txt)

ファイルの内容は以下の通りです。
s3 to sftp server
Amazon S3からSFTPサーバーへのファイル送信(CloudShell)
Amazon S3からSFTPサーバーへファイルを送信します。
$ aws transfer start-file-transfer --region ap-northeast-1 --connector-id [Connector ID] --send-file-paths /[バケット名]/S3ToSftpServer.txt --remote-directory-path /home/sftpuser/sftptest
{
"TransferId": "70ce5bb5-96b9-45e9-9c8a-0dae15161ac8"
}
転送結果
転送結果に問題がないことを確認します。
$ aws transfer list-file-transfer-results --region ap-northeast-1 --connector-id [Connector ID] --transfer-id 70ce5bb5-96b9-45e9-9c8a-0dae15161ac8
{
"FileTransferResults": [
{
"FilePath": "/sftp-connect-test/S3ToSftpServer.txt",
"StatusCode": "COMPLETED"
}
]
}
ファイルの確認
SFTPサーバーにファイルが格納されていることを確認します。
$ ls -l total 8 -rw-rw-r--. 1 sftpuser sftpuser 17 Dec 11 08:36 S3ToSftpServer.txt -rw-r--r--. 1 sftpuser sftpuser 18 Dec 11 08:25 sftpServerToS3.txt $ cat S3ToSftpServer.txt s3 to sftp server
Amazon S3のファイルがSFTPサーバーに送信されていました!
まとめ
SFTPコネクタを使い、SFTPサーバーとAmazon S3間のファイル送信ができました。 検証する中でいくつかハマるポイントがありましたので、SFTPコネクタを利用したい方の参考になれば幸いです。
参考資料
AWS Transfer Family SFTP コネクタ - AWS Transfer Family