【初心者】AWS Transfer Family Web Apps を使ってみる

# 1. はじめに
業務で以下のような要件あり。
- ファイルサーバ的なものを作成し、WEB経由(ID/パスワード認証あり)で、ユーザの権限に応じたフォルダ/ファイルを公開したい。
- ユーザのアクセス元のSRCIPを制限したい。

それだと「EC2にNextCloudなどのクラウドストレージソフトをインストールか、もしくはSaaSのBoxとか、、」などが想定されたが、最近(2024/12)リリースされた、「AWS Transfer Family Web Apps」が、要件にマッチするかもと思い、できることを実際に確認する。

# 2. やったこと
- 「AWS IAM Identity Center」にて、グループとユーザを作成する。
- 「AWS Transfer Family Web Apps」にて、Web Appsを作成し、Identity Centerで作成したグループを認証の対象として設定する。
- S3バケットを作成し、公開したいフォルダ/ファイルを作成する。
- 「S3 Access Grants」の設定で、Identity Centerで作成したグループに対して、S3バケットの特定のフォルダに対する閲覧権限を付与する。
- S3バケットにCORS設定、及びSRCIP制限のバケットポリシーを設定する。
- Identity Centerに登録されたユーザが、許可されているSRCIPからのみ、Web Appsでの認証後に、権限があるフォルダ・ファイルだけが閲覧できることを確認する。

# 3. 構成図

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/a65f98bd-3e77-49f7-983a-c4e495415a61.png)

# 4. 予習
実際に設定を行う前に、既にトライ済の記事を読んで概要を理解する。

- そもそも「AWS Transfer Family Web Apps」とはどういうもので、どうやって設定？
    - [[AWS Transfer Family web apps] S3にアクセスできるWebアプリケーションをさくっと作ってみた](https://dev.classmethod.jp/articles/try-transfer-family-web-apps/)
    - [Transfer Family web apps触ってみた](https://blog.kinto-technologies.com/posts/2025-01-20-transfer-familiy-web-apps/)
⇒　認証付き公開WEBサーバみたいなのができて、S3バケットの中身をインターネット公開できそうということが分かった。

- Web Appsの作成手順の中で、「S3 Access Grants」を使うらしいがそれは何？
    - [Amazon S3 Access Grants とは何か。何が嬉しいのか。](https://qiita.com/hayao_k/items/e96471bd1874585985b1)
    - [Amazon S3 Access Grants を試してみた](https://blog.serverworks.co.jp/tried-s3-access-grants)
⇒　S3バケット・フォルダ・ファイルに対し、IDベースの認可を設定できる機能らしいということが分かった。

- 「Transfer Family Web Apps」と似た機能で「Storage Browser for S3」というのもあるけど、どう違う？
    - [AWS S3ブラウジング（Transfer Family Web Apps vs. Storage Browser for S3）](https://qiita.com/yuki-watanabe/items/f4d979a39abbd9706ae1)
    ⇒　前者はノーコード、後者は多少のコーディングが必要ということで、今回はより簡単そうな前者を検証することとした。

# 5. 手順

## 5.1 Identity Center でのグループ/ユーザ作成
- 本検証を行うAWSアカウント内の既存のIdentity Center アカウントインスタンス(アカウントの中で使えるIdentity Center)に、以下のグループとユーザを作成する。

| グループ  | ユーザ  |
|-----|-----|
| dodgers  | ohtani  |
| angels  | kikuchi  |

- Identity Centerの管理画面上は以下のような登録状況となる(グループdodgersの中にユーザohtaniが所属)。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/33d62104-a019-455e-a6f1-b5f99201702e.png)


## 5.2 Transfer Family Web Appsの作成

- Transfer Family の管理画面からWeb Appsを作成する。「ウェブアプリを作成」を選択する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/85086481-7e42-4f0f-ae3e-5bc32070dccc.png)

- 設定(同時接続数、アプリのタイトルとロゴ)を入力しWeb Appsを作成する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/7a86ed99-2370-40d2-86e3-a7bcda564529.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/31d99b7f-a865-459c-b5b7-e9b28b0d0aed.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/a80c9780-d5c0-432f-9cd9-5737c22d5afe.png)

- Web Apps 作成が完了すると、エンドポイント(URL)が確認できる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/5755a334-e0c7-488b-9ae0-427dbe74a0ea.png)

- Web Apps での認証の対象とするグループもしくはユーザを追加する。今回はグループ単位での追加とし、Idenity Center上のグループ「dodgers」「angels」の2つを追加する。
- 作成したWeb Appsの画面で「ユーザーとグループの割り当て」を選択し、２つのグループを選択して追加する。
- これにより各グループのメンバーであるユーザ「ohtani」「kikuchi」での認証が可能となる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/6601e7e9-7fe9-43b5-98aa-6ce5682d0761.png)

