AWS Transfer Family を利用した FTP を触ってみた

# はじめに

AWS Transfer Family は、AWS で提供されている SFTP, FTPS, FTP のプロトコルが使える安全なファイル転送のサービスです。転送先は、S3 と EFS を選べます。オンプレミスで FTP などを利用しているシステムがある場合、マネージドサービスとして AWS に管理負担を任せられます。

今回は、AWS Transfer Family で FTP の利用方法を検証する記事です。以下の チュートリアルを基に進めていきます。
チュートリアル : https://docs.aws.amazon.com/ja_jp/transfer/latest/userguide/getting-started.html



# FTP のサポートしているモード

FTP や FTPS では、アクティブモードとパッシブモードの2種類の通信方式があります。AWS Transfer Family では、パッシブモードのみ利用可能です。アクティブモードは利用できません。

次の Document に記載されています。  
https://docs.aws.amazon.com/ja_jp/transfer/latest/userguide/transfer-file.html

> - File Transfer Protocol (FTP) および FTPS では、パッシブモードのみがサポートされています。



また、パッシブモードの時にデータチャネルとして利用されるポートの範囲は「8192–8200」です。

これも次の Document に記載されています。  
https://docs.aws.amazon.com/ja_jp/transfer/latest/userguide/create-server-ftp.html

> Transfer Family 用の FTP サーバは、ポート 21（コントロールチャネル）およびポート範囲 8192-8200（データチャネル）で動作します。



# Security Group の作成

Transfer Family の FTP サーバーに割り当てる Security Group が必要です。インバウンドルールとして、ポート21 と、8192-8200 を許可しましょう。

![image-20220306123349906.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/9162b66d-dd10-59ac-474a-48fe91742001.png)



# Transfer Family の作成

マネージメントコンソールで、Transfer Family のページに移動して作成を進めていきます。

![image-20220306121125592.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/456a4891-a53b-bce5-9ac1-12a1bf5869d2.png)



FTP を使いたいので、FTP のみ選択します。複数選択することも可能です。

![image-20220306121451332.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/974d912a-08cf-56a1-14d2-1aa3d8fb13e1.png)



FTP を利用する場合は、AWS Directory Service か Custom Identity Provider で認証情報を連携する必要があります。今回は、AWS Directory Service で Microsoft AD を利用していきます。(Microsoft AD は、事前に作成しているものを利用します)

![image-20220306122350664.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/58e30871-f72a-30cb-c4a6-86671ff9875b.png)



Transfer Family が稼働する VPC と Subnet を選択します。

![image-20220306123605274.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/17862594-3895-6e84-6437-c2fd06eba336.png)



Security Group も選択して、Next を押します

![image-20220306123645163.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/d4ee6e14-8db4-cc85-05ab-521bf927ba5b.png)



連携先として S3 を選択して、Next を押します

![image-20220306123721351.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/4a5642dd-a593-2ba1-fead-a40748e1d2f0.png)



デフォルトの設定のまま進めます。

- CloudWatch Log に出力するための IAM Role を自動作成
- セキュリティーポリシーはデフォルトのまま

![image-20220306123950340.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/e4476c67-83ff-7375-dc7f-c0f8faf19919.png)



Banner には適当な文字列をいれて Next を押します

![image-20220306124104213.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/ef6ed377-6a4b-029c-6a40-e20d46299b8b.png)



Create を押します

![image-20220306124120397.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/9768c53b-f41d-c5df-de7f-8c92f868e067.png)



State が Starting のものが作成されました

![image-20220306124158924.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/3e9ccac3-72f0-eabe-67f2-4d1f311b40e6.png)



一定時間後、Online になります。自分の環境では1分くらいで Online になりました。

![image-20220306124240795.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/e2e00ce7-f1c8-edaf-947e-d5c127c7d0e5.png)



# VPC Endpoint の確認

Transfer Family を作成すると、自動的に裏側で VPC Endpoint が作成されています。この DNS names を使って、FTP アクセスをしていく形です。

```
vpce-0d70af354f8cf57ff-gltij020.vpce-svc-0775a3f847520ae1d.ap-northeast-1.vpce.amazonaws.com
```

![image-20220306130633320.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/4e89fb69-f0d7-95b6-a8cb-d336664cf2a1.png)





# Microsoft AD の Group にアクセス権限を付与

Microsoft AD と Transfer Family を連携しました。Microsoft AD から特定のグループをピックアップして、FTP のアクセス権限を付与できます。今回は、2 つのグループと、それに紐づくユーザーを作成していきます。

次に構成図を載せます。

![image-20220306143827291.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/cf1c15a4-b38f-f818-f4d6-cfb0f70cbda5.png)



Microsoft AD 上に、2つのグループを作成します

