IaC

冪等性 べきとうせい

IaCInfrastructure as CodeTerraformAnsible自動化再実行
冪等性について教えて

簡単に言うとこんな感じ!

「何回やっても結果が同じ」ってこと!たとえばエレベーターのボタン、何度押しても1回押したのと同じ結果(その階に来る)でしょ?それが冪等性だよ。インフラの設定作業でも「何回実行しても壊れない」ようにしておくのが大事なんだ!


冪等性とは

冪等性(べきとうせい/Idempotency)とは、「同じ操作を何度繰り返しても、結果が常に同じになる」という性質のことです。数学用語が由来で、もともとは「ある演算を繰り返し適用しても値が変わらない」という概念を指します。たとえば「1を何回掛けても結果は変わらない(1×1×1=1)」というのが数学的な冪等性です。

ITの世界、とくにIaC(Infrastructure as Code:インフラをコードで管理する手法)API設計の文脈では、「同じコードや命令を何度実行しても、システムが意図した状態に収束し、余計な副作用が起きない」という意味で使われます。インフラ構築を自動化するとき、作業ミスやシステム障害で途中から再実行する場面は珍しくありません。そのときに「2回実行したらサーバーが2台増えた!」という事態を防いでくれるのが冪等性という考え方です。

冪等性が保証されていると、「とりあえずもう一度実行すれば正しい状態になる」という安心感がチームに生まれます。自動化・CI/CDパイプライン・障害復旧など、現代のシステム運用には欠かせない概念です。


冪等性の仕組みと具体例

冪等性あり/なしの比較

操作の例冪等性あり冪等性なし
ユーザー作成スクリプト「もし存在しなければ作る」 → 何度実行しても1人「作れ」→ 毎回増える
ファイル書き込み上書き(同じ内容で書き直す)追記(実行するたびに内容が増える)
HTTPメソッドGET PUT DELETEPOST(毎回新しいリソースが生まれる)
Terraform apply差分だけ変更。変化なしなら何もしない毎回リソースを再作成

代表的なIaCツールと冪等性

ツール冪等性の実現方法
Terraform現在の状態(stateファイル)と目標状態を比較し、差分だけ適用
Ansibleタスクごとに「already done」を判定して再適用をスキップ
Chef / Puppet定期的に「あるべき姿」と現状を比較し自動修正(コンバージェンス)
AWS CloudFormationスタックの差分を検出してパッチ適用

覚え方

「べき」に「等」しい → 何べき(何回)やっても等しい(同じ)結果!

「冪(べき)」は「乗算を繰り返す」意味。「等性」は「等しい性質」。合わせて「繰り返しても等しい」と覚えると完璧です。


歴史と背景

  • 1970年代 — 数学・関数型プログラミングの世界で冪等性の概念が整理される
  • 2000年代初頭REST API設計の文脈でGETPUTDELETEが冪等であるべきという原則が広まる(Roy Fieldingの論文が起点)
  • 2009年頃 — Chef・Puppet などの構成管理ツールが登場。「インフラをコードで宣言し、何度実行しても同じ状態を保証する」思想が普及
  • 2014年頃 — Terraform登場。「宣言的インフラ記述+冪等な適用」がIaCの主流スタイルになる
  • 2020年代GitOps・CI/CDパイプラインの普及に伴い、冪等性は「自動化の信頼性の基礎」として当たり前の要件に

宣言的アプローチと命令的アプローチの違い

冪等性を実現するうえでカギになるのが「宣言的(Declarative)」な記述です。

命令的(Imperative) 「手順」を書く ① サーバーを起動せよ → 既に起動中でも再起動する ② ユーザーを作成せよ → 重複してエラーになる ③ ファイルを追記せよ → 2回目は2行になる ❌ 冪等性なし 宣言的(Declarative) 「あるべき姿」を書く サーバーは起動状態であること → 既に起動中なら何もしない ユーザーAは存在すること → 既にいれば何もしない ファイルの内容はXXXであること → 同じなら何もしない ✅ 冪等性あり

命令的な書き方は「レシピを手順どおりに実行する料理人」、宣言的な書き方は「完成形の写真を渡して、あとはシェフに任せる」イメージです。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 7231HTTPメソッドのセマンティクス(GET・PUT・DELETEが冪等であることを定義)
RFC 5789HTTP PATCHメソッド(冪等でない部分更新として定義)

関連用語

  • IaC(Infrastructure as Code) — インフラをコードとして管理する手法。冪等性はIaCの根幹となる性質
  • Terraform — 冪等な宣言的インフラ管理ツールの代表格
  • Ansible — 冪等なタスク実行を特徴とする構成管理・自動化ツール
  • CI/CD — 継続的インテグレーション/デリバリー。冪等性があると自動パイプラインが安全に繰り返せる
  • 宣言的設定 — 「あるべき姿」を記述するアプローチ。冪等性の実現手段
  • REST API — 冪等なHTTPメソッド設計が推奨されるAPI設計スタイル