- Web AppsのエンドポイントURLにアクセスし、Identity Center に作成済のユーザ(ohtani)でログインしてみると、以下のポータルが表示される。まだS3側で何も公開設定していないため、アクセスできるものはない状態。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/9b9885e0-618e-439b-8c8d-e5b260378c6f.png)

## 5.3 S3バケット/フォルダ/ファイルの作成

- S3バケットを作成し、その中に「angels-folder」「dodgers-folder」の２つのフォルダを作成し、それぞれのフォルダに公開したいファイルを保存する。
- CORS及びバケットポリシーを後で別途設定する（この時点では空）。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/d7ec1a21-3dcc-45c7-b4c6-b804c0e9427d.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/733070a2-dcaa-4b9a-8766-4680d180f7f9.png)

## 5.4 S3 Access Grantsの作成

- S3 Access Grants では、「Identity Centerのdodgersグループ所属のユーザは、S3バケット内のdodgersフォルダ配下だけを閲覧可能」を実現させるような設定を行う。
- 設定項目は以下の3段構成となっており、この3つを順番に作成する。
    - S3 Access Grants インスタンス：　Identity Center と連携するためにリージョン毎に1つだけ作成する必要があるもの。
    - ロケーション：　Access Grantsで権限設定を行いたい範囲。
    - 権限：　ロケーションの全体/一部に対して、誰に何の権限を与えるのかの設定。

- まず、S3 Access Grants インスタンスを作成する。連携先として、同じリージョンにあるIdentity Centerインスタンスを選択する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/965b4923-f714-462c-9968-835a1d9a16bb.png)

- 次にロケーションとして、今回は検証用のS3バケット(1個)を設定する。ロケーションとして定義したS3バケットにアクセスするためのIAMロール設定が必要なため、それは事前に作成しておいたものを選択する。
- IAMロールの設定内容については、公式ドキュメントの「[Configure IAM roles for Transfer Family web apps](https://docs.aws.amazon.com/transfer/latest/userguide/webapp-roles.html)」の「Create an access grants role」を参照する。権限は今回はS3FullAccessとしている。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/4ee6b98b-2d6c-426d-9794-db67d7231fa2.png)


- 最後に権限を作成する。ロケーションとして設定したS3バケットの中の「dodgers-folder」配下への読み取りアクセスを、Identity Centerの「dodgers」グループに対して許可する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/640208a8-447a-4ab4-aec3-f92bb6b4f5ba.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/bb149388-4d92-43ab-9536-e5e2e95e54d2.png)

- S3 Access Grantsインスタンス、ロケーション、権限が作成できたことを確認する（この後、angels-folderに対してangelsグループからのアクセスを許可する権限設定も追加する）。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/00a97ca1-c027-4c05-8d68-e1d86e067be5.png)

- この時点で、試しに dodgersグループ所属のユーザ(ohtani)で再度Web Appsにログインする。権限を付与したフォルダが表示されるようになったが、まだファイルは見れない(Network Errorとなってしまう。CORS設定が必要)。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/0c4b3273-b04b-49bb-88c9-4abe90c63a2c.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/7f012144-4e78-4060-a392-da9246fc1f10.png)

