リージョンと可用性|クラウドの基本・IAM・責任

このページはプロモーション(広告)を含みます。

クラウドの基本・IAM・責任(中級・読む30分+演習35分)

この授業のゴール

仕事でどう使うか

「止まると困るシステムを、どこに、いくつ置くか」を決めるのが可用性の設計です。分析や機械学習の成果物も、毎朝のダッシュボードや予測APIとして使われ始めると、止まったときの影響を説明する必要が出てきます。

路線 この授業の使いどころ
DS 毎朝8時のレポートが遅れたときの影響を整理し、どの部品を冗長化するか提案する
ML 予測APIの構成図に可用性の見積もりを書き、「月何分まで止まり得るか」を関係者と合意する
DX ベンダーの提案にある「99.9%」が月何分の停止に当たるかを換算し、業務への影響と費用を比べる
RS 研究データの保管先の地域を、共同研究の契約や所属機関の規程に合わせて選ぶ

この授業の可用性の数値は教材用の仮定です。提供者が公表するSLA(Service Level Agreement:サービス水準の合意)の値・条件・対象は、サービスや時期で異なり変わり得るため、断定せず公式情報で確認してください。計算はすべて端末内の模擬です。

前提

次の言葉と計算を使います。

Pythonは、リストと for 文、関数の定義が読めれば十分です。

身近な状況:「同じ建物に2台」は冗長か

みなと商店の予測API(商品のおすすめ)は、仮想サーバー2台で動いています。担当者は「2台あるので1台壊れても大丈夫」と考えていました。

ところがある日、2台が置かれていた同じデータセンターの区画で電源設備の障害が起き、2台とも同時に止まりました。おすすめ欄が3時間表示されず、問い合わせが殺到しました。

もう1つの出来事もありました。顧客データを東京近郊の地域と海外の地域の両方に複製していたところ、法務担当から「この顧客データは契約上、国内に保管すると約束している」と指摘されました。

2つの出来事から分かることは次のとおりです。

  1. 台数を増やしても、同じ原因で同時に止まる場所にあれば冗長にならない。
  2. 置き場所を分散すればよいとも限らず、データを置いてよい地域の制約がある。
  3. 「どれくらい止まってよいか」を数字で決めないと、冗長化にいくら使うべきか判断できない。

この授業では、置き場所の単位(リージョンとゾーン)と、可用性の計算方法を学びます。

直感的な説明:同じ町の別の建物、別の町

可用性の直感は「どれだけの時間、使える状態か」です。

正確な定義:リージョン・ゾーン・可用性の計算

$$A = \frac{T - D}{T}$$

ここで $T$ は期間の長さ(分)、$D$ は停止時間(分)です。逆に、可用性 $A$ のとき許される停止時間は $D = (1-A)\,T$ です。30日は $T = 30 \times 24 \times 60 = 43{,}200$ 分なので、$A=0.999$(99.9%)なら $D = 0.001 \times 43{,}200 = 43.2$ 分です。

$$A_{\text{直列}} = a_1 \times a_2 \times \cdots \times a_n$$

$$A_{\text{並列}} = 1 - (1-a_1)(1-a_2)\cdots(1-a_m)$$

段階付き例題:APIとDBの構成の可用性を比べる

問題:予測APIは「APIサーバー → DB」の直列構成。各部品の可用性を99.9%と仮定する(教材用の仮定)。(1) 現状、(2) APIサーバーを別ゾーンに2台にした場合の、全体の可用性と30日の停止許容時間を求める。

ステップ1:現状は直列。

$$A = 0.999 \times 0.999 = 0.998001$$

停止許容時間は $(1-0.998001) \times 43{,}200 \approx 86.4$ 分。部品1つなら43.2分だったのが、つなぐだけで約2倍に増えました。

ステップ2:APIサーバーを2台の並列にする。

$$A_{\text{API}} = 1 - (1-0.999)^2 = 1 - 0.000001 = 0.999999$$

ステップ3:全体を直列で合成する。

$$A = 0.999999 \times 0.999 \approx 0.998999$$

停止許容時間は約43.2分。APIを冗長化しても、DBが単独のままなので、全体はDBの可用性でほぼ決まることがわかります。

