[AWS][AWS Transfer Family][SFTP] AWS Transfer FamilyでSFTPサーバーを立てる(サービスマネージド)

## 概要

外部ユーザー向けに、SFTPサーバーを立てる要件があり、AWS Transfer Familyで立てられるようだったので、構築をしてみました。

S3バケットを使用したものになります。

こちらはユーザー認証にユーザーIDとSSHのパブリックキーを使用します。
SFTPでユーザーIDとパスワードの認証を使用する場合は、[こちらの記事](https://zenn.dev/tsonwk/articles/4e61f61149bb91)をご確認ください。

公式の入門チュートリアル：
https://docs.aws.amazon.com/ja_jp/transfer/latest/userguide/getting-started.html

それにしても、料金が高いんですね（後で知りました）
サーバーが停止含めて立ってるだけで月 `$216`
ちょっとした使用程度だと、ちょっと通らない金額だなーと思いました。

https://dev.classmethod.jp/articles/202210-aws-transfer-family-sftp/
https://aws.amazon.com/jp/aws-transfer-family/pricing/

## 前提
- AWSコンソールに接続出来る
- 各サービスの作成、編集が出来る権限を持っている

## 事前準備
### S3バケットの作成
---
S3にバケットを作成します。
今回は `sftp-server-bucket-atf` を作成しました。
バケット名以外はすべてデフォルト設定のままです。
![](https://storage.googleapis.com/zenn-user-upload/c3278ea5ce65-20230708.png)

### ロールの作成
---
SFTPの接続ユーザーに操作を許可するためのロールが必要になるため事前に作成しておきます
#### ポリシーを作成
ロールに紐つけるポリシーを作成します
- IAMのポリシーから「ポリシーの作成」を選択します
![](https://storage.googleapis.com/zenn-user-upload/56789c5e29df-20230708.png)
- 「アクセス許可を指定」：「JSON」での編集モードにします
![](https://storage.googleapis.com/zenn-user-upload/0c1eb1ad992f-20230708.png)
- 以下の内容を記載します
	- Resourceの`バケット名`は各自が作成したバケット名に変更してください。
```json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:GetObject",
                "s3:DeleteObject",
                "s3:GetObjectVersion"
            ],
            "Resource": [
                "arn:aws:s3:::sftp-server-bucket-atf",
                "arn:aws:s3:::sftp-server-bucket-atf/*"
            ]
        }
    ]
}
```
- すべての操作を許可したい場合
```json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:*"
            ],
            "Resource": [
                "arn:aws:s3:::sftp-server-bucket-atf",
                "arn:aws:s3:::sftp-server-bucket-atf/*"
            ]
        }
    ]
}
```
- 入力したら「次へ」
![](https://storage.googleapis.com/zenn-user-upload/fe0f034d39f3-20230708.png)
- 「確認して作成」：ポリシー名や説明を入力します
	- ポリシー名：`SftpS3UserAccessPolicy`
	- 説明：任意（未入力でも可）
	- タグの追加：任意（未入力でも可）
![](https://storage.googleapis.com/zenn-user-upload/581a00198153-20230708.png)
- 「ポリシーの作成」を行います
![](https://storage.googleapis.com/zenn-user-upload/53b6e1933235-20230708.png)

#### ロールを作成
- IAMのロールから「ロールの作成」を選択します
![](https://storage.googleapis.com/zenn-user-upload/adacee20c17b-20230708.png)
- 「信頼されたエンティティを選択」：
	- 信頼されたエンティティタイプ：「AWSのサービス」
	- ユースケース：「Transfer」を検索・選択
	- 「次へ」
![](https://storage.googleapis.com/zenn-user-upload/0d01f59b2dcf-20230708.png)
- 「許可を追加」：先程作成したポリシー `SftpS3UserAccessPolicy` を選択し「次へ」
![](https://storage.googleapis.com/zenn-user-upload/bebb8a94dae4-20230708.png)
- 「名前、確認、および作成」：ロール名などを入力
	- ロール名：`SftpS3UserAccessRole`
	- 説明：任意（未入力でも可）
	- タグの追加：任意（未入力でも可）
![](https://storage.googleapis.com/zenn-user-upload/8873fdb5cc29-20230708.png)
- 「ロールを作成」する
![](https://storage.googleapis.com/zenn-user-upload/47974e2ba22d-20230708.png)

## 構築
### SFTPサーバーを作成する
---
AWS Transfer Family サービスにアクセスします。
- サーバーから、「サーバー作成」を選択
![](https://storage.googleapis.com/zenn-user-upload/1b693d8b9035-20230708.png)
- 「プロトコルを選択」：「SFTP」のみチェックの状態で「次へ」
![](https://storage.googleapis.com/zenn-user-upload/ba1adcede169-20230708.png)
- 「IDプロバイダーの選択」：「サービスマネージド」を選択して「次へ」
![](https://storage.googleapis.com/zenn-user-upload/10c8a1475de5-20230708.png)
- 「エンドポイントを選択」：外部公開するので「パブリックアクセス可能」を選択して「次へ」
	- カスタムホスト名を使用して、特定のドメイン等に出来るようです
	- 今回はデフォルトで割り振られるエンドポイントを使用します
![](https://storage.googleapis.com/zenn-user-upload/024e767250b1-20230708.png)
- 「ドメインを選択」：データの保存先はS3なので「Amazon S3」を選択して「次へ」
![](https://storage.googleapis.com/zenn-user-upload/4d2278f98f1b-20230708.png)
- 「追加の詳細を設定」：デフォルトのまま「次へ」
![](https://storage.googleapis.com/zenn-user-upload/f42b9481bfdd-20230708.png)
- 「確認と作成」：内容を確認して「作成」をする
![](https://storage.googleapis.com/zenn-user-upload/ada33bf1ee0d-20230708.png)
- サーバーページで作成が開始されます
![](https://storage.googleapis.com/zenn-user-upload/b0b0593b8a08-20230708.png)

### ユーザーの追加
---
- AWS Transfer Family作成したサーバーの詳細に入ります。
![](https://storage.googleapis.com/zenn-user-upload/b0b0593b8a08-20230708.png)
- 「ユーザーを追加」を選択します
- ![](https://storage.googleapis.com/zenn-user-upload/1adb7de1e21a-20230708.png)
- 「ユーザーを追加」：必要な情報を入力・選択します
- 「ユーザー設定」：
	- ユーザー名：接続に使用するユーザー名を入力（ex:`sftp-user01`)
	- ロール：最初に作成したロールを選択 `SftpS3UserAccessRole`
	- ポリシー：なし
	- ホームディレクトリ：作成したバケットを選択 `sftp-server-bucket-atf`
		- 自動で自身のユーザー名が設定されます。
		- 変更する場合は任意の名前を入力してください
	- 制限付き：チェックを入れる
		- 制限をかけることで自身のディレクトリより上を見せないようにする
![](https://storage.googleapis.com/zenn-user-upload/7ca9360e5bf8-20230708.png)
- 「SSH パブリックキー」：
	- ユーザーのSSHパブリックキーを記載します
	- パブリックキーの作成は下記URLを参照してください
https://docs.aws.amazon.com/ja_jp/transfer/latest/userguide/key-management.html#sshkeygen
![](https://storage.googleapis.com/zenn-user-upload/f3d85d8c3442-20230708.png)
- 「タグ」：任意
- 「追加」する
![](https://storage.googleapis.com/zenn-user-upload/9cbbdfffac0c-20230708.png)
- ユーザーが追加されます
- ![](https://storage.googleapis.com/zenn-user-upload/1369b63c6b1c-20230708.png)

## 接続・確認
接続はSFTP接続が出来るクライアント等を使用して確認してください。
例としてCyberduckでの設定を記載します
- サーバー（エンドポイント）：サーバーの詳細ページのエンドポイント
- ユーザー名：作成したユーザー `sftp-user01`
- SSH Privage Key：作成したSSHキーの秘密鍵を選択
![](https://storage.googleapis.com/zenn-user-upload/ade8932e3bdc-20230708.png)
![](https://storage.googleapis.com/zenn-user-upload/1d20021568d8-20230708.png)
- 接続時に初回接続メッセージが表示された場合は「許可する」
![](https://storage.googleapis.com/zenn-user-upload/60feb2841841-20230708.png)

- 接続しファイルをアップロード
	- 制限にチェックを入れているので自身のディレクトリがルートになっています
![](https://storage.googleapis.com/zenn-user-upload/f67fef6a2b78-20230708.png)
- S3バケットを確認：S3バケットでユーザーディレクトリにファイルが作成されていることを確認します。
![](https://storage.googleapis.com/zenn-user-upload/b251432862dc-20230708.png)

以上です。