IAMユーザーを持っていないメンバーや外部の人間とS3バケット上のオブジェクトをやり取りする際はStorage Browser for S3も検討しよう
IAMユーザーを持っていないメンバーや外部の人間とインターネット経由でファイルのやり取りをするコストや運用負荷を抑えつつ実現したい
こんにちは、のんピ(@non____97)です。
皆さんはIAMユーザーを持っていないメンバーや外部の人間とインターネット経由でファイルのやり取りをするコストや運用負荷を抑えつつ実現したいなと思ったことはありますか? 私はあります。
社内の人間と閉域ネットワーク内でファイル授受をするのであればファイルサーバーを用意して対応することがあるでしょう。
一方でリモートワーク対応などでインターネットを介すとなると、ハードルが上がります。
この時の対応策としては以下が考えられます。
- Client VPN等のクライアント端末にインストールしたVPNソフトを介してファイルサーバーに接続する
- WorkSpaces等のVDIサービスをワンクッション挟んでからファイルサーバーに接続する
- S3バケットにオブジェクトを配置し、AWS Transfer Familyを介してSFTPで接続する
- 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です。
CognitoのPlusプランであっても100人程度の利用であれば、毎月2USD程度なのも嬉しいです。Amplify周りなど諸々の料金合わせても今回のシナリオだと300USDほどかと考えます。
他にもTransfer Family Web Appsが類似の機能でありますが、こちらはIAM Identity Centerが必須です。
使っていない場合や使えない場合、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を用いてファイルを共有する仕組みを作成してみました。
やってみた
検証環境
検証環境は以下のとおりです。

AmplifyでReactのSPAをホスティングしています。
使用したコードは以下GitHubリポジトリに保存しています。
事前準備としては以下が必要になります。
- 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でデプロイを行います。一連のフローは以下が参考になると思います。
なお、私が試したところビルドインスタンスは"特大"でなければOOMでビルドに失敗しました。同様の事象が発生した場合は調整してみてください。
デプロイが完了したあとはscripts/setup-custom-domain.shを実行してください。こちらでカスタムドメインの関連付けやRoute 53 Hosted Zone上のダミーAレコードを削除します。
あとは必要に応じてCognitoユーザーを追加してください。
ログイン
実際に操作をしてみましょう。
まずはログインからです。
現在のユーザー一覧は以下のとおりです。

確認ステータスがパスワードを強制的に変更となっているユーザーでログインをしてみましょう。
なお、こちらのユーザーはadminグループに属しています。

ユーザーは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"
}
]
}
招待メールが届いているので、招待メールに従ってログインします。

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

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

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

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

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

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

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

オブジェクトのアップロード
オブジェクトの操作をしてみます。
dept-aを開きます。

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

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

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

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



プレビュー可能な拡張子は以下のとおりです。
| カテゴリ | 対応拡張子 |
|---|---|
| 画像 ( 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ファイルを共有したいことも多いと思いますが、それらはプレビューできません。
フォルダの作成
フォルダを作成することも可能です。
画面右のメニューからフォルダ作成をクリックします。

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

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

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

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

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

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

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

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

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

別ユーザーからログイン
別ユーザーからログインした場合の挙動を確認します。
こちらのユーザーはdept-aへの権限を持っていないため、一覧で表示がなされていませんね。

このように所属するグループによってアクセスできる領域をコントロールすることができます。
ランニングコストを抑えてファイルを共有したい場合に
Storage Browser for S3を用いてS3バケット上のオブジェクトを共有してみました。
BoxやOneDriveなどを調達することが難しい場合に検討してみてください。
この記事が誰かの助けになれば幸いです。
以上、クラウド事業本部 コンサルティング部の のんピ(@non____97)でした!