ステップ4:解釈する。

構成 全体の可用性 30日の停止許容
API 1台 → DB 1台 99.80% 約86.4分
API 2台(別ゾーン)→ DB 1台 約99.90% 約43.2分
API 2台 → DB 2台(別ゾーンに待機系) 約99.9998% 約0.09分

最後の行は $0.999999 \times 0.999999$ です。ただし、この数字は「停止が独立」「切替が一瞬で成功する」という理想の仮定の上の値です。実際には切替に時間がかかり、設定ミスや共通のソフトウェアの不具合で同時に止まることもあるため、これほど高くはなりません。計算は「どこが弱いか」を見つける道具として使い、結果をそのまま約束しないことが大切です。

操作して理解する:部品を足し、冗長化して変化を見る

次のコードで、直列と並列の可用性を計算します。parts の値を変えたり、台数 m を変えたりして、停止許容時間の変化を予想してから実行してください。

def series(avails):
    # 直列: すべてが動く確率(独立を仮定)
    p = 1.0
    for a in avails:
        p *= a
    return p

def parallel(avails):
    # 並列: 全部が同時に止まる確率を1から引く(独立を仮定)
    q = 1.0
    for a in avails:
        q *= (1 - a)
    return 1 - q

T = 30 * 24 * 60   # 30日(分)
api, db = 0.999, 0.999
for m in [1, 2, 3]:
    A = series([parallel([api] * m), db])
    print(f"API {m}台 + DB 1台: 可用性 {A*100:.4f}%  停止許容 {(1-A)*T:.1f} 分/30日")

A = series([parallel([api] * 2), parallel([db] * 2)])
print(f"API 2台 + DB 2台: 可用性 {A*100:.4f}%  停止許容 {(1-A)*T:.2f} 分/30日")

出力:

API 1台 + DB 1台: 可用性 99.8001%  停止許容 86.4 分/30日
API 2台 + DB 1台: 可用性 99.8999%  停止許容 43.2 分/30日
API 3台 + DB 1台: 可用性 99.9000%  停止許容 43.2 分/30日
API 2台 + DB 2台: 可用性 99.9998%  停止許容 0.09 分/30日

読み取れること:

発展:独立性が崩れる場面と、複製・バックアップの違い

並列の式は「同時に止まらない(独立)」ことを前提にしています。次の場合、この前提が崩れます。

場面 何が共有されているか 対策の例
2台を同じゾーンに置いた 建物の電源・ネットワーク 別ゾーンに分ける
2台に同じ不具合のある更新を同時に配布した ソフトウェアの版 少しずつ順番に更新する(「切替・カナリア・シャドー」(有料版))
2台が同じDBや同じ認証の仕組みに依存している 依存先 依存先も冗長化し、止まったときの代替動作を決める
設定の誤りで両方を同時に変更した 運用作業 変更の手順化・レビュー

複製とバックアップは別物です。複製(レプリケーション)はデータを別ゾーンや別リージョンにほぼ同時にコピーするため、故障には強い一方、誤って削除した操作も複製先にすぐ伝わります。誤操作やデータ破損からの復旧には、過去の時点に戻せるバックアップが別に必要です。どの時点まで戻せればよいか(RPO:Recovery Point Objective)、何時間で復旧すべきか(RTO:Recovery Time Objective)の設計は 「バックアップと復元」(有料版)、「RTO・RPOと障害域」(有料版) で扱います。

別リージョンへの複製は、データの保管場所の制約に注意します。個人データの越境移転には法令や契約上の条件があり得るため、社内の法務・情報セキュリティ担当の確認を経て決めます(法令の内容は変わり得るため、最新の公式情報で確認)。

よくある失敗

失敗1:同じゾーンに2台置いて「冗長化済み」とする

誤った見積もり:同じゾーンにAPIサーバー2台を置き、並列の式で 99.9999% と報告した。

a = 0.999
print("独立を仮定した値:", 1 - (1 - a) ** 2)
# ゾーン障害(例:可用性99.95%と仮定)は2台に共通にかかる
zone = 0.9995
print("共通原因を考慮:", zone * (1 - (1 - a) ** 2))

