IAMユーザーを持っていないメンバーや外部の人間とS3バケット上のオブジェクトをやり取りする際はStorage Browser for S3も検討しよう

IAMユーザーを持っていないメンバーや外部の人間とS3バケット上のオブジェクトをやり取りする際はStorage Browser for S3も検討しよう

IAMユーザーを持たない外部ユーザーとのファイル共有を、低コストかつ運用負荷を抑えて実現する方法を検討します。従来のVPNやWorkSpacesではコストが高く、Storage Browser for S3を使ったS3ベースのソリューションを構築・検証してみました。
2026.07.08

IAMユーザーを持っていないメンバーや外部の人間とインターネット経由でファイルのやり取りをするコストや運用負荷を抑えつつ実現したい

こんにちは、のんピ(@non____97)です。

皆さんはIAMユーザーを持っていないメンバーや外部の人間とインターネット経由でファイルのやり取りをするコストや運用負荷を抑えつつ実現したいなと思ったことはありますか? 私はあります。

社内の人間と閉域ネットワーク内でファイル授受をするのであればファイルサーバーを用意して対応することがあるでしょう。

一方でリモートワーク対応などでインターネットを介すとなると、ハードルが上がります。

この時の対応策としては以下が考えられます。

  1. Client VPN等のクライアント端末にインストールしたVPNソフトを介してファイルサーバーに接続する
  2. WorkSpaces等のVDIサービスをワンクッション挟んでからファイルサーバーに接続する
  3. S3バケットにオブジェクトを配置し、AWS Transfer Familyを介してSFTPで接続する
  4. S3バケットにオブジェクトを配置し、AWSマネジメントコンソールからオブジェクトの操作を行う

1つ目と2つ目の方法はコストも運用負荷も気になります。

100人のユーザーが営業日あたり平均して2時間ファイル授受のために接続するものとして、Client VPNの場合でコストを試算すると以下のようになります。

項目 金額
クライアント VPN エンドポイントのコスト (月単位)
2 サブネット × 730 時間/月 × 0.15 USD
219.00 USD
クライアント VPN 接続コスト
100 接続 × 2 時間/日 × 22 営業日 × 0.05 USD
220.00 USD
合計 439.00 USD

WorkSpaces Personalの場合は以下のようになります。

項目 金額
WorkSpaces のコスト
(100 instance × 10 USD monthly) + (100 instance × 0.27 USD hourly × 44 時間/月)
2,188.00 USD
プロフェッショナル 2021 の合計コスト 0.00 USD
スタンダード 2021 の合計コスト 0.00 USD
Visual Studio 2022 の合計コスト 0.00 USD
追加のアプリケーションバンドルコスト 0.00 USD
合計 2,188.00 USD

完全にシナリオを揃えることは難しいのですが、WorkSpaces Applicationsの場合は以下のようになります。

項目 計算式 金額
ユーザーライセンス 100 ユーザー × 4.19 USD/ユーザー 419.00 USD
─ ピーク稼働時間/月 2 時間/日 × 5 日/週 × 4.35 週 43.50 時間
─ ピークインスタンス時間 20 同時ユーザー × 43.50 時間 870.00 時間
アクティブストリーミング 870.00 時間 × 0.09 USD/時 78.30 USD
─ バッファインスタンス時間 (ピーク2台 × 43.50h) + (オフピーク1台 × 43.50h) 87.00 時間
停止 (バッファ) インスタンス 87.00 時間 × 0.029 USD/時 2.52 USD
合計 419.00 + 78.30 + 2.52 499.82 USD

ファイルサーバーの料金を除いて接続に関わる箇所のみでこの料金がかかってくるのは中々インパクトが大きいのではないでしょうか。

また、Client VPNおよびWorkSpaces Personalにおいては認証のためにAD ConnectorやManaged Microsoft ADを用いる場合はさらに、そちらの料金がかかってきます。以下のような料金がかかってきます。

