AWS S3ブラウジング（Transfer Family Web Apps vs. Storage Browser for S3）

![AWS S3ブラウジング.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/852059/697be577-13ab-aae1-6b3d-233bde06533f.png)


Japan Digital Design（以下JDD）でインフラエンジニアをしている渡邉です。
[Japan Digital Design Advent Calendar 2024](https://adventar.org/calendars/10000) の17日目の記事になります。

https://adventar.org/calendars/10000

さて、本記事では12月のre:Invent期間中に発表された、S3をブラウザで管理するための機能について調査してみたいと思います。



# S3ブラウジングの歴史
S3のサービススタートは2006年ですが、その割とすぐ後に非公式な [S3Browser](https://s3browser.com) というツールが生まれました。
Windowsでしか使えませんが、AWS ConsoleやCLIでのS3の操作がやりにくいこともあって、私の周りではちらほら利用しているユーザーが居たように思います。
あとは、WinSCP等、SSHクライアントの中にはS3に対応しているものもあり、ファイルの管理はそちらを使うというパターンもありました。
いずれもS3のファイルをもっと手軽に（AWSの知識が無くても）管理したい、というニーズがそれなりにあったということだと理解しています。

そしてついに本家がそのニーズに気づき（かどうかは知りませんが）、公式にS3ブラウジングツールがリリースされました。

### Transfer Family Web Apps
https://aws.amazon.com/jp/aws-transfer-family/web-apps/

### Storage Browser for S3
https://aws.amazon.com/jp/s3/features/storage-browser/

それぞれ利用するための方法が異なりますので、下記でざっくり比較してみます。

# 構築手順

### Transfer Family Web Apps
Transfer Family Web Appsを利用するためにはIAM Identity Centerが必要なため、事前に設定を済ませておきます。（設定方法は本筋から外れるため割愛します）

AWS Transfer Familyに「ウェブアプリ」というメニューが増えてますのでこちらからアプリを作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/852059/0c66cebd-bb3d-4d67-0a9a-f90247db6548.png)

今回はお試しのため一旦デフォルトのままで設定を進めます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/852059/8424a3a5-8e7d-48ed-ae48-6b54ecc3de88.png)

カスタマイズできる部分は限られますが、ロゴやタイトル等を設定できるようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/852059/80923371-eba2-3293-2572-75ad255f7be7.png)

あっという間に作成できました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/852059/2b4162f1-ce8e-7233-83ad-b5cef9822f35.png)

生成直後のデフォルトでは誰にも権限が付与されていないため、ユーザーを割り当てます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/852059/808e29ca-f2d7-e97b-841e-dcd48ccaaff2.png)

ユーザー追加のUIに癖がありますが、既存ユーザーを追加したい場合は検索窓から検索して追加するようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/852059/ef8d45b1-458a-5402-67bf-0fd741799748.png)

上記ユーザーの割り当て後、アプリケーションエンドポイントにアクセスすると無事ログインできました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/852059/400e430f-33b6-0b7e-ec3f-45b6532d62d2.png)

ただし、この時点ではどのバケットへのアクセスも許可されていないため、実際にアクセスするバケットに対して、S3 Access Grantsを追加してあげる必要があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/852059/c79255ec-a023-83a8-47b3-350e6c8a75e0.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/852059/fa8a5fa9-36e2-7c7f-5584-05f378c10ff6.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/852059/f0282d13-25d3-e94e-f798-e05ee8f7fd3b.png)

権限を適宜調整します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/852059/d68df8ed-3dd8-eeed-e9d8-e4e5947937a0.png)

上記でGrants付与後、再度アクセスすると無事該当バケットが閲覧できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/852059/17a60f94-9435-8a1e-be10-ff8269356212.png)

ただし、まだNGです。このままではアクセスするドメインが異なるため、CORSではじかれてしまいます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/852059/eb79cf3c-b038-3cb5-bbfe-6f5ed82fa999.png)

該当バケットのCORSを払い出されたURLに合わせて適宜調整します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/852059/709c1f26-6459-5b0a-0964-205125e5b24e.png)

これでようやくエラーが消えました。
ファイルやフォルダの追加も問題なくできました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/852059/a5a58185-5cac-549a-58ec-aeaaf9d3b022.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/852059/c459b4e7-54bc-3b34-389c-1ca1bdde5d5c.png)

削除操作も可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/852059/37c095be-ab23-33e5-2586-24d6eac5fc1a.png)

簡易的ながら、ファイル名の検索もできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/852059/6fa5c3ef-1083-0b3c-efbb-1cead0718f44.png)