- transferfamily-admin-group01 : 全部の S3 Bucket にアクセスできるように、IAM Policy は none を指定
- transferfamily-normal-group01 : 特定の S3 Bucket にしかアクセスできない IAM Policy を自動生成



上記構成図のリソースを作成していきましょう。



## S3 Bucket の作成

2つのバケットを作成しました。

![image-20220306132708374.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/3777e8a9-6b77-933f-c2b5-f8861be0a387.png)



## Microsoft AD 上でグループとユーザーの作成

Microsoft AD のユーザーとコンピューターを開いて、グループを作成します。

![image-20220306132916626.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/2b5dd534-4a69-5650-8e3b-173fcc4da7fd.png)



グループ名を指定します

![image-20220306133011575.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/084ea2fd-6452-3087-5022-95920293ba76.png)



作成されました

![image-20220306133046491.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/0c969fbb-8608-75ac-3841-50a709ad0358.png)



2つのグループを作成します

![image-20220306133120632.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/43f57da1-256c-0ca6-5ab7-32b9d863a20e.png)



ユーザーを作成します

![image-20220306133144672.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/511ae3a6-3739-b303-5a85-c5ff7fe6f6aa.png)



ユーザー名を指定して、次へ

![image-20220306133255807.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/361f438b-0be5-e381-6ca8-620a0c8f4a78.png)



パスワードを指定して次へ

![image-20220306133328931.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/6d590a59-7b62-7d8a-a9f3-399992fc2046.png)



作成

![image-20220306133346087.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/ccddc70b-f557-f3d8-a698-07281a0822b8.png)



User が作成されました

![image-20220306133401122.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/fe75bbf7-5abf-9650-6ee6-f33eab4991f7.png)



同様に2つ目のユーザーも作成しました

![image-20220306133445328.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/67d16961-22d3-f59d-1b3a-ac4b19f667ea.png)



グループに追加をしていきます。

![image-20220306133526885.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/b76046c8-afe0-5f4d-13e5-12ed451e0431.png)



指定します。

![image-20220306133608371.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/b440950a-974a-6aa0-6b7f-13c3e5d9a085.png)



2つ目のユーザーも同様にグループに追加します。



## Microsoft AD のグループ SID を確認

Powershell を開いて、次のコマンドを実行して、作成したグループの SID を確認します。

```
Get-ADGroup -Filter {samAccountName -like "transferfamily*"} -Properties * | Select SamAccountName,ObjectSid
```



実行例

```
PS C:\Users\Admin> Get-ADGroup -Filter {samAccountName -like "transferfamily*"} -Properties * | Select SamAccountName,ObjectSid

SamAccountName                ObjectSid
--------------                ---------
transferfamily-admin-group01  S-1-5-21-3250835705-2212778946-1831747600-2119
transferfamily-normal-group01 S-1-5-21-3250835705-2212778946-1831747600-2120


PS C:\Users\Admin>
```



## IAM Role の作成

Create Role

![image-20220306134034830.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/4e81bd8e-4a98-aaa4-c34f-9aa76adf43c1.png)



Transfer を選択

![image-20220306134114547.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/47f0ee7a-cd08-d0db-79aa-26eae446c274.png)



Amazon S3 Full Access を選択

![image-20220306134621295.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/f8d87d83-2e07-58ed-02d5-56302d17565e.png)



名前を入力

![image-20220306134656258.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/764724b6-3abf-4f4c-88a2-697202d2968b.png)



Create

![image-20220306134708072.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/fa17fed3-4b36-fba9-9212-d78ba7f5f08d.png)



## Transfer Family 上でグループに権限付与

Transfer Family で、Microsoft AD で作成したグループに対して権限を付与します。該当のサーバーを選択します。

![image-20220306134900809.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/a27e3e9a-a62d-35ea-e013-04a0c9ecfcfb.png)



Add access で権限設定をしていきます。

![image-20220306134952496.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/fc7241aa-6ac7-b149-2e39-ab92990b3546.png)



`transferfamily-admin-group01` 用のアクセス権限です。

Polocy を None しており、IAM Role も全部の S3 Bucket へのアクセス許可を入れているため、すべてのBucket にアクセスが出来ます。

![image-20220306135140287.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/ffefde44-b7ee-cb8e-553e-4acbacaac3b0.png)



更に、normal-group の設定を進めていきます。Add access を押します。

![image-20220306135303920.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/8c368596-dfbe-a534-c8de-fff2588686a9.png)



`transferfamily-normal-group01` の権限設定です。このグループは、S3 Bucket の `transferfamily-bucket01` に限定してアクセスを許可する設定になっています。

- Home Directory : S3 Bucket の名前を指定。また、S3 上の特定のディレクトリ名として `homedir` を指定

