[!] この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
はじめに
当社の基幹業務システムは、2021 年にオンプレミスサーバーから Oracle Cloud Infrastructure (以下 OCI と表記) へと移行し、運用を始めて 2 年目になりました。当社の基幹業務システムは OCI 上の Kubernetes のサービスを利用し、業務プログラムの展開は CI/CD 化されて、自動化は進んできています。しかし、その展開先となるノードや、システムに関連するツール用のインスタンスはほぼ手動で構築、試験をしています。これらインスタンスの構築作業が定型化してきたため、構成管理や構築、試験の自動化を見据え、その第一歩としてインスタンスのベースイメージにあたる、カスタムイメージの最新化から着手しようと考えました。カスタムイメージの最新化にあたり、Packer というツールを利用し、作成したカスタムイメージを Terraform でインスタンスに展開し、Goss を利用して試験まで実施できたため、今回はその内容を紹介します。
なお、この記事は OCI のインスタンスの構築手順をある程度理解されている方向けに紹介します。OCI やインスタンス等の仕組みに関しては OCI の公式サイト ⧉ をご参照ください。
利用したツールの紹介
Packer とは
Packer ⧉ は HashiCorp 社 ⧉ が開発する OSS で、クラウドのインスタンスイメージや VM のイメージ等、サーバーやマシンのイメージを作成するツールです。Packer は設定が HCL 形式 (または JSON 形式) で記載され、コード管理することができます。また、インフラ構築部分にあたるインスタンスやイメージの出力部分と、イメージを構築するためのコマンドの実行部分が分離されているため、他のインフラ環境で同じイメージを作る場合に利用がしやすい作りになっています。イメージの展開先環境も、クラウドや VM 環境、Docker イメージ等、プラグイン ⧉ として用意され、幅広い環境に適用できるのも利点となっています。
Terraform とは
Terraform ⧉ は Packer と同じく HashiCorp 社が開発する OSS で、インフラの構成とプロビジョニングをコード管理できるようにした IaC (Infrastructure as Code) ツールです。こちらも Packer 同様に さまざまな環境 ⧉ に対応しているため、複数のクラウド環境を組み合わせて利用するマルチクラウド環境の運用や、同じような構成の環境を複数作る場合に適したツールになっています。
Goss とは
Goss ⧉ は YAML ファイルの記述でサーバーの設定を検証できる OSS の試験ツールです。Goss は軽量な実行ファイルと設定ファイルの配置のみでインストールでき、操作も簡単なため、学習コストも少なく、素早く実行できる点が特徴になります。検証できる内容としては、パッケージのインストール状況やバージョンの確認、サービスやプロセスの状態、ポートの開放状態、ネットワークの状態、コマンドの実行結果など、基本的な確認事項はチェックできるツールとなっています。
やってみる
要件定義
今回は Oracle Linux 8 に以下の設定を追加したインスタンス用のカスタムイメージを作成する手順とします (実際の環境は他にもいろいろと設定していますが、ここでは省略します)。
- 当社の環境ではプロキシーの設定が必要なため、プロキシーの設定を実施
- 各インスタンスで git コマンドを利用するため、最新の git コマンドのインストールを実施
環境
実行環境は以下のとおりです。
- Windows 10 の WSL (Ubuntu 20.04) 環境で実施
- カスタムイメージおよび試験用のインスタンスの展開先は OCI の東京リージョン (ap-tokyo-1)
作成するファイルは以下になります。
今回実施した内容
今回実施した内容は以下のとおりです。
① OCI 設定
OCI に接続するためのアカウント設定を先に実施します。OCI を操作できるユーザーを作成し、oci コマンドと紐づけておきます。
② 最新のイメージ確認
Oracle Linux 8 系の最新のベースイメージがリリースされていないか確認します。通常の AMD ベースプロセッサのインスタンス用イメージは Oracle-Linux-x.y-YYYY.MM.DD-z
となります (aarch64、Gen2-GPU とついてるものは、それぞれ Arm ベースプロセッサ用、GPU シェイプ用となります)。
- Oracle Cloud Infrastructure Documentation / Images ⧉
- Oracle Cloud Infrastructure Documentation / Platform Images ⧉
コマンドからは以下で取得ができます。
③ Packer でカスタムイメージ作成
まず、Packer をインストールします。インストールの手順は 公式のインストール手順 ⧉ を参照してください。
次に Packer の設定ファイルを作成します。以下のドキュメントに従い、パラメーターを設定していきます。なお、設定ファイルは .hcl ファイルで、HCL 形式 (HCL の version 2 で HCL2) という HashiCorp 社の独自の形式になります。
次に、packer build コマンドでイメージを作成します。
指定したコンパートメントに oracle-linux-8-customimage-for-instance
という名前でカスタムイメージが作成され、イメージの情報が result.json
に書き込まれます。また、カスタムイメージの作成で利用したインスタンス (instance-for-custom-image-from-packer
) は自動で削除されます。
④ 展開して試験を実施
③ で作成したカスタムイメージが正しく設定されているかを確認するために、インスタンスに展開し、試験ツールを実行して確認したのち、作成したインスタンスを削除する手順を実施します。試験用インスタンスの作成には Terraform を利用します。まず、Terraform のインストール手順を以下に示します。インストールの手順は 公式のインストール手順 ⧉ を参照してください。
次に、展開する Terraform の設定ファイルを作成します。今回は試験ツールの Goss を SSH 経由でインスタンス作成時に実行するため、SSH の鍵を事前に作成し、Terraform に利用する OCI の認証情報とインスタンスの構成ファイルをそれぞれ作成します。
次に、Goss の試験ファイルを作成します。試験内容として、以下を実施します。
- 環境変数のプロキシー設定 (http_proxy, https_proxy, no_proxy, HTTP_PROXY, HTTPS_PROXY, NO_PROXY) の値の一致を確認
- dnf のリポジトリーのプロキシー除外設定を確認
- git コマンドの実行を確認
- git パッケージのインストール状況を確認
- ssh のサービスが起動しているか、自動起動が設定されているか確認
- ssh のポート (tcp/22) が開放されているか確認
次に、試験用のインスタンスに試験ファイルを渡して Goss を実行するよう、compute.tf ファイルを修正します。
次に、Terraform から試験用インスタンスを作成してカスタムイメージが正常に作成されているか確認します。
最後に、Terraform は構築ツールのため、作成したリソースは成功/失敗問わず、自動で削除されません。したがって、リソースの削除コマンドを実行し、試験用のインスタンスを削除して完了となります。
おわりに
今回は自動化の第一歩としてカスタムイメージの生成と試験を実施しました。ツールとして Packer, Terraform, Goss をそれぞれ利用しましたが、Packer や Goss は構成がシンプルで理解もしやすく、すぐに導入しやすいという印象を受けました。一方で Terraform はできることが多く、複雑な処理をいれたりすると理解に時間がかかりそうなイメージをもちました。今回のようなインスタンスを作成してコマンドを実行する程度の簡単な処理であれば、Terraform もそこまで難しいものではないかなと思います。
今後は、Terraform 等でインフラのコード管理をしつつ、運用環境の管理の仕組みづくりや、試験環境、開発環境を簡単に構築できるような仕組みを考えていきたいです。また、他の構成管理ツールや試験ツールにも興味があるため、今回利用したツールと比較したいと考えています。