### Storage Browser for S3
Storage Browser for S3 は 2024/9ごろアルファ版がリリースされていましたが、正式にGAとなりました。
実体は下記の aws-amplify パッケージの一部です。（aws-amplify/ui-react-storage）
つまり、AWSのサービスというよりも、自分自身のアプリケーションにS3ブラウジングの機能を組み込める、Amplifyで使えるUIコンポーネント、ということになります。
単体で利用できるものでは無いため、Amplifyやフロントエンドの知識が必要となります。

https://github.com/aws-amplify/amplify-ui?tab=readme-ov-file

今回はシンプルに動作確認するために、Viteをベースに構築します。

```bash
 npm create vite@latest
```

上記でViteアプリを生成した後、Storage Browser for S3 を追加します。

```bash
npm install
npm i --save @aws-amplify/ui-react-storage aws-amplify
```

さらにAmplify用に初期化します。

```bash
npm create amplify@latest
```

Storage Browserを利用するためのサンプルバケットを作成します。
今回はSandboxおよびローカルでの一時的な確認のみのため、guestにも書き込み権限を付与します。


```javascript:amplify/storage/resource.ts（新規作成）
import { defineStorage } from '@aws-amplify/backend';

export const storage = defineStorage({
    name: 's3-browser-sample',
    access: (allow) => ({
        'public/*': [
            allow.guest.to(['read', 'write', 'delete']),
        ],
    })
});

```

バックエンドに上記で作成したstorageを追加します。

```diff_javascript:amplify/backend.ts
import { defineBackend } from '@aws-amplify/backend';
import { auth } from './auth/resource';
import { data } from './data/resource';
+ import { storage } from './storage/resource';

/**
 * @see https://docs.amplify.aws/react/build-a-backend/ to add storage, functions, and more
 */
defineBackend({
  auth,
  data,
+ storage,
});
```

Sandbox環境にデプロイします。

```bash
npx ampx sandbox --profile ****
```

バックエンドの準備はこれで完了です。
後はフロントエンドにてStorageBrowserコンポーネントを利用します。

```javascript:src/App.tsx
import { Amplify } from 'aws-amplify';
import {
  createAmplifyAuthAdapter,
  createStorageBrowser,
} from '@aws-amplify/ui-react-storage/browser';
import "@aws-amplify/ui-react-storage/styles.css";
import config from '../amplify_outputs.json';

Amplify.configure(config);

const { StorageBrowser } = createStorageBrowser({
  config: createAmplifyAuthAdapter(),
});

function App() {
  return (
    <>
      <div>
        <StorageBrowser />
      </div>
    </>
  )
}

export default App
```



ローカルで起動します。

```bash
npm run dev
```

無事Storage Browserのコンポーネントが表示できました。UIとしてはTrasnfer Familyとほぼ同じです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/852059/8958ebd4-6a34-e78b-23b9-013d75eab24e.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/852059/b1de8521-17be-ce1f-a849-73e59a848b85.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/852059/d08d652d-8aa2-f307-a3e1-ace1576a4e2a.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/852059/0b7b7437-5e1e-272b-dfb7-6ce69ecadd2c.png)

これにCognito等で認証機能を付与すれば、組織外のメンバーにS3オブジェクトを操作してもらう、というのも柔軟にできそうです。
Transfer Family Web AppsではIAM Identity Centerのみしか認証として利用できないため、手間はかかるものの Storage Browser の方が汎用性は高そうです。
Amplifyを利用している場合は自前でコンポーネントを構築する必要もなく、サクッと使えてとても便利ですね。

なお、確認後はSandbox環境を削除するのをお忘れなく。

```bash
npx ampx sandbox delete --profile ****
```

# まとめ

どちらのサービスも、UIには差がなさそうでした。（おそらく内部的には同じものを利用していると思われます）
IAM Identity Centerでのユーザー管理を実施したい場合はTransfer Family Web Appsで手軽に構築できます。
IAM Identity Centerを利用していなかったり、独自の認証サービスを利用したいケース、また見た目を更にカスタマイズしたい、別のアプリケーションの一部として組み込みたいケースの場合はStorage Browser for S3を利用することになりそうです。

いずれのサービスにおいても、手軽にS3オブジェクトの管理をする環境を作成できるという点で、ユースケースによっては開発コストや期間の短縮につながると感じました。

以上、簡単にですが2つのS3ブラウジングツールを比較してみました。
最後までご覧いただきありがとうございました。

---

Japan Digital Design株式会社では、一緒に働いてくださる仲間を募集中です。カジュアル面談も実施しておりますので下記リンク先からお気軽にお問合せください。

https://japan-d2.com/careers

 

この記事に関するお問い合わせはこちら

https://japan-d2.com/contact

 

 
Technology & Development Div.
Infra Engineer

Yuki Watanabe