Oracle Cloud Hangout Cafe Season7 #2「IaC のベストプラクティス」(2023年7月5日開催)
はじめに
「Oracle Cloud Hangout Cafe」(通称「おちゃかふぇ」/以降、OCHaCafe)は、日本オラクルが主催するコミュニティの1つです。定期的に、開発者・エンジニアに向けたクラウドネイティブな時代に身につけておくべきテクノロジーを深堀する勉強会を開催しています。
連載第2回の今回は、2023年7月5日に開催された「Oracle Cloud Hangout Cafe Season7 #2 『IaC のベストプラクティス』」の発表内容に基づいて紹介していきます。
アジェンダ
今回は、以下のアジェンダの流れに従って、順に解説します。
- Infrastructure as Code(IaC)
- Terraform
- Pulumi
発表資料と動画については、下記のリンクを参照してください。
【資料リンク】
【動画リンク】
Infrastructure as Code(IaC)
本連載では、Infrastructure as Code(以下、IaC) を実現するツールとして、TerraformとPulumiを紹介しますが、その前にそもそもIaCとは何か、IaCを導入することで得られるメリットは何かについて解説します。
Infrastructure as Code(IaC)とは
IaCとは、Infrastructure as Codeの略称であるように、広義にはインフラストラクチャを定義、展開、更新、破棄するためのコードを書き、それを実行することと言えます。これを実現するツールは、以下の通り数多く存在します。
- アドホックなスクリプト
- Bash、Ruby、Python、etc.
- 構成管理ツール
- Chef、Puppet、Ansible、etc.
- サーバーテンプレートツール
- Docker、Packer、Vagrant、etc.
- オーケストレーションツール
- Kubernetes、Docker Swarm、Nomad、etc.
- プロビジョニングツール
- Terraform、Pulumi、etc.
いずれのツールも目的は同様で、従来手動で実施してきた作業をコードに変換する先行投資と引き換えに、ソフトウェアのデリバリーを効率化することと言えるでしょう。
IaC が提供する価値
IaCを導入することで得られる価値を深掘りしてみると、以下のような観点があると思います。
- セルフサービス
- スピードと安全性
- ドキュメンテーション
- バージョン管理
- 検証
- 再利用性
セルフサービス
アプリケーションのデプロイでは、主に以下3つのことを実施していたと思います。
- ソフトウェアの開発者がアプリケーションコードを実装する
- コードの内容を実行可能な形式にまとめたもの(WAR、JAR、etc.)をインフラの担当者へ渡す
- インフラの担当者が動作環境を作成し、渡されたファイルを決められた形で配備する
特に動作環境の作成はソフトウェアの開発者にとっては遠い存在でしたが、インフラをコードとして表現するとインフラ担当者に頼らずとも環境を構築できます。
スピードと安全性
インフラをコードとして表現することのもう1つのメリットとして、自動化に取り組みやすいことが挙げられます。インフラ構築に関わる一連のタスクを自動化すると、人手を介さないことによる人的ミスの削減やデプロイメントの高速化が期待できます。
ドキュメンテーション
環境を作成した際に作ったインフラの設計書と実環境の設計書をメンテナンスしなかったことにより、差分が発生した経験はないでしょうか。インフラを構築するコードで環境構築を行うようにすれば、常にそのコードが最新のインフラを表すドキュメントとして機能します。また、目的別に特化した言語(DSL)は文法や構造が一般目的言語(GPL)と比較しても単純なため、可読性にも富む傾向があります。
バージョン管理
Git等のバージョン管理ツールと組み合わせてインフラ操作の履歴をコミットログとして記録することで、変更履歴の追跡やロールバック等の管理ができるのも1つのメリットと言えるでしょう。
検証
コードとして表現することで、コード・レビューのプロセスや自動テスト、静的解析ツールを活用できます。それを実現するツールも数多くありますので、後半でいくつかピックアップして紹介します。
再利用性
ソフトウェア開発では、よく同じような処理を関数やメソッドという単位に切り出して効率的に実装すると思いますが、IaCでも同様に再利用可能なモジュールにパッケージ化することで効率的にインフラの定義を行うことができます。
Terraform
ここからは、IaCツールの代表例であるTerraformについて紹介していきます。
Demo: OKE(+周辺リソース)のプロビジョニング
当日のセッションでは、まずTerraformでどのようなことができるのかを見てもらうためにデモを実施しました(実際のデモはこちらから視聴できます)。
上図にある通り、Terraformを用いてOKE*1と、それを配置するためのネットワークをプロビジョニングしています。ここでは、Terraformでこのようなことができるというイメージを持っていただければ十分で、以降でデモの内容が理解できるように基本的なところから解説します。
*1: Oracle Container Engine for Kubernetesの略称で、OCIが提供するマネージドKubernetesサービスのことTerraformとは
TerraformはHashiCorp社が開発する、主にクラウド・インフラ構築に焦点を当てたIaCツール(プロビジョニング)です。特徴的なのは、インフラのあるべき状態を宣言し、TerraformがパブリッククラウドなどのプロバイダーへのAPIリクエストをユーザーの代わりに行うことで、インフラのプロビジョニングを行う点です。インフラをプロビジョニングするために手続き的なコードを書く必要はなく、あるべき状態へ到達するために必要なAPIリクエストなどはTerraform側で計算されるため、実装者が現在の状態を意識しなくても良い、コードそのものがインフラの最終状態を表すドキュメントとして機能する、といったメリットがあります。
Terraformであるべき状態は、HashiCorp Configuration Language(以下、HCL)というJSON互換のDSL*2で宣言的に定義します。また、状態を記録するStateファイルを用いてTerraformのエンジンに必要なリソースを計算することで、複数回実行しても同じ結果となること(冪等性)を担保します。
*2: Domain Specific Language の略で、ある 1 種類のタスクを記述することに集中したプログラミング言語の総称Terraformのアーキテクチャ
まずは、概要レベルで見ていきます。
前述した通り、プロバイダーから提供されているAPIをTerraformが代わりに実行することでインフラをプロビジョニングします。以下でTerraform Core、Terraform Plugins、Terraform Providersについて、もう少し補足を加えます。
Terraform Core
Terraform Coreは、どのプラットフォームでも使われるTerraformの基本機能や、共通のインターフェースを提供します。具体的には、CLI(init、plan、apply…)に関する機能やリソースやデータソース等から依存関係グラフを作成する機能、Stateファイルを読み書きするロジックなどです。HashiCorp社が所有し、GitHubリポジトリ(https://github.com/hashicorp/terraform)で管理されています。
Terraform Plugins
Terraform CoreにはTerraformの基本機能しか含まれていないため、実際にプロバイダーから提供されているAPIを実行することはできません。そのため、各種プロバイダーのAPIをネットワーク(HTTP、etc.)を介して実行するための機能をプラグインとして提供し、それをTerraform Coreから実行することでインフラのプロビジョニングを可能にします。
Terraform CoreのコードはHashiCorp社が管理していましたが、各プラグインのコードはそれぞれ個別のリポジトリで管理されています。
【hashicorp/terraform-provider-aws】
【oracle/terraform-provider-oci】
また、プラグイン開発やメンテナンスに用いる専用のフレームワークやSDKも存在します。
- プラグイン開発: Terraform Plugin Framework
- legacy SDKで作られたプラグインのメンテナンス: Terraform Plugin SDKv2
Terraform Providers(2023/12 執筆時点)
2023年12月現在、https://registry.terraform.io/browse/providersを見ると、Official、Partner、Communityを合わせて3,700以上のプロバイダーが登録されていることを確認できます。
連載バックナンバー
Think ITメルマガ会員登録受付中
全文検索エンジンによるおすすめ記事
- TerraformからPulumiへの移行
- Iacツール「Terraform」の基本的な使い方
- 既に存在するリソースをPulumiで管理してみよう
- PulumiでAWSリソースをデプロイしよう
- Policy as Codeでインフラのコンプライアンスを自動実現! 「Pulumi CrossGuard」を活用してみよう
- 「Pulumi Stack」とは ー Pulumiによるマルチステージ環境の構築方法
- 「Pulumi Automation API」でPulumi CLIの機能をコード化しよう
- Pulumi Kubernetes Operatorを活用してPulumiのCI/CDを実現しよう
- Infrastructure-as-Codeアプローチと「Pulumi」の概要
- SecretもPulumiで使いこなしたい! PulumiのSecurityを試してみよう