出力は 独立を仮定した値: 0.999999、共通原因を考慮: 0.999499...(約99.95%) です。

なぜ誤りか:2台が同じ電源・ネットワークを共有しているため、ゾーン障害では同時に止まります。共通の原因は直列の部品として掛け算に入れる必要があります。

直し方:冗長化する部品は別ゾーンに置き、構成図に「どのゾーンに何があるか」を明記する。見積もりには共通原因(ゾーン、依存先、認証基盤)を直列の部品として含める。

失敗2:直列の可用性を足し算や最小値で見積もる

誤った計算:「APIが99.9%、DBが99.9%、認証が99.9%なので、全体も99.9%」とした。

parts = [0.999, 0.999, 0.999]
p = 1.0
for a in parts:
    p *= a
print("誤り(最小値):", min(parts))
print("正しい(積):", round(p, 6), "停止許容:", round((1 - p) * 43200, 1), "分/30日")

出力:誤り(最小値): 0.999、正しい(積): 0.997003 停止許容: 129.5 分/30日。

なぜ誤りか:直列では、どれか1つが止まれば全体が止まります。部品が増えるほど、どれかが止まる機会が増えるので、全体の可用性はどの部品よりも低くなります。

直し方:直列は積で計算する。部品が多いほど下がることを前提に、依存する部品を減らすか、弱い部品を冗長化する。

失敗3:複製があるからバックアップは不要と判断する

誤った判断:DBを別ゾーンに複製しているので、バックアップを取らなかった。ある日、担当者が誤って DELETE FROM orders;(条件なしの全行削除)を実行し、複製先からも同時に全行が消えた。

なぜ誤りか:複製は「今のデータ」を別の場所に保つ仕組みで、削除や破損も忠実にコピーします。故障(機械が壊れる)と誤操作(人が消す)は、別の対策が必要な別のリスクです。

直し方:

リスク 対策
機器・ゾーンの故障 別ゾーンへの複製、冗長化
誤操作・データ破損・不正な削除 過去の時点に戻せるバックアップ(復元の練習も含む)
リージョン全体の障害 別リージョンへのバックアップ(保管場所の制約を確認したうえで)

まとめ

用語

リージョン(region)

提供者がデータセンター群を置く地理的な地域。

アベイラビリティゾーン(availability zone)

リージョン内の、電源・冷却・ネットワークが独立した施設群。

可用性(availability)

ある期間のうち、サービスが使える状態だった時間の割合。

冗長化(redundancy)

同じ役割の部品を複数用意し、1つが止まっても役割を果たせるようにすること。

SLA(サービス水準の合意)(Service Level Agreement)

提供者と利用者の間で合意するサービス水準と、下回った場合の取り決め。

データレジデンシー(data residency)

データを保管してよい国・地域に関する、契約・法令・規程上の制約。

よくある質問

なぜ可用性を「%」ではなく「分」に直すのですか?

99.9%と99.99%は数字の差が小さく見えますが、30日では43.2分と4.32分で10倍違います。業務への影響(その時間に何件の注文を失うか)を議論するには、時間に直したほうが伝わります。

リージョンとゾーンの違いがまだあいまいです。

リージョンは地理的な地域(町)、ゾーンはその地域内の独立した施設群(町の中の別の建物)です。ゾーンを分けると近距離のまま設備の障害に備えられ、リージョンを分けると地域全体の障害に備えられますが、遅延・費用・保管場所の制約が増えます。

計算した可用性と実際の稼働率がずれるのはなぜですか?

計算は独立・瞬時の切替・部品の可用性が正確、という仮定の上にあります。実際には共通原因の障害、切替の失敗、計画メンテナンス、設定ミス、依存している外部サービスの停止があります。計算は弱い箇所を見つける道具として使い、実績はログ(責任共有とログ)や監視(「SLOとユーザー影響」(有料版))で測ります。

提供者のSLAが99.99%なら、自分のシステムも99.99%になりますか?

なりません。SLAはその1つのサービスについての合意で、自分のシステムはそれと他の部品の直列です。また、SLAは一般に停止時の返金などの取り決めで、停止しない保証ではありません。条件や値は公式情報で確認します。