![image-20220306142740058.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/e18273fb-06e6-4e00-c707-b2fee3963c5d.png)



なお、この時に自動生成される IAM Policy の内容は次の通りです。

```json
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "AllowListingOfUserFolder",
      "Action": [
        "s3:ListBucket"
      ],
      "Effect": "Allow",
      "Resource": [
        "arn:aws:s3:::${transfer:HomeBucket}"
      ],
      "Condition": {
        "StringLike": {
          "s3:prefix": [
            "${transfer:HomeFolder}/*",
            "${transfer:HomeFolder}"
          ]
        }
      }
    },
    {
      "Sid": "HomeDirObjectAccess",
      "Effect": "Allow",
      "Action": [
        "s3:PutObject",
        "s3:GetObject",
        "s3:DeleteObject",
        "s3:GetObjectVersion"
      ],
      "Resource": "arn:aws:s3:::${transfer:HomeDirectory}*"
    }
  ]
}
```



設定されました

![image-20220306140130112.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/b4260e46-3f7a-e99a-3c85-2eb68a84ddbe.png)



## S3 上で HomeDir の作成

権限設定の時に指定した、Home Directory を作成しました

![image-20220306143308438.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/7efb3c5e-15df-bbae-3008-21699482d9b8.png)



# アクセス確認

VPC Endpoint 宛に FTP で確認していきましょう！



## Amazon Linux2 : Admin

まず、アップロード用のテストファイルを生成します

```
mkdir ~/temp/transferfamily/
cd ~/temp/transferfamily/
echo "Hi! I am Test File with Transfer Family!" > test.txt
```



ftp コマンドで VPC Endpoint に接続をします。

```
ftp vpce-0d70af354f8cf57ff-gltij020.vpce-svc-0775a3f847520ae1d.ap-northeast-1.vpce.amazonaws.com
```



ユーザー名の入力を求められました。

```
> ftp vpce-0d70af354f8cf57ff-gltij020.vpce-svc-0775a3f847520ae1d.ap-northeast-1.vpce.amazonaws.com
Trying 10.0.102.129...
Connected to vpce-0d70af354f8cf57ff-gltij020.vpce-svc-0775a3f847520ae1d.ap-northeast-1.vpce.amazonaws.com (10.0.102.129).
220 Service ready for new user.
Name (vpce-0d70af354f8cf57ff-gltij020.vpce-svc-0775a3f847520ae1d.ap-northeast-1.vpce.amazonaws.com:ec2-user):
```



Microsoft AD 上の `transferfamily-admin` を入力します。なお、下記の「ユーザーログイン名 (Windows 2000 より前)」の名前を入力する必要があります。

![image-20220306141117962.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/f95b38a5-7fc6-2aab-d980-6b2ffd6d175e.png)



パスワードの入力を求められました。

```
Name (vpce-0d70af354f8cf57ff-gltij020.vpce-svc-0775a3f847520ae1d.ap-northeast-1.vpce.amazonaws.com:ec2-user): transferfamily-admin
331-Koreha Transfer Family no Test desu.
331 User name okay, need password for transferfamily-admin-user01.
Password:
```



パスワードを入れると正常にログインできます

```
Password:
230 User logged in, proceed.
Remote system type is UNIX.
ftp>
```



ls と打つと、すべての S3 Bucket が確認できます。admin 権限を付与している想定なので、正しい挙動です。

```
ftp> ls
227 Entering Passive Mode (10,0,101,37,32,5)
150 File status okay; about to open data connection.
drwxr--r--   1 - -            0 Jan  1  1970 aes-siem-11111111111111-geo
drwxr--r--   1 - -            0 Jan  1  1970 aes-siem-11111111111111-log
drwxr--r--   1 - -            0 Jan  1  1970 aes-siem-11111111111111-snapshot
drwxr--r--   1 - -            0 Jan  1  1970 alb-hostbaserouting-accesslog01
<省略>
```



current directory は、トップの / です

```
ftp> pwd
257 "/" is current directory.
```



cd で移動します

```
ftp> cd transferfamily-bucket01
250 Directory changed to /transferfamily-bucket01
```



バイナリモードに変更します

```
ftp> bin
200 Command TYPE okay.
```



Put コマンドで手元の text ファイルをアップロードします

```
ftp> put test.txt
local: test.txt remote: test.txt
227 Entering Passive Mode (10,0,101,37,32,7)
150 File status okay; about to open data connection.
226 Transfer complete.
41 bytes sent in 2.1e-05 secs (1952.38 Kbytes/sec)
```



![image-20220306141750310.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/0041124a-ccc2-3fd3-0232-101e38cf0e7d.png)



正常にダウンロードできました！