## 5.5 S3バケットのCORS設定 
- ロケーションとして設定したS3バケットに対してCORS設定を行う。設定内容は公式ドキュメント「[Set up Cross-origin resource sharing (CORS) for your bucket](https://docs.aws.amazon.com/transfer/latest/userguide/access-grant-cors.html)」を参照。

``` CORS.json
[
    {
        "AllowedHeaders": [
            "*"
        ],
        "AllowedMethods": [
            "GET",
            "PUT",
            "POST",
            "DELETE",
            "HEAD"
        ],
        "AllowedOrigins": [
            "https://webapp-xxxxxxxxxxxxxxxxxx.transfer-webapp.us-east-1.on.aws"
        ],
        "ExposeHeaders": [
            "Access-Control-Allow-Origin"
        ]
    }
]
```

- 再度ユーザ(ohtani)でWeb Appsにログインすると、フォルダ内のファイルが表示され、ダウンロードも可能となる。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/70364936-5818-4aaf-aee7-55048264f688.png)


## 5.6 S3バケットのバケットポリシー設定(SRCIP制限)

- 特定のSRCIPからのみアクセス可とするため、ロケーションとして設定したS3バケットに対して、バケットポリシーを追加する。
    - S3バケットを管理するIAMユーザからは無条件で全てのアクセスを許可
    - SRCIP x.x.x.x/32からは読み取りアクセスのみ可(ohtaniやkikuchiがWeb Apps経由でアクセスする用)
    - 上記以外のアクセスは拒否(Web Appsがアクセス時に使用するS3 Grants インスタンスに対して、S3 Full Access を許可しているため、ここで明示的にDenyを入れておく必要あり)

``` bucketpolicy.json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::xxxxxxxxxxxx:user/xxxxxxxxx"
            },
            "Action": "s3:*",
            "Resource": [
                "arn:aws:s3:::mksamba-xxxxxxxx",
                "arn:aws:s3:::mksamba-xxxxxxxx/*"
            ]
        },
        {
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::mksamba-xxxxxxxx/*",
            "Condition": {
                "IpAddress": {
                    "aws:SourceIp": "x.x.x.x/32"
                }
            }
        },
        {
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:ListBucket",
            "Resource": "arn:aws:s3:::mksamba-xxxxxxxx",
            "Condition": {
                "IpAddress": {
                    "aws:SourceIp": "x.x.x.x/32"
                }
            }
        },
        {
            "Effect": "Deny",
            "Principal": "*",
            "Action": "s3:*",
            "Resource": [
                "arn:aws:s3:::mksamba-xxxxxxxx",
                "arn:aws:s3:::mksamba-xxxxxxxx/*"
            ],
            "Condition": {
                "StringNotEquals": {
                    "aws:PrincipalArn": "arn:aws:iam::xxxxxxxxxxxx:user/xxxxxxxxx"
                },
                "NotIpAddress": {
                    "aws:SourceIp": "x.x.x.x/32"
                }
            }
        }
    ]
}
```

- バケットポリシー設定後、許可されたIP(x.x.x.x/32)以外からユーザ(ohtani)でWeb Appsでアクセスした場合、Web Appsの認証は許可されポータルは表示されるが、フォルダ・ファイルは参照できなくなる。(Web Appsへのログイン自体ができなくなるほうがUI的には望ましいが、それはこの方法では制限できない)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/44711901-cdd7-4d52-b9ba-9a9d69516ac4.png)


# 6. 所感
- 今回、自分としてはこれまで使ったことがない機能が多く新鮮だった。
- それっぽい感じにはなったが、もし真剣に実利用しようとする場合、認証やファイルアクセスのログ確認や、独自ドメインの付与など、もう少し検討事項がありそう。