仕事ではどこまで冗長化すべきか、どう判断しますか?

「止まると1時間あたりいくら・何件の損失か」と「冗長化の追加費用」を比べます。社内向けの月次レポートなら数時間の停止を許容して単純な構成に、注文や決済に関わるAPIなら別ゾーンの冗長化とバックアップを必須に、というように用途で分けます。

確認問題

問1 可用性99.95%のサービスの、30日(43,200分)あたりの停止許容時間はどれか。

  1. ① 約2.16分
  2. ② 約21.6分
  3. ③ 約43.2分
  4. ④ 約216分
解答と解説

正解:②

停止許容は (1 − 0.9995) × 43,200 = 0.0005 × 43,200 = 21.6分です。

問2 可用性99%の部品2つを直列につないだ全体の可用性(独立を仮定)はどれか。

  1. ① 99.99%
  2. ② 99%
  3. ③ 98.01%
  4. ④ 198%
解答と解説

正解:③

直列は積なので 0.99 × 0.99 = 0.9801(98.01%)です。

問3 APIサーバー2台を同じアベイラビリティゾーンに置いた構成について、最も適切な説明はどれか。

  1. ① 2台あるので、並列の式どおりの高い可用性が得られる
  2. ② ゾーン障害では2台が同時に止まるため、独立の仮定が成り立たず、並列の式は可用性を過大に見積もる
  3. ③ 同じゾーンの方が通信が速いので、可用性も高くなる
  4. ④ クラウドでは自動的に別ゾーンに分散されるので気にしなくてよい
解答と解説

正解:②

共通の原因(ゾーンの電源・ネットワーク)を共有する部品は同時に止まるため、冗長化の効果は限定的です。

問4 顧客の個人データを、国内保管を約束した契約のもとで扱っている。障害対策としてデータを複製する先の選び方で最も適切なのはどれか。

  1. ① 最も安い海外リージョンを選ぶ
  2. ② 契約・規程で認められた地域の中で、別のゾーンや別のリージョンを選び、法務などの確認を経る
  3. ③ 地域は関係ないので、遅延が最小の場所を選ぶ
  4. ④ 複製はせず、障害時は諦める
解答と解説

正解:②

リージョン選びでは、可用性や費用だけでなく、データの保管場所の制約(契約・法令・規程)を満たすことが前提条件です。

問5 DBを別ゾーンにリアルタイムで複製している。それでもバックアップが必要な理由として正しいものはどれか。

  1. ① 複製は遅いので
  2. ② 誤って削除した操作も複製先にすぐ伝わるため、過去の時点に戻す手段が別に必要だから
  3. ③ 複製は可用性を下げるから
  4. ④ バックアップは不要で、複製だけで十分
解答と解説

正解:②

複製は故障に強いが、誤操作やデータ破損も伝播させます。過去の時点への復元にはバックアップが要ります。

問6 直列構成「API(99.99%)→DB(99.5%)→外部決済API(99.9%)」で、全体の可用性を上げるために最初に検討すべきなのはどれか。

  1. ① APIサーバーを3台に増やす
  2. ② 最も可用性の低いDBの冗長化
  3. ③ 外部決済APIを2回呼ぶ
  4. ④ 何もしなくても全体は99.99%である
解答と解説

正解:②

直列では最も弱い部品が全体をほぼ決めます。ここではDB(99.5%)です。

次に学ぶこと

次は IAMと最小権限 で、「誰がどの資源に何をしてよいか」を決めるIAMと最小権限を、ポリシーの実例と模擬の評価で学びます。

バックアップと復元、RTO・RPOの設計は 「バックアップと復元」(有料版)、「RTO・RPOと障害域」(有料版) で深めます。サービス水準を利用者への影響で定める方法は 「SLOとユーザー影響」(有料版) で扱います。

キャリア学習:データサイエンティスト・機械学習エンジニア・DX推進・研究者を目指す人の学習アプリ。164モジュール・984授業を、ブラウザで動くSQLとPythonの演習で。基礎と各分野の最初のモジュールは無料。全部は2,980円の買い切り。

アプリを無料で開く有料版と無料版の違い