IaCに興味が出てきて「よく聞くAnsibleとTerraform、CloudFormationのそれぞれの個性を知りたいなあ」と思い調べた結果、自分なりの解釈をまとめてみました。
比較
ツール | 言語 | 用途 |
---|---|---|
Ansible | YAML(Playbook形式) | OS設定などのサーバー構成の自動化 |
CloudFormation | YAML | AWSリソースの構築・管理 |
Terraform | HCL | マルチクラウド対応のインフラの構築・管理 |
サーバーの中身をIaCでカスタムしたい!
AWS環境でリソースを作ったり管理したい!
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のレシピはきっとこんな感じ
- name: カレーを作る
tasks:
- name: 玉ねぎを切る
action: cut
- name: 炒める
action: fry
- name: ルーを入れる
action: add
私たちは料理をするときに、「炒める」と指示されたら『フライパンを出して、火にかけて、そこに具材を投入する』という当たり前の部分は、レシピで説明されなくても自分で考えて行動できます。
Ansibleは最低限の「やることリスト」をレシピとして与えることで、ある程度補完してやってくれるイメージです。さすが料理人
もちろん、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は建築職人
CloudFormtionは、AWS環境において、IaCでリソースを構築するサービス
です。
CloudFormtionに指示を出すのがこれまたYAML
。(またはJSON)
しかし、Ansibleと違ってPlaybook形式ではなくテンプレート形式なので、書き方も少し違います。
(Playbook形式に対するものとして、便宜上テンプレート形式と呼ばせてください)
CloudFormtionのテンプレートとなるYAMLを見てみましょう📝
イメージは「建物の設計図」です。
「これを作ってね!」という具体的な数値を含めた完成図を与えることで、必要なものを手配して設置してくれる職人みたいな感じ。
CloudFormtionで、公園にいい感じで遊具を置いてもらいましょう
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は…賢いお手伝いロボ
まず、TerraformはYAMLではなくHCLという言語で書かれます。
HCLもYAMLのテンプレート形式と同じく、Terraformに渡す設計図
です。
Terraformの特徴は指定したステータスですでに存在するものは、新たに作成したり修正したりしないこと。
CloudFormtionは設計書に書かれたものは必ず作る! がモットーなので、公園にすでに黄色い滑り台が設置されていても、設計図に書いてある限り、もう一台黄色い滑り台を置こうとします。
その点、Terraformは
…o0(すでに1台黄色い滑り台があるから、これは新たに作らなくていいな)
と判断してくれるわけです。
では、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(テンプレート形式) | 建築職人![]() |
設計図にあるものを完璧に作る |
Terraform | HCL | お手伝いロボ![]() |
設計図と現場を見比べて必要なものだけ作る |
果たしてわかりやすくなったのか…疑問ではありますが。。。
簡単なイメージだけでも、それぞれの違いがあるよということだけが伝われば。