AWS Transfer Family - EFS + サービスマネージド

# 構成

前回、AWS Transfer Family - S3 + サービスマネージドの構成で試してみたが、AWS Transfer Family - EFS + サービスマネージドの構成で検証してみようと思う。

https://qiita.com/leomaro7/items/fd04d37ab1d67b7acc8b

![trans.drawio (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/c06711ad-3c73-728f-263e-aa5b80401688.png)


# 設定

## EFS
　
### EFSの作成

https://docs.aws.amazon.com/ja_jp/efs/latest/ug/creating-using-create-fs.html

## IAM

https://docs.aws.amazon.com/ja_jp/transfer/latest/userguide/requirements-roles.html

Amazon Transfer FamilyがEFSにアクセスするためのIAMロールとポリシーを作成しておきます。

2種類のIAMロールとポリシーを作成しておいて下さい。信頼関係はいずれも同じです。

```json
{
  "Version": "2012-10-17",　　
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "transfer.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}
```

### rootファイルシステムアクセス権を付与したポリシー

```json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "RootFileSystemAccess",
            "Effect": "Allow",
            "Action": [
                "elasticfilesystem:ClientRootAccess",
                "elasticfilesystem:ClientMount",
                "elasticfilesystem:ClientWrite"
            ],
            "Resource": "arn:aws:elasticfilesystem:region:account-id:file-system/file-system-id"
        }
    ]
}
```

### ユーザーファイルシステムアクセス権のみを付与したポリシー

```json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "UserFileSystemAccess",
            "Effect": "Allow",
            "Action": [
                "elasticfilesystem:ClientMount",
                "elasticfilesystem:ClientWrite"
            ],
            "Resource": "arn:aws:elasticfilesystem:region:account-id:file-system/file-system-id"
        }
    ]
}
```

## Amazon Transfer Family

### サーバー

サーバーは基本的には、保存先を「Amazon EFS」にするところ以外は前回作成したS3のパターンと同じです。
![スクリーンショット 2023-10-28 16.06.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/5592cfa9-e688-2372-bdb1-92b2f9c90697.png)

### ユーザーの追加

ユーザーは今回検証のため3つ準備しておきます。

||user1|user2|user3|
|---|---|---|---|
|ユーザーID|0|9999|1111|
|グループID|0|9999|9999|
|ロール|rootファイルシステムアクセス権を付与したポリシー|ユーザーファイルシステムアクセス権のみを付与したポリシー|ユーザーファイルシステムアクセス権のみを付与したポリシー|
|ホームディレクトリ|root/|root/transfer|root/transfer|

**user1**
![スクリーンショット 2023-10-28 18.27.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/ed9d3f65-4d12-7fd7-7446-763e173d3abe.png)
**user2**
![スクリーンショット 2023-10-28 18.27.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/ccd83ba4-426d-c333-699a-02d1d1b5edcd.png)
**user3**
![スクリーンショット 2023-10-28 18.26.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/3824aebc-ed43-d67b-b97a-cca0a2559532.png)


# 動作確認

## user1での作業

user1はrootユーザーを使用してフォルダーを作成し、残りのユーザーにPOSIX ID所有者を割り当てる管理用です。
　
```
# user1で接続
sftp -i sftp user1@s-XXX.server.transfer.ap-northeast-1.amazonaws.com
Transfer family connection test
Connected to XXX.server.transfer.ap-northeast-1.amazonaws.com.

# 現在のディレクトリを確認
sftp> pwd
Remote working directory: /fs-XXX

# transferディレクトリを作成
sftp> mkdir transfer
sftp> ls -l
drwxrwxrwx   2          0        0     6144 Oct 28 08:11 transfer

# uidとgidを9999に変更し、パーミッションを755に設定
sftp> chown 9999 transfer
Changing owner on /fs-XXX/transfer
sftp> chgrp 9999 transfer     
Changing group on /fs-XXX/transfer
sftp> chmod 755 transfer
Changing mode on /fs-XXX/transfer
sftp> ls -l
drwxr-xr-x   2       9999     9999     6144 Oct 28 09:14 transfer
```

## user2での接続確認

user2はtransferディレクトリに書き込み権限があるので、put,getどちらも成功するはずです。

```
sftp -i sftp user2@s-XXX.server.transfer.ap-northeast-1.amazonaws.com
Transfer family connection test
Connected to s-XXX.server.transfer.ap-northeast-1.amazonaws.com.

# 現在のディレクトリを確認
sftp> pwd
Remote working directory: /fs-XXX/transfer

# put
sftp> put test.txt
Uploading test.txt to /fs-XXX/transfer/test.txt
test.txt
sftp> ls -l
-rw-r--r--   1       9999     9999        0 Oct 28 08:15 test.txt

# get
sftp> get test.txt
Fetching /fs-XXX/transfer/test.txt to test.txt
```

## user3での接続確認

user3はtransferディレクトリに読み取り権限はありますが、書き込み権限はないので、putは失敗し、getは成功するはずです。

```
sftp -i sftp user3@s-XXX.server.transfer.ap-northeast-1.amazonaws.com
Transfer family connection test
Connected to s-XXX.server.transfer.ap-northeast-1.amazonaws.com.

# 現在のディレクトリを確認
sftp> pwd
Remote working directory: /fs-XXX/transfer

# put
sftp> put test.txt
Uploading test.txt to /fs-XXX/transfer/test.txt
dest open "/fs-xxx/transfer/test.txt": Permission denied

# get
sftp> get test.txt
Fetching /fs-XXX/transfer/test.txt to test.txt
```

# 参考リンク

https://blog.grasswake.me/tech-posts/1649854873