冪等性 べきとうせい
簡単に言うとこんな感じ!
「何回やっても結果が同じ」ってこと!たとえばエレベーターのボタン、何度押しても1回押したのと同じ結果(その階に来る)でしょ?それが冪等性だよ。インフラの設定作業でも「何回実行しても壊れない」ようにしておくのが大事なんだ!
冪等性とは
冪等性(べきとうせい/Idempotency)とは、「同じ操作を何度繰り返しても、結果が常に同じになる」という性質のことです。数学用語が由来で、もともとは「ある演算を繰り返し適用しても値が変わらない」という概念を指します。たとえば「1を何回掛けても結果は変わらない(1×1×1=1)」というのが数学的な冪等性です。
ITの世界、とくにIaC(Infrastructure as Code:インフラをコードで管理する手法)やAPI設計の文脈では、「同じコードや命令を何度実行しても、システムが意図した状態に収束し、余計な副作用が起きない」という意味で使われます。インフラ構築を自動化するとき、作業ミスやシステム障害で途中から再実行する場面は珍しくありません。そのときに「2回実行したらサーバーが2台増えた!」という事態を防いでくれるのが冪等性という考え方です。
冪等性が保証されていると、「とりあえずもう一度実行すれば正しい状態になる」という安心感がチームに生まれます。自動化・CI/CDパイプライン・障害復旧など、現代のシステム運用には欠かせない概念です。
冪等性の仕組みと具体例
冪等性あり/なしの比較
| 操作の例 | 冪等性あり | 冪等性なし |
|---|---|---|
| ユーザー作成スクリプト | 「もし存在しなければ作る」 → 何度実行しても1人 | 「作れ」→ 毎回増える |
| ファイル書き込み | 上書き(同じ内容で書き直す) | 追記(実行するたびに内容が増える) |
| HTTPメソッド | GET PUT DELETE | POST(毎回新しいリソースが生まれる) |
| Terraform apply | 差分だけ変更。変化なしなら何もしない | 毎回リソースを再作成 |
代表的なIaCツールと冪等性
| ツール | 冪等性の実現方法 |
|---|---|
| Terraform | 現在の状態(stateファイル)と目標状態を比較し、差分だけ適用 |
| Ansible | タスクごとに「already done」を判定して再適用をスキップ |
| Chef / Puppet | 定期的に「あるべき姿」と現状を比較し自動修正(コンバージェンス) |
| AWS CloudFormation | スタックの差分を検出してパッチ適用 |
覚え方
「べき」に「等」しい → 何べき(何回)やっても等しい(同じ)結果!
「冪(べき)」は「乗算を繰り返す」意味。「等性」は「等しい性質」。合わせて「繰り返しても等しい」と覚えると完璧です。
歴史と背景
- 1970年代 — 数学・関数型プログラミングの世界で冪等性の概念が整理される
- 2000年代初頭 — REST API設計の文脈で
GET・PUT・DELETEが冪等であるべきという原則が広まる(Roy Fieldingの論文が起点) - 2009年頃 — Chef・Puppet などの構成管理ツールが登場。「インフラをコードで宣言し、何度実行しても同じ状態を保証する」思想が普及
- 2014年頃 — Terraform登場。「宣言的インフラ記述+冪等な適用」がIaCの主流スタイルになる
- 2020年代 — GitOps・CI/CDパイプラインの普及に伴い、冪等性は「自動化の信頼性の基礎」として当たり前の要件に
宣言的アプローチと命令的アプローチの違い
冪等性を実現するうえでカギになるのが「宣言的(Declarative)」な記述です。
命令的な書き方は「レシピを手順どおりに実行する料理人」、宣言的な書き方は「完成形の写真を渡して、あとはシェフに任せる」イメージです。IaCでは後者のアプローチが冪等性を自然に実現します。
実務でのポイント
# 冪等性がない例(Bashスクリプト)
useradd deploy-user # 2回目はエラー: ユーザーが既に存在する
echo "PATH=..." >> ~/.bashrc # 2回目は同じ行が追加される
# 冪等性がある例(Ansible風)
- name: deployユーザーが存在すること
user:
name: deploy-user
state: present # ← 「存在すること」を宣言。既にいれば何もしない
- name: .bashrcにPATHが含まれること
lineinfile:
path: ~/.bashrc
line: 'export PATH=...'
state: present # ← 既にあれば追加しない
関連する規格・RFC
| 規格・RFC番号 | 内容 |
|---|---|
| RFC 7231 | HTTPメソッドのセマンティクス(GET・PUT・DELETEが冪等であることを定義) |
| RFC 5789 | HTTP PATCHメソッド(冪等でない部分更新として定義) |