Slide 1

Slide 1 text

©Fusic Co., Ltd. 0 CONFIDENTIAL +"84%":4 .BTIVQGPSUIF'VUVSF S3ストレージクラスの「⾒える」「ある」 「使える」は全部違う ─ 体験から⾒た、仕様の深淵を覗く 2026.03.07 株式会社Fusic プリンシパルエンジニア ⼭本光彦

Slide 2

Slide 2 text

©Fusic Co., Ltd. 1 CONFIDENTIAL #jawsug #jawsdays2026 #jawsdays2026_e ⼭本 光彦(41) Mitsuhiko Yamamoto 株式会社Fusic所属 熊本市出⾝・在住 フルスタックエンジニア AWS歴13年 ⾃⼰紹介 はじめに

Slide 3

Slide 3 text

©Fusic Co., Ltd. 2 CONFIDENTIAL #jawsug #jawsdays2026 #jawsdays2026_e S3ストレージクラスは単なる保存場所ではなく、 時間軸を持つ状態遷移システム として扱いたい 本⽇のメッセージ イントロダクション

Slide 4

Slide 4 text

©Fusic Co., Ltd. 3 CONFIDENTIAL #jawsug #jawsdays2026 #jawsdays2026_e 1. 体験/What 2. 定義/Where 3. 深淵/Why 4. 設計/How アジェンダ イントロダクション SFTPで起きた謎の障害 S3は状態遷移システム 時間が持ち込む不確実性 時間を扱うアーキテクチャ

Slide 5

Slide 5 text

©Fusic Co., Ltd. 4 CONFIDENTIAL #jawsug #jawsdays2026 #jawsdays2026_e 体験 [What] 1

Slide 6

Slide 6 text

©Fusic Co., Ltd. 5 CONFIDENTIAL #jawsug #jawsdays2026 #jawsdays2026_e SFTP利⽤時に起きたこと 体験/what 前提の構成 TransferFamily S3 List Get 「ls」はできている サイズも表⽰されている 実際のSFTPクライアント画⾯

Slide 7

Slide 7 text

©Fusic Co., Ltd. 6 CONFIDENTIAL #jawsug #jawsdays2026 #jawsdays2026_e SFTP利⽤時に起きたこと 体験 what 前提の構成 TransferFamily S3 List Get ファイルがダウンロード不可 エンドユーザーは失敗の理由がわからない(壊れている?ネットワーク不備?) 実際のSFTPクライアント画⾯

Slide 8

Slide 8 text

©Fusic Co., Ltd. 7 CONFIDENTIAL #jawsug #jawsdays2026 #jawsdays2026_e SFTP利⽤時に起きたこと 体験 what 前提の構成 TransferFamily S3 List Get 存在している が 利⽤可能ではない 実際のSFTPクライアント画⾯

Slide 9

Slide 9 text

©Fusic Co., Ltd. 8 CONFIDENTIAL #jawsug #jawsdays2026 #jawsdays2026_e 定義 [Where] 2

Slide 10

Slide 10 text

©Fusic Co., Ltd. 9 CONFIDENTIAL #jawsug #jawsdays2026 #jawsdays2026_e S3は「保存場所」ではなく「状態遷移システム」である 定義 where 「⾒える / ある / 使える」の定義 概念 API 意味 ⾒える ListObject ⼀覧表⽰が可能である ある HeadObject メタデータが参照可能である 使える GetObject データの取得が可能である 存在すること(⾒える・ある)は保証される ただし、 「即時」に使えることは保証しない

Slide 11

Slide 11 text

©Fusic Co., Ltd. 10 CONFIDENTIAL #jawsug #jawsdays2026 #jawsdays2026_e S3は「保存場所」ではなく「状態遷移システム」である 定義 where 低速ストレージ(Glacier系)における状態遷移 File StorageClass= Standard アーカイブ 処理 File StorageClass= Glacier Restore リクエスト File StorageClass= Glacier Restore 完了 File StorageClass= Glacier File StorageClass= Glacier 再アーカイブ (Restore中) (Restored) (Archive)

Slide 12

Slide 12 text

