OCI の Resource Manager を使って Terraform を実行する

Oracle Cloud Infrastructure (OCI) の中にある Oracle Resource Manager (ORM) というサービスを使うと、OCI 上で Terraform 定義ファイルを実行でき、状態管理ファイルを一元管理できる。

Terraform で OCI の操作をしたことがある人なら始めるのは簡単なので、紹介する。

目次

Resource Manager はどこにある?

リソースマネージャは、

と進む。

Stack と Job

最初に表示されるのは「Stacks」というリソースで、その他に「Jobs」というリソースがあるのが分かる。

これらは何かというと、1つの Terraform ファイル群を Stack と呼んでおり、その Stack 定義を元に terraform コマンドが実行される1回の履歴を Job として管理するのだ。つまり、Stack : Job = 1 : n という関係。

Stack が Terraform 定義ファイルを置いているディレクトリで、Job がコマンドの実行履歴、といったところで良いだろう。

Terraform 定義ファイルの注意点

Resource Manager という名前だが、実態は単なる Terraform 実行基盤だ。使用する Terraform 定義ファイルは、ローカル開発マシンで terraform コマンドを使って実行した時のファイルがほぼそのまま使える。

ただ、Resource Manager 特有の特徴として、provider.oci には region プロパティ以外の指定が要らない、というところが特徴だ。region だけは、対象のリージョンを特定するために必要だが、Tenancy OCID だったり、Terraform を実行するユーザの情報、といったものは必要ない。Resource Manager 自身が manage all-resources in tenancy な特権を持っている状態だ。

この仕様による弊害は、OCI の場合は oci_containerengine_cluster_kube_config Data Source を使った KubeConfig ファイルの生成が出来なくなることぐらいだろうか。local_file を使ったファイル出力もできないので、KubeConfig ファイルの生成は Resource Manager を使わず別の手段をとろう。

Stack を作る

それでは、まずは Stack を作ってみよう。先程書いたとおり、Resource Manager はテナンシー内のどこにあるリソースでも作成・更新できるので、当該 Stack が所属するコンパートメントと、作れるリソースの範囲は関係ない。

Stack 作成画面で、Terraform 定義ファイル群をまとめた Zip ファイルをアップロードする。すると、ファイル内の variable 宣言と default 値を読み取って、変数のフォームをある程度自動入力してくれる。

公式ドキュメントを読むと、terraform.tfvars*.auto.tfvars というファイルが Zip 内にあれば、その値を勝手に代入してくれるっぽいのだが、自分が試した限りでは変数値の代入はしてくれなかった。.tfvars ファイルから手作業で値をコピペしよう。

なお、配列の変数に関しては、テキストボックスに [ "hoge" ] といった形で書いていけば良い。

Job を実行する

Stack が作れたら、その Stack 定義を元に Terraform を実行する。選択できる Action は Plan、Apply、Destroy の3つで、terraform planterraform applyterraform destroy コマンドと同じだ。

実際に Plan なり Apply なりを実行してみると、ステータスが「Accepted」になると思う。そこから数分待つと「In Progress」ステータスに移行し、実際に Terraform が実行されている様子が「Logs」画面で分かる。サラッと書いたが、1回のコマンド (Job) 実行に5〜10分くらいかかるので、動作速度は物凄く遅い。

こうして作業が終わると、実行結果は「Outputs」欄に表示される。「Logs」欄もそうだが、まさに terraform コマンドの実行結果がそのまま出力されている。

この Resource Manager の利点は、状態管理ファイル .tfstate の共有が不要になること。Terraform の機能にリモートステートといったモノがあるが、その設定すら不要になる。一度アップした Terraform ファイル群は Resource Manager からダウンロードできるし、複数の開発者で一つの Terraform ファイルを編集し、リソースを更新していきやすいのが特徴だろう。

削除について

Stack を削除する場合は、きちんと「Destroy」Job を実行してから Stack を Delete するようにしないと、リソースが残ったままになってしまうので注意。

また、Stack を削除した後、その Stack が所属していたコンパートメントを削除しようとすると、「Job」リソースが裏側でまだ残ったままとみなされてしまい、コンパートメントの削除に失敗してしまった。コレはどうやったら解決できるのか、まだ分かっていない。しばらく放置してみるか。


以上。実行速度が著しく遅いが、定義ファイルなどを共用しやすいので、例えば本番環境の構築などは、ローカルから Terraform を叩くのではなく、Resource Manager を使うようにしておくと良いかもしれない。