0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

AnsibleとCloudFormationとTerraformを比べてみた

Last updated at Posted at 2025-08-12

IaCに興味が出てきて「よく聞くAnsibleとTerraform、CloudFormationのそれぞれの個性を知りたいなあ」と思い調べた結果、自分なりの解釈をまとめてみました。

比較

ツール 言語 用途
Ansible YAML(Playbook形式) OS設定などのサーバー構成の自動化
CloudFormation YAML AWSリソースの構築・管理
Terraform HCL マルチクラウド対応のインフラの構築・管理

:raising_hand:サーバーの中身をIaCでカスタムしたい!
:boy:AWS環境でリソースを作ったり管理したい!
:woman_tone2:AWSでもAzureでもGCPでもオンプレでもインフラを管理したい!

やりたいことによって使うべきIaCツールが異なるため、自分に合ったものを選ぶ必要があります。

それぞれの特色

まずは、同じYAMLを使っているAnsibleとCloudFormtionから、それぞれの特色を見ていきましょう。

同じYAMLでも全然違う

AnsibleとCloudFormtionは同じYAMLという書き方を使っていますが、同じYAMLファイルを使って同じものをデプロイすることはできません。

そもそもYAMLとは?

YAMLとは、書き方の一種。
「こういう決まり事で書いてますよ~」というだけなので、日本語でいうと「縦書きで書きますよ~」「段落の最初は1文字あけますよ~」という決まりごと。

Ansibleで使われるPlaybook形式とCloudFormtionで使われるテンプレート形式、違いを見ていきます。

Ansibleは料理人🍳

最初に、Ansibleとは、Playbook形式のYAMLを実行するツールです。
そのAnsibleを動かすために必要なのが、Playbook形式のYAMLです。

Playbook形式のYAMLを見ていきましょう📝
私のイメージは、上から処理をなぞる手順書=レシピです。
カレーを作るAnsibleのレシピはきっとこんな感じ

Ansibleでカレーを作る
- name: カレーを作る
  tasks:
    - name: 玉ねぎを切る
      action: cut
    - name: 炒める
      action: fry
    - name: ルーを入れる
      action: add

私たちは料理をするときに、「炒める」と指示されたら『フライパンを出して、火にかけて、そこに具材を投入する』という当たり前の部分は、レシピで説明されなくても自分で考えて行動できます。

Ansibleは最低限の「やることリスト」をレシピとして与えることで、ある程度補完してやってくれるイメージです。さすが料理人:fork_and_knife:

もちろん、Ansibleでカレーは作れないので、Webサーバーを作ってもらうことにします。
Apacheをインストールするときのコードはこんな感じ。

- name: Install Apache
  hosts: webservers
  become: yes
  tasks:
    - name: Install httpd
      yum:
        name: httpd
        state: present
    - name: Start service
      service:
        name: httpd
        state: started

yumでhttpdをインストールされた状態にした後
serviceをスタートした状態にしておいてね
という指示をすると、その通りに上からなぞって作業をしてくれます。
httpdがすでにインストールされていたら①は飛ばしてくれます。

これが Playbook形式のYAML(レシピ) を使って、指定の環境(料理) を作ってくれる Ansible(料理人) です。

CloudFormationは建築職人:hammer_pick:

CloudFormtionは、AWS環境において、IaCでリソースを構築するサービスです。
CloudFormtionに指示を出すのがこれまたYAML。(またはJSON)
しかし、Ansibleと違ってPlaybook形式ではなくテンプレート形式なので、書き方も少し違います。
(Playbook形式に対するものとして、便宜上テンプレート形式と呼ばせてください)

CloudFormtionのテンプレートとなるYAMLを見てみましょう📝
イメージは「建物の設計図」です。
「これを作ってね!」という具体的な数値を含めた完成図を与えることで、必要なものを手配して設置してくれる職人みたいな感じ。

CloudFormtionで、公園にいい感じで遊具を置いてもらいましょう:fountain:

CloudFormationで公園に遊具を置く
Resources:
  Slide:
    Type: Park::PlayEquipment::滑り台
    Properties:
      Height: 3m
      Color: 黄色

  Swing:
    Type: Park::PlayEquipment::ブランコ
    Properties:
      Seats: 2
      ChainLength: 2m

  Sandbox:
    Type: Park::PlayArea::砂場
    Properties:
      Size: 中くらい
      Cover: あり