©Fusic Co., Ltd. 11 CONFIDENTIAL #jawsug #jawsdays2026 #jawsdays2026_e S3は「保存場所」ではなく「状態遷移システム」である 定義 where 低速ストレージ(Glacier系)における状態遷移 File StorageClass= Standard アーカイブ 処理 File StorageClass= Glacier Restore リクエスト File StorageClass= Glacier Restore 完了 File StorageClass= Glacier File StorageClass= Glacier 再アーカイブ Restored状態は永続ではない 取得可能状態には期限がある (Restore中) (Restored) (Archive)

Slide 13

Slide 13 text

©Fusic Co., Ltd. 12 CONFIDENTIAL #jawsug #jawsdays2026 #jawsdays2026_e 深淵 [Why] 3

Slide 14

Slide 14 text

©Fusic Co., Ltd. 13 CONFIDENTIAL #jawsug #jawsdays2026 #jawsdays2026_e 時間が持ち込む4つの「不確実性」 深淵 why 取得不能状態が存在する ストレージクラス ⾒える ある 使える Standard ○ ○ ○ S3 Intelligent-Tiering ○ ○ △ S3 Standard-IA ○ ○ ○ S3 One Zone-IA ○ ○ ○ S3 Express One Zone ○ ○ ○ S3 Glacier Instant Retrieval ○ ○ △ S3 Glacier Flexible Retrieval ○ ○ △ S3 Glacier Deep Archive ○ ○ △ 即時に使うことができない 同期APIと相性が悪い

Slide 15

Slide 15 text

©Fusic Co., Ltd. 14 CONFIDENTIAL #jawsug #jawsdays2026 #jawsdays2026_e 時間が持ち込む4つの「不確実性」 深淵 why 取得可能状態には期限がある ⼀度取得できても永遠に取得できるわけではない 状態管理が必要であることを意味する { "ResponseMetadata": { ... "HTTPHeaders": { ... "x-amz-restore-expiry-days": 1 ... }, }, ... } ※Glacierから復元したファイル のHeader情報の⼀部

Slide 16

Slide 16 text

©Fusic Co., Ltd. 15 CONFIDENTIAL #jawsug #jawsdays2026 #jawsdays2026_e 時間が持ち込む4つの「不確実性」 深淵 why 内部状態が外形から判別できない 「ストレージクラス」は状態を完全には表していない 0⽇ Standard 30⽇ Intelligent- Tiering 90⽇ Glacier Flexible Retrieval 180⽇ Glacier Deep Archive 365⽇ 削除 Intelligent-Tiering Intelligent-Tiering Intelligent-Tiering StorageClass

Slide 17

Slide 17 text

©Fusic Co., Ltd. 16 CONFIDENTIAL #jawsug #jawsdays2026 #jawsdays2026_e 時間が持ち込む4つの「不確実性」 深淵 why ライフサイクル移⾏の⾮同期性 バッチ評価であり、即時移⾏ではない いつ取得不能になるかを完全に制御することができない 0⽇ Standard 30⽇ Intelligent- Tiering 90⽇ Glacier Flexible Retrieval 180⽇ Glacier Deep Archive 365⽇ 削除 設定した⽇数が経過した後の「翌⽇午前0時(UTC)」実⾏

Slide 18

Slide 18 text

©Fusic Co., Ltd. 17 CONFIDENTIAL #jawsug #jawsdays2026 #jawsdays2026_e 時間が持ち込む4つの「不確実性」 深淵 why 存在 ≠ 利⽤可能 ↓ 利⽤可能にも期限がある ↓ 状態が⾒えない ↓ いつ変わるか分からない

Slide 19

Slide 19 text

©Fusic Co., Ltd. 18 CONFIDENTIAL #jawsug #jawsdays2026 #jawsdays2026_e 解法 [How] 4

Slide 20

Slide 20 text

©Fusic Co., Ltd. 19 CONFIDENTIAL #jawsug #jawsdays2026 #jawsdays2026_e 設計原則:責務分離で「時間」を扱う 解法 how 分岐軸を「種類」から「利⽤可能性」へ移す 判断すべきは そのオブジェクトが「今取得可能」か if storage_class == ‘STANDARD’ xxx else if storage_class == ‘GLACIER’ yyy … 良くないプログラムコード例

Slide 21

Slide 21 text

