🗒️

YAMLことはじめ

に公開

モチベーション

勉強の整理・アウトプットとして書いてます、間違いやおすすめ勉強サイトなどあったらコメントで教えてくれたら嬉しいです🥺
DevOpsから派生してMLOpsとかAutoMLがあるのはなんとなく知ってたけど、具体的に何やってるんだ?
そもそもこれらに関連して、Infrastructure as Code(IaC)という管理でやることでCloud上でポチポチ設定する必要がなくなるみたい。要はコードで記述管理することで、誰がやっても同じ環境になる再現性を担保するものなのね、
ふむふむ🤔
管理手法としてTerraform, CloudFormation, CDKとかがある?そもそもこういった設定ファイルや自動化スクリプトを書く際にYAML形式で記述することが多いみたい。(正確にはTerraformはHCL, CloudFormationはJson,YAML, CDKはTypeScript,Python,Go,Javaといったプログミングでやるみたい)
確かにDockerとか何回かたてたことあるけどYAMLでなんか記述されているなあ。(Dockerもどっかでちゃんと理解しておきたいけど、、)
一旦、YAMLについて勉強してみるか!今ここ!!(だいぶさかのぼった。。。)

本記事では、YAMLの基本的な概念から書き方、そしてDevOpsの現場での活用事例までを幅広く解説します。
動画でサクッと学びたい人はサプーさんの動画がわかりやすいです。

https://youtu.be/rpbq6vXcNbM?si=4xQP6ij-XTuEeWeb

YAMLとは?その概要と特徴

YAMLは「YAML Ain't Markup Language」の頭文字を取った再帰的な頭字語で、データを簡潔に記述するための形式言語 です。2001年に開発され、XMLやJSONといった他の形式言語と比較して、その簡潔さと可読性の高さ が特徴として挙げられます。

プログラミング言語とは異なり、YAMLは主にデータを記述するために使用 されます。コンピュータに命令を与えるというよりは、設定情報や構造化されたデータを表現するのに適しています。

YAMLの主な特徴は以下の通りです:

  • 可読性の高さ: XMLやJSONに比べて、人間が理解しやすいシンプルな構文を持っています。
  • 簡潔な文法: 必要最低限の文法で記述できるため、ファイルサイズが小さくなる傾向があります。
  • コメントのサポート: # を使用してコメントを記述できるため、設定内容の説明を容易に記述できます。
  • リストとディクショナリー: データを列挙する「リスト」と、キーと値のペアで表現する「ディクショナリー」という主要な記述形式を持ちます。
  • 直列化の容易さ: プログラムがYAMLデータを読み書きする際の「直列化」が容易であり、異なるデータ形式への変換もスムーズに行えます。

YAMLの記述単位:ファイル、ドキュメント、スカラー、コレクション

YAMLでデータを記述する際の基本的な単位を理解しておきましょう:

  • ファイル: 拡張子 .yaml または .yml のファイルにYAML形式で記述します。
  • ドキュメント: 1つのファイル内には、複数のデータのまとまり(ドキュメント)を記述できます。ドキュメントは --- というセパレータ で区切られます。
  • スカラー: 文字列や数値などの単一のデータ を指します。文字列、数値、真偽値(true/false, yes/no)、Null値(null, ~)、日付などのデータ型を持ちます。
  • コレクション: スカラーを含めた他のデータを要素として持つデータ構造で、主にリストディクショナリー の2種類があります。
    • リスト: データを1つずつ - (ハイフンと半角スペース)を使用して縦に列挙します。
    • ディクショナリー: データを キー: 値 (コロンと半角スペース)の形式で表現します。

YAMLの基本的な書き方:手を動かしてみよう