CloudFormtionは指定通りの滑り台やブランコや砂場のカバーを見つけて(時にはカスタマイズして作って)、理想の公園をデプロイしてくれます。
「まずは青の滑り台を仕入れて、次に黄色のペンキで塗り替えて…」という「やることリスト」の提示は必要ないのがCloudFormtionのYAMLテンプレートです。

では、CloudFormtionに公園ではなく、EC2インスタンスとS3バケットを作ってもらいましょう。

Resources:
  ec2_instance-hogehoge:
    Type: AWS::EC2::Instance
    Properties:
      InstanceType: t2.micro
      ImageId: ami-xxxxxxxxxxxx
      KeyName: <keypair>
      Tags:
        - Key: Name
          Value: InstanceDisplayName

  s3_bucket-hogehoge:
    Type: AWS::S3::Bucket
    Properties:
      BucketName: hogehoge-bucket

EC2:InstanceDisplayName(t2.micro)
S3:hogehoge-bucket
これらのリソースが作られます。

YAMLテンプレート(設計図) を使って、指定のリソース(建物) を作ってくれる CloudFormation(建築職人) です。

Terraformは…賢いお手伝いロボ:robot:

まず、TerraformはYAMLではなくHCLという言語で書かれます。
HCLもYAMLのテンプレート形式と同じく、Terraformに渡す設計図です。

Terraformの特徴は指定したステータスですでに存在するものは、新たに作成したり修正したりしないこと。

CloudFormtionは設計書に書かれたものは必ず作る! がモットーなので、公園にすでに黄色い滑り台が設置されていても、設計図に書いてある限り、もう一台黄色い滑り台を置こうとします。

その点、Terraformは
:robot:…o0(すでに1台黄色い滑り台があるから、これは新たに作らなくていいな)
と判断してくれるわけです。

では、Terraformくんに部屋の片づけをお願いしてみます。

Terraformに部屋を片付けてもらう
resource "room_item" "机" {
  name     = "ダイニングテーブル"
  location = "部屋の中央"
  status   = "整頓"
}

resource "room_item" "椅子" {
  name     = "長椅子"
  location = "机の隣"
  status   = "まっすぐ"
}

resource "room_item" "ランプ" {
  name     = "アンティークランプ"
  location = "机の上"
  status   = "電源オン"
}

ダイニングテーブルが部屋の隅に移動されていて汚かったら、Terraformくんは中央に戻し、きれいに整頓してくれます。
ではアンティークランプは電源オンの状態で置かれていたら?
Terraformくんは「電源オンにしてねという指示通りだから、これはそのままにしておこう」と、渡された設計図に合うように状況を判断して処理をしてくれます。

では、Terraformにお片付けではなく、AWS上にEC2インスタンスとS3バケットを作ってもらいたいと思います。

provider "aws" {
  region = "ap-northeast-1"
}

resource "aws_instance" "ec2_instance-hogehoge" {
  ami           = "ami-xxxxxxxxxxxx"
  instance_type = "t2.micro"
  key_name      = "<keypair>"

  tags = {
    Name = "InstanceDisplayName"
  }
}

resource "aws_s3_bucket" "s3_bucket-hogehoge" {
  bucket = "hogehoge-bucket"

  tags = {
    Name = "hogehoge-bucket"
  }
}

CloudFormtionのテンプレートと同じ以下のリソースが作られます。
EC2:InstanceDisplayName(t2.micro)
S3:hogehoge-bucket

"ec2_instance-hogehoge"や"s3_bucket-hogehoge"は、Terraform内でのリソースの識別子。

HCL(設計図) を使って、現場の状況を見比べながら、必要な分だけ指定のリソース(建物や状況) を作ってくれる Terraform(お手伝いロボ) です。

まとめ

ツール 言語 役職 特徴
Ansible YAML(Playbook形式) 料理人🍳 「やることリスト」を順番に処理する。必要ない処理は飛ばす
CloudFormation YAML(テンプレート形式) 建築職人:hammer_pick: 設計図にあるものを完璧に作る
Terraform HCL お手伝いロボ:robot: 設計図と現場を見比べて必要なものだけ作る

果たしてわかりやすくなったのか…疑問ではありますが。。。
簡単なイメージだけでも、それぞれの違いがあるよということだけが伝われば。

0
0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?