©Fusic Co., Ltd. 20 CONFIDENTIAL #jawsug #jawsdays2026 #jawsdays2026_e 設計原則:責務分離で「時間」を扱う 解法 how Glacier移⾏時における判断プロパティ 状態/遷移 storage_class RestoreExpiry Date RestoreStatus IsRestoreIn Progress 備考 1 STANDARD STANDARD 2 GLACIER GLACIER (空) false 3 GLACIER (Restore状態) GLACIER YYYY/MM/DD true 4 STANDARD→ GLACIER - - - - 瞬時のため取 得できず 5 GLACIER→ GLACIER(Restore 状態) GLACIER (空) true 6 GLACIER(Restore 状態)→ GLACIER GLACIER YYYY/MM/DD true 3と同じ

Slide 22

Slide 22 text

©Fusic Co., Ltd. 21 CONFIDENTIAL #jawsug #jawsdays2026 #jawsdays2026_e 設計原則:責務分離で「時間」を扱う 解法 how 同期層と⾮同期層の分離 HTTPS取得イメージ SFTP取得イメージ

Slide 23

Slide 23 text

©Fusic Co., Ltd. 22 CONFIDENTIAL #jawsug #jawsdays2026 #jawsdays2026_e 設計原則:責務分離で「時間」を扱う 解法 how 同期層と⾮同期層の分離 復元はダウンロード処理と分離させ ⾮同期ワークフローとして扱う

Slide 24

Slide 24 text

©Fusic Co., Ltd. 23 CONFIDENTIAL #jawsug #jawsdays2026 #jawsdays2026_e 設計原則:責務分離で「時間」を扱う 解法 how ダウンロード 要求 GetObject (即時DL) 取得可 能? YES NO Restore Object (復元ジョブ) 同期層と⾮同期層の分離

Slide 25

Slide 25 text

©Fusic Co., Ltd. 24 CONFIDENTIAL #jawsug #jawsdays2026 #jawsdays2026_e 設計原則:責務分離で「時間」を扱う 解法 how 同期層と⾮同期層の分離

Slide 26

Slide 26 text

©Fusic Co., Ltd. 25 CONFIDENTIAL #jawsug #jawsdays2026 #jawsdays2026_e 設計原則:責務分離で「時間」を扱う 解法 how 同期層と⾮同期層の分離 "Statement":[ { "Sid":"PolicyForAllowUploadWithACL", "Effect":”Deny", "Action":"s3:ListObject", "Resource":"arn:aws:s3:::amzn-s3-demo-bucket/*", "Condition": { "StringEquals": {”/path/to/glacier"} } } ] ※アーカイブリスト がある前提 アーカイブオブジェクトは⾒せない

Slide 27

Slide 27 text

©Fusic Co., Ltd. 26 CONFIDENTIAL #jawsug #jawsdays2026 #jawsdays2026_e 設計原則:責務分離で「時間」を扱う 解法 how ユーザー導線とアーカイブの分離 ユーザーがアクセスするのはデリバリバケットのみ デリバリ バケット アーカイブ バケット File Glacier化 File 復元 HTTPS SFTP 導線

Slide 28

Slide 28 text

©Fusic Co., Ltd. 27 CONFIDENTIAL #jawsug #jawsdays2026 #jawsdays2026_e 設計原則:責務分離で「時間」を扱う 解法 how SLAを「保存」と「取得」で分けて設計する 「時間軸」によるSLAの定義が必要 定義 意味 保存SLA データが失われない 取得SLA どのくらいの時間で取得できるか 即時取得SLA 今すぐ取得できるか

Slide 29

Slide 29 text

©Fusic Co., Ltd. 28 CONFIDENTIAL #jawsug #jawsdays2026 #jawsdays2026_e まとめ 5

Slide 30

Slide 30 text

©Fusic Co., Ltd. 29 CONFIDENTIAL #jawsug #jawsdays2026 #jawsdays2026_e 結論 まとめ ・SFTPは「取得できるファイル」を前提にしたインターフェース ・取得不能状態を混ぜると、障害に⾒えるのは必然 冒頭のSFTPでは何を間違えていたか

Slide 31

Slide 31 text

©Fusic Co., Ltd. 30 CONFIDENTIAL #jawsug #jawsdays2026 #jawsdays2026_e 結論 まとめ まとめ ・S3はただのファイル置き場ではない ・状態遷移と期限を持つ ・設計で扱うべき対象は容量より時間 ・S3は容量の設計ではない。時間の設計である

Slide 32

Slide 32 text

©Fusic Co., Ltd. 31 CONFIDENTIAL Thank You We are Hiring! https://recruit.fusic.co.jp/ ご清聴いただきありがとうございました