IaCツール Terraformを学ぶ:JSON vs YAML vs HCL(コードの比較)
はじめに
IaCとはInfrastructure as Codeの略で、コードでインフラ環境の構成や管理を自動化する手法です。
IaCツールの代表例として、AWS CloudFormationがあります。
AWSのリソースしか使わない場合はAWS CloudFormationで十分だと思いますが、AzureやGoogle Cloudと連携させる場合は、Terraformを使うという選択肢もあります。
本記事では、AWS CloudFormationで読み込ませるテンプレートの形式であるJSONやYAMLと、Terraformの形式であるHCLを比較したいと思います。
JSON vs YAML vs HCL
ここではEC2インスタンスの設定をする記述を行い、JSON, YAML, HCLの書き方を比較してみようと思います。(※値は適当なのでご注意ください)
JSON
{
"Resource": {
"EC2Instance": {
"Type" : "AWS::EC2::Instance",
"Properties" : {
"ImageId" : "ami-XXXXXXXXXXXX",
"InstanceType" : "t2.micro",
"Tags": [
"Key": "Name",
"Value": "EC2Instance"
]
}
}
}
}
YAML
Resources:
EC2Instance:
Type: AWS::EC2::Instance
Properties:
ImageId : ami-XXXXXXXXXXXX
InstanceType : t2.micro
Tags:
- Key: Name
Value: EC2Instance
HCL
resource "aws_instance" "web_server" {
ami = "ami-XXXXXXXXXXXX"
instance_type = "t2.micro"
tags = {
Name = "EC2Instance"
}
}
(json書くの面倒くさい……)
上記3つのコードを比較してみると、JSONは波括弧やダブルクォーテーションの数が多く、煩雑に見えてしまうかもしれません。書くのが面倒ですね。(※2回目)
対して、YAMLやHCLはすっきりしていて、書きやすいですし見やすいです。
また、JSONは基本コメントを書くことができないので、チームで運用するのであればコメントを残せるYAMLやHCLの方が良さそうですね。
HCLでの書き方の概要
上記のsample.tfの書き方には以下のようなルールがあります。
resource "リソースタイプ" "リソース名(識別子)" {
設定項目 = 設定値
・
・
・
}
「リソースタイプ」の部分には、作成するリソースを記入します。
「リソースタイプ」の記入名がTerraform Registryに記載されているので、該当のリソースの記入名を探します。
例えば、Amazon S3なら「aws_s3_bucket」、Google CloudのCloud Storageなら「google_storage_bucket」です。
「リソース名」の部分に記入する文字列は自由です。
ただし、小文字と数字を使用することが推奨されています。
HCLでの書き方の注意点
コードを書く際は以下の点に注意です。
参照元
※詳しくは参照元をご確認ください。
- コメントには#を使用する。
- リソース名には名詞を使用すること。ただし、リソースタイプの名称をリソース名に含めないこと。
- アンダーバー(_)を使用してリソース名に含まれる複数の単語を区切る。リソースを定義する際は、リソースタイプとリソース名を二重引用符で囲む。
- ネストするごとに、スペース2つ分あける(インデント)。
- ネストの深さが同じ場合は、等号の書く位置を揃える(設定項目 = 設定値のように単一行の場合)。
などなど……
おわりに
JSONはダブルクォーテーションや括弧が多く、YAMLはコード量が増えるとインデントのレベルが同じかどうかで一瞬混乱する時があります。
その点、HCLは括弧の量もちょうど良く、ブロックも見やすいのでいいですね。
Discussion