ディレクトリタイプ 計算式 金額
AD Connector (Small) 730 時間/月 × 0.08 USD/時 58.40 USD
Managed Microsoft AD (Standard) 2 台 (DC) × 730 時間/月 × 0.073 USD/時 106.58 USD

加えてファイルサーバーの料金もかかってきます。10TBのデータを保存するシチュエーションでSingle-AZであっても以下のような金額が発生します。

  • FSx for Windows File Server

    項目 計算式 金額
    ストレージ (HDD) 1,024.00 GB × 0.016 USD 16.38 USD
    スループットキャパシティ 128.00 MBps × 2.53 USD 323.84 USD
    バックアップストレージ 10,240.00 GB × 0.05 USD 512.00 USD
    合計 16.38 + 323.84 + 512.00 852.22 USD
  • FSx for NetApp ONTAP

    項目 計算式 金額
    ストレージ (SSD) 10,240 GB × 0.20 (SSD割合) × 0.85 (圧縮重複排除 1-0.15) × 0.15 USD 261.12 USD
    ストレージ (キャパシティプール) 10,240 GB × 0.80 (キャパシティプール割合) × 0.85 (圧縮重複排除) × 0.0238 USD 165.72 USD
    スループット/IOPS 128 MBps × 0.906 USD 115.97 USD
    バックアップストレージ 10,240 GB × 0.85 (圧縮重複排除) × 0.05 USD 435.20 USD
    合計 261.12 + 165.72 + 115.97 + 0.00 + 435.20 978.01 USD

そのため、以下のような要件を満たすのであればS3バケットにデータを配置したいです。

  • NFSやSMBを用いたやり取りではなくとも良い
  • オブジェクトを閲覧する際は都度オブジェクトをダウンロードする形で良い
  • オブジェクトやプレフィックスレベルで細かくACLを変更するといった権限制御は不要であり、トップレベルのプレフィックス数個レベルで権限を切り替えれる形で十分

S3であれば、10TB保存したとしてもストレージクラスがStandardで256.00 USDです。データの耐久性がイレブンナインであることを勘案し、物理的な破損を無視する形で良いのであればバックアップも不要なのも嬉しいところです。

肝心なS3バケットへの接続ですが、先述の3つ目と4つ目のパターンのいずれも課題があります。

ここで候補に上がるのがStorage Browser for S3です。

https://docs.aws.amazon.com/AmazonS3/latest/userguide/storage-browser.html

https://ui.docs.amplify.aws/react/connected-components/storage/storage-browser

CognitoのPlusプランであっても100人程度の利用であれば、毎月2USD程度なのも嬉しいです。Amplify周りなど諸々の料金合わせても今回のシナリオだと300USDほどかと考えます。

他にもTransfer Family Web Appsが類似の機能でありますが、こちらはIAM Identity Centerが必須です。

https://dev.classmethod.jp/articles/try-transfer-family-web-apps/

使っていない場合や使えない場合、S3バケット上のオブジェクトにアクセスするためだけのユーザーをIAM Identity Centerに登録したくない場合は、Storage Browser for S3を選択する形になるかと思います。

料金的にもストレージ部分を除いて0.50 USD/h/ユニットの料金がかかります。少なくとも360USD/monthほどかかり、Storage Browser for S3よりも高く見えてしまいますが、Storage Browser for S3の場合はコーディングが必要だったり、用意するするリソースも比較的多かったりするので、TCOで判断かなと考えます。

今回はStorage Browser for S3を用いてファイルを共有する仕組みを作成してみました。

やってみた

検証環境

検証環境は以下のとおりです。

architecture.png

AmplifyでReactのSPAをホスティングしています。

使用したコードは以下GitHubリポジトリに保存しています。

https://github.com/non-97/storage-browser-for-s3-sample-app

事前準備としては以下が必要になります。

  • Amplifyおよび、Cognito Managed Loginで使用するDNS名を管理するRoute 53 Public Hosted Zone
  • Cognito Managed Loginで使用するDNS名の親ドメインのAレコード
    • アプリケーションデプロイ完了後に削除する予定
  • Cognito Managed Loginで使用するACM証明書
    • us-east-1に必要
  • 招待メールやパスワードリセットなどで使用するAmazon SESのID