![image-20220306141819304.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/c2adf56d-1f05-0492-fbe1-090e239c0533.png)



ftp は exit で抜けておきましょう

```
ftp> exit
221 Goodbye.
```



## Amazon Linux 2 : Normal

次に、特定の Bucket にのみアクセス許可を与えているグループの挙動を確認してみます。

```
ftp vpce-0d70af354f8cf57ff-gltij020.vpce-svc-0775a3f847520ae1d.ap-northeast-1.vpce.amazonaws.com
```



ユーザー名 `transferfamily-norma` を入力します

```
Name (vpce-0d70af354f8cf57ff-gltij020.vpce-svc-0775a3f847520ae1d.ap-northeast-1.vpce.amazonaws.com:ec2-user): transferfamily-norma
```



パスワードを聞かれるので、入力してログイン出来ました。

```
Password:
230 User logged in, proceed.
Remote system type is UNIX.
ftp>
```



ログイン直後のディレクトリは、権限設定時の homedirとなっています。

```
ftp> pwd
257 "/transferfamily-bucket01/homedir" is current directory.
ftp>
```



なお、一個上のディレクトリに移動しても、そこのファイルは何も見えません

```
ftp> pwd
257 "/transferfamily-bucket01" is current directory.
ftp> ls -la
227 Entering Passive Mode (10,0,100,88,32,7)
150 File status okay; about to open data connection.
226 Closing data connection.
ftp>
```



一番上のルートディレクトリに移動しても、これも他の S3 Bucket は見えませんでした。

```
ftp> cd /
250 Directory changed to /
ftp> pwd
257 "/" is current directory.
ftp> ls -la
227 Entering Passive Mode (10,0,100,88,32,6)
150 File status okay; about to open data connection.
226 Closing data connection.
ftp>
```



Homedir に戻ります

```
ftp> cd /transferfamily-bucket01/homedir
250 Directory changed to /transferfamily-bucket01/homedir
ftp>
```



バイナリモードに変更します

```
ftp> bin
200 Command TYPE okay.
```



Put コマンドで手元の text ファイルをアップロードします

```
ftp> put test.txt
local: test.txt remote: test.txt
227 Entering Passive Mode (10,0,101,37,32,7)
150 File status okay; about to open data connection.
226 Transfer complete.
41 bytes sent in 2.1e-05 secs (1952.38 Kbytes/sec)
```



S３ 上にアップロードできました

![image-20220306143725233.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/18170e16-b941-275e-0805-c6018aeac1cd.png)



## Windows : Admin

WinSCP で接続をしてみます

- ホスト名 : VPC Endpoint を指定
- ユーザー名 : Microsoft AD のユーザー名とパスワードを指定

![image-20220306144251380.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/9b4cfc1f-6693-1720-9cba-47cf8659dcdd.png)



右側の画面が、すべての S3 Bucket が見えています。

![image-20220306144441166.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/27ee992f-beeb-25f5-6acf-f7cc04a78ef8.png)



特定の Bucket を開いて、ファイルのアップロード・ダウンロードが出来ました

![image-20220306144625235.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/f39a8bb9-d4b5-b47e-a7ab-4456b1661bca.png)



## Windows : Normal

今度は、アクセス制限をしている Normal Group でも接続をしてみます。

![image-20220306144745936.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/ec97c433-0a53-60ff-54c4-85bfd96d94c5.png)



接続が正常に出来て、Homedir が開けました。正常にファイルのダウンロード・アップロードが出来ます。

![image-20220306144840311.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/8552511a-cc37-6793-0a48-64b5b3763868.png)



また、上のディレクトリに移動してみましょう。

![image-20220306144931263.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/150bd3d0-d404-7373-f6eb-40bc4937e8a9.png)



何もファイルは見えません

![image-20220306144942144.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/20ed01b5-8aff-8cbe-fc4e-5f30f5c7ad25.png)





更に上に登っても、他の S3 Bucket は見えません

![image-20220306144957825.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/7a7e94b2-c23a-ad58-5033-bf9f330e097d.png)



# 検証を通じてわかったこと

- Transfer Family を利用して、Linux・Windows ともに FTP 転送が出来た
- パッシブモードのみサポートなど制限がある。詳細は Document を参照
  - https://docs.aws.amazon.com/ja_jp/transfer/latest/userguide/transfer-file.html
- Transfer Family の権限設定ページで、どのグループが、どの S3 Bucket に対してアップロードできるかコントロール可能
- 指定した S3 Bucket 以外は、存在自体確認できない



# 参考URL

https://docs.aws.amazon.com/ja_jp/transfer/latest/userguide/getting-started.html

クライアントを使用してファイルを転送する
https://docs.aws.amazon.com/ja_jp/transfer/latest/userguide/transfer-file.html