実際にYAMLを書いてみましょう。基本的なデータ型と構造の書き方を解説します:

  • キーと値のペア(ディクショナリー):

    title: "私のZennブログ"
    author: "Yamada Taro"
    version: 1.0
    

    titleauthorversion がキーで、それぞれの右側の文字列や数値が値です。キーと値の間は : と半角スペースで区切ります。

  • リスト:

    tags:
      - YAML
      - 設定ファイル
      - DevOps
    

    tags というキーに対応する値はリスト形式です。各要素の先頭には - と半角スペースを記述します。

  • 数値と真偽値:

    port: 8080
    debug_mode: true
    enabled: yes
    

    数値はそのまま記述し、真偽値は truefalseyesno などで表現します。

  • Null値:

    description: null
    

    値が存在しないことを示す場合は null または ~ を使用します。

  • 文字列:
    通常はクォーテーションマークは不要ですが、文字列として明示的に扱いたい場合や、スペースなどを含む場合はダブルクォーテーションで囲みます。

    message: "Hello, YAML!"
    path: "/usr/local/bin"
    
  • インデントによる階層構造:
    リストやディクショナリーをネストさせることで、複雑なデータ構造を表現できます。インデントは半角スペース2つ を推奨します。タブ文字は使用しないでください。

    server:
      host: "example.com"
      ports:
        - 80
        - 443
    

YAMLと他の形式言語(JSON、XML)との比較

YAMLはJSONやXMLといった他のデータ形式言語とよく比較されます。それぞれの特徴を理解し、適切な場面で使い分けることが重要です:

特徴 YAML JSON XML
人間から見た読みやすさ 読みやすく理解しやすい 少し読みにくい 読みにくい
文法 最小限の文法 明示的で詳細な文法 より明示的で詳細な文法
コメント コメント付与可 コメント付与不可 コメント付与可
階層表現(グループ化) 半角スペース2つで表現 中括弧{}と角括弧[]で表現 開始タグ、終了タグで表現
データ容量 小さい YAMLと比較して大きい JSONと比較して大きい
用途 各種設定ファイルの記述 Webアプリケーションの開発、特にHTTP経由でのデータ送信 複雑なデータ構造が必要な大規模Webアプリケーションの開発、特に複数システム間でのデータ交換

YAMLは、特に人間が手で記述・編集する設定ファイル の用途において、その可読性の高さから大きなメリットを発揮します。一方、JSONはWeb APIなどでのデータ交換フォーマットとして広く利用されています。XMLはより複雑なデータ構造を扱うのに適していますが、冗長になりやすいという側面もあります。

JSONと対応させて見比べたい場合以下のサイト使うと YAML to JSON, JSON to YAMLに変換してくれるのでおススメです!
YAML to JSON
文法チェック、 linterならこのサイト
yamllint.com

DevOpsにおけるYAMLの活用

近年、DevOps の実現に不可欠な様々なツールで、設定ファイルとしてYAMLが広く採用されています. これは、YAMLの可読性の高さと簡潔さが、インフラの構築やアプリケーションのデプロイメントといった複雑なタスクをコードで管理する上で非常に有効であるためです。

YAMLを採用しているDevOpsツールの例:

  • Ansible: インフラの管理やソフトウェアのデプロイメントなどを自動化するIaC(Infrastructure as Code)ツール。Playbookと呼ばれる設定ファイルに、実行したいタスクをYAML形式で記述します。
  • Kubernetes: コンテナ化されたアプリケーションのデプロイ、スケーリング、管理を自動化するコンテナオーケストレーションツール。PodやDeploymentなどのリソース定義をYAMLファイルで行います。
  • Docker Compose: 単一ホスト上で複数のDockerコンテナを定義し、管理するためのツール。docker-compose.yml ファイルに、各コンテナのビルド設定や起動オプションなどをYAML形式で記述します。
  • GitHub Actions: GitHub上でCI/CD(継続的インテグレーション/継続的デリバリー)のワークフローを自動化するツール。ワークフローの定義や実行するジョブ、ステップなどをYAMLファイルに記述します。

これらのツールを使いこなすためには、YAMLの文法と構造を理解することがDevOpsの基礎力 と言えるでしょう。次はDocker、GitHub Actionあたりは勉強しないとなあ。

まとめ

本記事では、YAMLの概要、特徴、基本的な書き方、そしてDevOpsにおける活用事例について解説しました。YAMLは、その可読性と簡潔さから、設定ファイル記述のデファクトスタンダードなのかな?

本記事が皆さんにも少しでも参考になったなら幸いです。

Discussion