8
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

TerraformとAnsibleはどう使い分ける?現場でのベストプラクティス

8
Posted at


結論から言います

TerraformとAnsibleは競合ではなく、役割が違います。

ツール 役割
Terraform インフラを作る
Ansible 中身を整える

この使い分けが腹落ちするだけで、IaCの運用は一気に楽になります。


それぞれの役割をシンプルに整理する

Terraform:インフラの「設計図」

Terraformはクラウドリソースの作成・管理に特化しています。

  • AWS / GCP / Azure のリソース作成
  • VPC・サブネット・セキュリティグループなどネットワーク周り
  • EC2・VM・Load Balancer などのコンピューティングリソース
  • State(状態管理) により、「あるべき姿」を宣言的に保てる
resource "aws_instance" "web" {
  ami           = "ami-0abcdef1234567890"
  instance_type = "t3.micro"

  tags = {
    Name = "web-server"
  }
}

Terraformの強みは「作って終わり」ではなく、状態を追跡して差分管理できること。


Ansible:インフラの「中身」

Ansibleはサーバーの設定・構成管理に特化しています。

  • OS設定(ユーザー・タイムゾーン・カーネルパラメータ)
  • ミドルウェアのインストール・設定(nginx、docker、postgresql など)
  • 冪等性(idempotent) ── 何度実行しても同じ結果になる
- name: nginxをインストールして起動する
  hosts: web
  become: yes
  tasks:
    - name: nginx インストール
      ansible.builtin.dnf:
        name: nginx
        state: present

    - name: nginx 起動・自動起動設定
      ansible.builtin.service:
        name: nginx
        state: started
        enabled: yes

Ansibleの強みは「何度実行しても安全」な構成管理ができること。


よくある構成:2つを組み合わせるとこうなる

Terraformがサーバーを「生やし」、Ansibleがサーバーを「育てる」イメージです。


実務での使いどころ:3つのパターン

パターン①:Webサーバー構築

ALBからEC2へのヘルスチェックが通るまでの流れを、それぞれのツールで責務分離できます。


パターン②:Kubernetesノード管理

EKSのマネージドノードでも、OSレベルの設定が必要な場面は現場では普通にあります。


パターン③:セキュリティ観点での使い分け(ここが現場の本質)

Terraformだけで完結しようとすると問題が起きます。

# よく見るアンチパターン
resource "aws_instance" "web" {
  ...
  user_data = <<-EOF
    #!/bin/bash
    yum install -y nginx
    sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
    ...
  EOF
}

このアプローチの問題点:

  • user_data は初回起動時の一度限り。再実行できない
  • シェルスクリプトは冪等性を保証しない
  • 設定のばらつきが発生しやすい(手作業で直したサーバーがある、など)
  • 監査のとき「このサーバー、本当にこの設定になってる?」が追えない

Ansibleで構成管理することで:

  • 設定をコードとして再現・検証できる
  • ansible --check(ドライラン)で差分を事前確認できる
  • 監査ログとして「いつ・誰が・何を変えたか」がPlaybookのgit履歴に残る

やりがちなミス3選

❌ ミス①:Terraformでミドルウェアまでやろうとする

user_data にnginxのインストールからアプリのデプロイまで全部書く構成、あるあるです。
最初は動くんですが、変更・再現・監査が一切できないシェルスクリプト地獄になります。


❌ ミス②:Ansibleでクラウドリソースを管理する

AnsibleにもAWSモジュールがあるので「Ansibleだけで全部できるじゃん」となる人がいます。
状態管理がないAnsibleでインフラを作ると、「今どういう状態か」が追えなくなります。


❌ ミス③:役割を混ぜて「どっちに書くか」で悩む

EC2のタグはTerraform?Ansible?
セキュリティグループのルールはTerraform?Ansible?

境界が曖昧になると、チームで「どっちに書くか」の議論が毎回発生します。
「リソースの作成・存在管理 → Terraform、OS以上の設定 → Ansible」 と決めておくだけで一気に楽になります。


実務のコツ:短く、強く

✅ Terraformはシンプルに保つ
   → リソース定義だけ。設定は書かない

✅ Ansibleに構成管理の責務を寄せる
   → 変更・監査・再現はすべてPlaybookで

✅ 役割を混ぜない
   → 「どこに書くか」をチームで先に決める

まとめ

Terraformは「作る」
Ansibleは「整える」

この役割分担を守るだけで、IaCの運用は驚くほど安定します。

よくある失敗は「どちらか一方で全部やろうとすること」です。
それぞれが得意な領域に集中させる──これが現場で長く運用できるIaC構成の本質です。


参考リンク


この記事が参考になったら、いいね・ストックしてもらえると励みになります。
質問・ご意見はコメントまでどうぞ。

8
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?