準備が完了したら、マネジメントコンソールからAmplifyでデプロイを行います。一連のフローは以下が参考になると思います。

https://dev.classmethod.jp/articles/astro-deploy-to-amplify/

なお、私が試したところビルドインスタンスは"特大"でなければOOMでビルドに失敗しました。同様の事象が発生した場合は調整してみてください。

デプロイが完了したあとはscripts/setup-custom-domain.shを実行してください。こちらでカスタムドメインの関連付けやRoute 53 Hosted Zone上のダミーAレコードを削除します。

あとは必要に応じてCognitoユーザーを追加してください。

ログイン

実際に操作をしてみましょう。

まずはログインからです。

現在のユーザー一覧は以下のとおりです。

1.ユーザー一覧.png

確認ステータスがパスワードを強制的に変更となっているユーザーでログインをしてみましょう。

なお、こちらのユーザーはadminグループに属しています。

2.adminグループ.png

ユーザーはCognitoグループに割り当てられたIAMロールに基づいてアクセスできるS3バケットの領域が変わります。adminグループに割り当てているIAMロールのIAMポリシーでは以下のように、複数のプレフィックスに対してアクセスできるようにしています。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "kms:Decrypt",
                "kms:Encrypt",
                "kms:ReEncrypt*",
                "kms:GenerateDataKey*"
            ],
            "Resource": "arn:aws:kms:ap-northeast-1:<AWSアカウントID>:key/ba958054-28bb-4656-b13e-6161d49e6e0c",
            "Effect": "Allow"
        }
    ]
}
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": "s3:GetObject",
            "Resource": [
                "arn:aws:s3:::amplify-dugv9lhpj4k9l-mai-sharedfilesbucket1afeda1-ukdr3hfjg7ua/shared/*",
                "arn:aws:s3:::amplify-dugv9lhpj4k9l-mai-sharedfilesbucket1afeda1-ukdr3hfjg7ua/dept-a/*",
                "arn:aws:s3:::amplify-dugv9lhpj4k9l-mai-sharedfilesbucket1afeda1-ukdr3hfjg7ua/dept-b/*"
            ],
            "Effect": "Allow"
        },
        {
            "Condition": {
                "StringLike": {
                    "s3:prefix": [
                        "shared/*",
                        "shared/",
                        "dept-a/*",
                        "dept-a/",
                        "dept-b/*",
                        "dept-b/"
                    ]
                }
            },
            "Action": "s3:ListBucket",
            "Resource": "arn:aws:s3:::amplify-dugv9lhpj4k9l-mai-sharedfilesbucket1afeda1-ukdr3hfjg7ua",
            "Effect": "Allow"
        },
        {
            "Action": "s3:PutObject",
            "Resource": [
                "arn:aws:s3:::amplify-dugv9lhpj4k9l-mai-sharedfilesbucket1afeda1-ukdr3hfjg7ua/shared/*",
                "arn:aws:s3:::amplify-dugv9lhpj4k9l-mai-sharedfilesbucket1afeda1-ukdr3hfjg7ua/dept-a/*",
                "arn:aws:s3:::amplify-dugv9lhpj4k9l-mai-sharedfilesbucket1afeda1-ukdr3hfjg7ua/dept-b/*"
            ],
            "Effect": "Allow"
        },
        {
            "Action": "s3:DeleteObject",
            "Resource": [
                "arn:aws:s3:::amplify-dugv9lhpj4k9l-mai-sharedfilesbucket1afeda1-ukdr3hfjg7ua/shared/*",
                "arn:aws:s3:::amplify-dugv9lhpj4k9l-mai-sharedfilesbucket1afeda1-ukdr3hfjg7ua/dept-a/*",
                "arn:aws:s3:::amplify-dugv9lhpj4k9l-mai-sharedfilesbucket1afeda1-ukdr3hfjg7ua/dept-b/*"
            ],
            "Effect": "Allow"
        }
    ]
}

