初心者向け：AWS CloudFormationで学ぶYAMLテンプレートの基本と備忘録

## はじめに
インフラのコード化や構成管理の現場では、**YAML (YAML Ain't Markup Language)** を目にする機会が多くあります。

:::note warn
**特に、KubernetesのマニフェストやAnsibleのプレイブックで利用されることが多いフォーマットです。**
:::

JSONと比べて、YAMLはより人間が読みやすい形式で記述できるのが特徴です。

また、個人的にAnsibleサーバーを構築しようと考えているため、定義ファイルで使うYAMLの知識を整理していきます。

## YAMLとは？
YAMLは、軽量で可読性が高いデータフォーマットです。主に設定ファイルやデータ交換形式として使用されます。

![スクリーンショット 2024-12-04 20.19.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/2a465b34-c1d4-bb30-18bc-a6e1275bb5a2.png)
引用画像：https://udemyfun.com/python-use-yaml/

***YAMLの特徴は、インデントを利用してデータ構造を表現する点にあります。***

JSONやXMLと比較すると、構文がシンプルであるため、視覚的に分かりやすく、扱いやすい形式となっています。

## YAMLの主なデータ型
YAMLで利用できる主なデータ型は以下の通りです。

### マッピング (Mapping):
キーと値のペアで構成されるデータ型。JSONのオブジェクトに相当します。

```yaml
key: value
```

### シーケンス (Sequence):
順序付けられたリスト形式のデータ。JSONの配列に相当します。

```yaml
- item1
- item2
- item3
```

### スカラー (Scalar):
単一の値を表します。文字列、数値、真偽値、nullなどが含まれます。

```yaml
string: "example"
number: 42
boolean: true
null_value: null
```

## YAMLの特徴
インデントや簡潔な記述方法により、直感的に読み書きできることが、YAMLを使用する最大のメリットです。

その他、以下の特徴があります。

### コメントが記述可能
JSONと異なり、``#`` を使ってコメントを書くことができます。

```yaml
# これはコメントです
key: value
```

### 柔軟なデータ構造の表現

複雑なネスト構造でも簡単に表現できます。

```yaml
parent:
  child:
    grandchild: value
```

さらに、多くのプログラミング言語で扱うためのライブラリが用意されており、言語に依存しないという点も大きなメリットです。

## CloudFormationテンプレート形式について

![スクリーンショット 2024-12-03 21.04.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/f267ed55-73ad-97a5-71bf-679820d94d2e.png)
引用画像：https://aws.amazon.com/jp/cloudformation/

AWS CloudFormationのテンプレートは、インフラストラクチャをコードとして管理する際に使用される重要な形式です。テンプレートはJSON形式またはYAML形式で記述できます。

:::note warn
**CloudFormationの技術検証については、過去の記事で詳しく解説しています。ぜひご覧ください！**
:::

https://qiita.com/free-honda/items/1d8810054b556739afaf

https://qiita.com/free-honda/items/c7a68a216eef2161c567

https://qiita.com/free-honda/items/8379519a16a22ba237b8

https://qiita.com/free-honda/items/c7a68a216eef2161c567

**個人的には、AWSサービスの中でもCloudFormationが特にお気に入りで、技術検証に力を入れています！（笑）**

## JSONとYAMLの違いについて

CloudFormationのテンプレートでは、JSON形式とYAML形式のどちらかを選択できます。

:::note
***それぞれの特徴を簡単に比較してみました。***
:::

| 特徴       | JSON                     | YAML                          |
|------------|--------------------------|-------------------------------|
| **形式**   | 厳格でフォーマットが固定 | 人間が読みやすいフォーマット  |
| **記述量** | やや冗長                 | 簡潔                         |
| **コメント** | 非対応                  | 対応 (`#`)                   |
| **使用場面** | プログラム間のデータ交換 | 設定ファイルや構成管理        |

JSONは厳格な構文ルールを持ち、機械での解析に適しているため、APIレスポンスやデータ交換に多く利用されます。

:::note
**一方、YAMLは簡潔で人間にとって読みやすい形式で記述できるため、設定ファイルや構成管理に適しています。**
:::

## YAMLを使ってテンプレートを書いてみた
以下は、AWS CloudFormationを使用してEC2インスタンスを1台構築するYAMLテンプレートの例です。

```yaml
AWSTemplateFormatVersion: "2010-09-09"
Description: AWS EC2 Instance Creation Example
Resources:
  MyEC2Instance:
    Type: AWS::EC2::Instance
    Properties:
      ImageId: ami-0abcdef1234567890
      InstanceType: t2.micro
      KeyName: my-key-pair
      Tags:
        - Key: Name
          Value: MyFirstInstance
```

## コードの簡単な説明
このテンプレートでは、AWSの基本的な知識が必要ですが、YAMLを使って簡潔に記述されています。

:::note
- **``AWSTemplateFormatVersion``**:
CloudFormationテンプレートのバージョンを指定します。

- **``Resources``**:
作成するリソースの定義。

- **``Properties``**:
リソースの設定内容（AMI ID、インスタンスタイプ、キーペアなど）。
:::

***YAMLは人間に優しいフォーマットでありながら、構成管理やテンプレート記述の分野で非常に強力なツールです！***

## まとめ
YAMLの基本構文から、実践的な利用例までを整理して紹介しました。

:::note warn
**今回の記事を通して、YAMLの柔軟性と直感的な記述方法の素晴らしさを再確認することができました。**
:::

今回のYAMLに関する知識整理の記事が、誰かの技術的な支えとなれば嬉しいです！

## 参考記事

https://www.sejuku.net/blog/69240

https://qiita.com/xuwenzhen/items/b01f78525626b3e87d23

https://circleci.com/ja/blog/what-is-yaml-a-beginner-s-guide/