APC 技術ブログ

株式会社エーピーコミュニケーションズの技術ブログです。

株式会社 エーピーコミュニケーションズの技術ブログです。

Terraform Cloud のオンデマンドポリシー評価(ベータ版)が公開されました

こんにちは、ACS 事業部の埜下です。

みなさんは Terraform Cloud のポリシー機能は使っていますか?

Terraform Cloud のポリシーは HashiCorp Sentinel や OPA といったフレームワークで Policy as Code を定義できます。 このポリシー、作成/変更したら既存リソースにどのように影響を及ぼすかチェックすることが肝心です。

しかし、ポリシーが適用されるワークスペースが増えれば増えるほど、チェック作業も増えていきポリシー管理が杜撰に……、なんてこともあるかもしれません。

そんな労力のかかるポリシー管理を助けてくれる「オンデマンドポリシー評価 (on-demand policy evaluation)」がベータ機能として公開されました🎉

www.hashicorp.com

今回はこのオンデマンドポリシー評価を実際に使ってみたので、どのような機能か紹介したいと思います。

1. オンデマンドポリシー評価とは

今回ベータ機能として公開されたオンデマンドポリシー評価とは、ワークスペースにポリシーを適用した結果を Plan や Apply を実行せずに確認できる機能です。

また、オンデマンドポリシー評価ではポリシーセットを適用していないワークスペースに対してもポリシーを適用した結果を確認できます。

このオンデマンドポリシー評価、有料の Plus プランだけでなく Free プランでも利用できます。 Free プランでもポリシー機能は使えるのですが、定義できるポリシーやポリシーセットの数に制限がありました。 オンデマンドポリシー評価はポリシーセットに紐づく機能なので多くのパターンは試せませんが、Free プランでも利用できるのは嬉しいですね。

ただし、現在はベータ版のため利用できるプランは今後変わる可能性はありますので、ご注意ください。

2. なにが嬉しいの?

冒頭で述べたとおり、Terraform Cloud では HashiCorp Sentinel または OPA というフレームワークのどちらかを使って Terraform で管理するリソースに対するポリシーを定義することができます。 ポリシーは「ポリシーセット」という単位で管理され、このポリシーセットを適用するプロジェクトやワークスペース(どちらも Terraform Cloud 内の要素)を選択することで反映されます。

Terraform Cloud を大規模に利用されている環境だと 1 つのポリシーセットが多くのワークスペースに適用されている状況もあるのではないでしょうか。 このような状況でポリシーを変更しようとした場合、各ワークスペースにどのような影響を及ぼすかチェックするため Plan や Apply を実行していく必要があります。

HashiCorp ではポリシーセットを Advisory モードに変更して影響をチェックする方法をアナウンスしていたようです(ブログ参照)。 しかし、この方法ではワークスペース毎に Plan や Apply を実行する手間は残ってしまいます。

そこで「オンデマンドポリシー評価」の登場です!

2.1 ポリシー適用結果をすぐに確認できる

オンデマンドポリシー評価はワークスペースに対して Plan や Apply を実行しなくてもポリシー適用結果を確認できる、というのは前述したとおりですが、評価は数秒で完了します(※軽量なポリシーを軽量のワークスペースに適用した場合)。 Plan や Apply を実行すると早くても数十秒かかりますよね。 確認するワークスペースが多いほど実行時間がチリツモで増えていくため、確認作業がすぐに終わるということはポリシー管理者にとっては嬉しいのではないでしょうか。

ただし、現在はワークスペース 1 つずつ確認する方法しか提供されていないため、「プロジェクト内のワークスペースをまとめて確認」といった使い方はできません。 今後の機能改善に期待しましょう。

2.2 適用外ワークスペースも対象にできる

また、オンデマンドポリシー評価はポリシーセットが適用されていないワークスペースに対する評価も可能です。

ポリシーセットとワークスペースの関係性

上図のポリシーセットやワークスペースを例にすると、「ポリシーセット A で定義したポリシーをプロジェクト β 内のワークスペースにも適用したい」となった場合、従来ではポリシーセット A をプロジェクト β に適用する作業が必要でした。

しかし、オンデマンドポリシー評価を使うことでポリシーセットをプロジェクト/ワークスペースに適用する作業が不要になります! これは嬉しいですねー、使わない手はないですよね。

3. オンデマンドポリシー評価を試す

それでは、実際にオンデマンドポリシー評価を使ってみたので紹介します。

事前準備は特になく、Terraform Cloud にポリシーとポリシーセットを作成しておくだけです。

今回は Sentinel で「Azure VNet は東日本リージョンであること」というポリシーを作成してポリシーセットに割り当てました。

import "tfplan/v2" as tfplan

allVirtualNetworks = filter tfplan.resource_changes as _, resource_changes {
    resource_changes.type is "azurerm_virtual_network" and
        resource_changes.mode is "managed" and
        (resource_changes.change.actions contains "create" or
            resource_changes.change.actions is ["update"])
}

virtual_network_location_is_japaneast = rule {
    all allVirtualNetworks as _, virtualNetworks {
        virtualNetworks.change.after.location is "japaneast"
    }
}

// Ensure that Virtual Network region is set to 'japaneast'.
main = rule {
    virtual_network_location_is_japaneast
}

このポリシーセットを仮想ネットワーク(米国東部リージョン)の Azure リソースを持つワークスペースに適用します。

まず、Terraform Cloud で対象のポリシーセットを開きます。 すると、新しく [Configure] と [Evaluate] というタブができているので、[Evaluate] タブを表示します。

ポリシーセットの [Evaluate] タブ

この画面では Sentinel のランタイムバージョンやワークスペースの一覧が表示されています。

Runtime version

ワークスペース一覧

ランタイムバージョンと適用するワークスペースをそれぞれ選択して [Evaluate] ボタンを押すと、ポリシーセットの評価が実行されて数秒待つと実行結果が表示されます。

今回は米国東部リージョンの仮想ネットワークが存在したため、ポリシーに準拠していないということで "status": "failed" となっています(3 行目)。 しかし、実行結果の Status 欄は Passed になっていますね。

今回のポリシーは適用モードを [Advisory] にしていました。 [Advisory] はポリシーに準拠していない場合でも警告を出すのみでリソースの変更は可能です。 そのため、上記のような表示になったと推測します(該当するドキュメントがまだ見つまりませんでした)。

オンデマンドポリシー評価の実行結果

それでは、適用モードを [Soft mandatory] に変更して再実行してみましょう。

その結果がこちらです。 先ほどと比べると 3 行目の "status": "failed" は同じですが、Status 欄が Failed になっていますね。 適用モード [Soft mandatory] の場合はポリシーに準拠していないとリソースを変更できないためこのような結果になっていると思われます。

オンデマンドポリシー評価の実行結果(Soft mandatory)

ちなみに、仮想ネットワークを東日本リージョンで作り直した後の評価結果は以下になります。

オンデマンドポリシー評価の実行結果(ポリシー準拠)

このように、オンデマンドポリシー評価はポリシーセットの管理画面から簡単にポリシーを評価できる便利な機能でした。

4. おわりに

Terraform Cloud のポリシー機能は便利な反面、ポリシー管理者の運用負荷は低くないのではないでしょうか。 今回は公開されたばかりの「オンデマンドポリシー評価」はポリシー管理者にとって無くてはならない機能になっていくと思われます。 まだベータ版にはなりますので、利用した結果をフィードバックしてより良い機能にしてもらえたら嬉しいです。