招待メールが届いているので、招待メールに従ってログインします。

3.【Secure File Sharing】アカウントが作成されました.png

メールアドレスを入力します。

4.サインイン.png

仮パスワードを入力します。

5.仮パスワードの入力.png

パスワードの変更をします。

6.パスワードの変更.png

MFAを強制しているので、TOTP Authenticatorアプリケーションのセットアップを要求されました。登録します。

7.TOTP Authenticatorアプリケーションのセットアップ.png

パスキーも使用できるようにしているので、パスキーのセットアップも確認されました。強制ではないのですが、パスキーを追加しておきます。

8.パスキーでサインインをセットアップ.png

ログイン完了すると、以下のようにアクセスできる領域の一覧できます。

9.ホーム.png

アカウント設定を確認すると、以下のようにパスワードや認証アプリ、パスキーの管理を行えます。

10.アカウント設定.png

オブジェクトのアップロード

オブジェクトの操作をしてみます。

dept-aを開きます。

11.dept-a.png

ファイルをいくつかD&Dで選択します。

12.アップロード.png

アップロードボタンをクリックするとアップロードが完了しました。

13.アップロード2.png

アップロードしたファイルが確認できます。

14.アップロード完了後.png

一部のファイルはプレビューも可能です。

15.プレビュー_png.png
16.プレビュー_txt.png
17.プレビュー_pdf.png

プレビュー可能な拡張子は以下のとおりです。

カテゴリ 対応拡張子
画像 ( image ) jpg, jpeg, png, gif, webp, svg, bmp, tiff, tif, ico, heic, heif, avif
動画 ( video ) mp4, avi, mov, wmv, flv, webm, mkv, m4v, mpg, mpeg, 3gp, ogv
テキスト ( text ) txt, csv, log, json, xml, yaml, yml, ini, conf, cfg

PDFやExcelやWordファイルを共有したいことも多いと思いますが、それらはプレビューできません。

フォルダの作成

フォルダを作成することも可能です。

画面右のメニューからフォルダ作成をクリックします。

18.フォルダ作成.png

フォルダ名を入力してフォルダを作成をクリックすると、フォルダの作成が行えます。

19.フォルダ1.png

フォルダ内にフォルダを作成することも可能です。

20.フォルダ内にも作成.png

検索

検索も可能です。

検索はフォルダ名およびファイル名に対して単一のキーワードで行えます。複数のキーワードで検索をしたり、メタデータや、コンテンツについては検索できないため注意しましょう。

ONTAPで検索すると一件のみヒットしました。

21.ONTAPで検索.png

サブフォルダを含むにチェックを入れた状態で再度検索すると、今度はサブフォルダ内のファイルについても検索できました。

22.ONTAPで検索_サブフォルダ.png

ダウンロード

ファイルのダウンロードを試します。

今回は検索で出てきた2件のファイルを選択し、ダウンロードを行います。

23.ダウンロード.png

対象を確認し、問題なければダウンロードをクリックします。

24.ダウンロード.png

すると、zipファイルをダウンロードする挙動になりました。

25.zipになる.png

ダウンロードが完了すると以下のようになります。

26.All files downloaded..png

ダウンロードしたzipファイルを解凍すると、選択した2つのファイルを確認できました。

27.解凍後.png

別ユーザーからログイン

別ユーザーからログインした場合の挙動を確認します。

こちらのユーザーはdept-aへの権限を持っていないため、一覧で表示がなされていませんね。

28.別ユーザーでログイン.png

このように所属するグループによってアクセスできる領域をコントロールすることができます。

ランニングコストを抑えてファイルを共有したい場合に

Storage Browser for S3を用いてS3バケット上のオブジェクトを共有してみました。

BoxやOneDriveなどを調達することが難しい場合に検討してみてください。

この記事が誰かの助けになれば幸いです。

以上、クラウド事業本部 コンサルティング部の のんピ(@non____97)でした!

この記事をシェアする

AWSのお困り事はクラスメソッドへ

関連記事