Terraform CloudのOPA Policy適用のチュートリアルをやってみた

2022.11.09

「Terraform Cloudで Policy as Code を試してみたい」

と思っていたら良いチュートリアルがありました。

Detect Infrastructure Drift and Enforce OPA Policies | Terraform | HashiCorp Developer

今回はこちらのチュートリアルを紹介します。

事前準備

  • Terraform CloudのTeam & Governance以上のプラン(Freeプランでは実行できない)

有償プランを契約していなくても、Terraform Cloudのアカウント作成後のTeam & Governance Planのフリートライアルでこちらのチュートリアルの手順を実行できます。

HashiCorp Terraform: Enterprise Pricing, Packages & Features

やってみた

このチュートリアルでは、主に以下の3つを体験できます。

  • preconditionを使用したバリデーション
  • Terraform Cloud上でのOPA Policy チェック
  • Terraform Cloudの機能を使用したドリフト検出

preconditionを使用したバリデーション

preconditinoを使用することで、resource・data source・outputに対してのバリデーションを実装できます。

このチュートリアルでは、EC2インスタンスのインスタンスタイプに設定しています。 コア数が2以下ではない場合、過剰なプロビジョニングとしてエラーを出すようにしています。

modules/network/main.tf

data "aws_ec2_instance_type" "bastion" {
  instance_type = var.bastion_instance_type
}

resource "aws_instance" "bastion" {
  instance_type = var.bastion_instance_type
  ami           = data.aws_ami.amazon_linux.id

  subnet_id              = module.vpc.public_subnets[0]
  vpc_security_group_ids = [aws_security_group.bastion.id]

  lifecycle {
    precondition {
      condition     = data.aws_ec2_instance_type.bastion.default_cores <= 2
      error_message = "Change the value of bastion_instance_type to a type that has 2 or fewer cores to avoid over provisioning."
    }
  }
}
 $ terraform plan # bastion_instance_typeにコア数が2以上のタイプ"t2.2xlarge"を設定
# 以下のようにエラーが出る
│ Error: Resource precondition failed
│ 
│   on modules/network/main.tf line 67, in resource "aws_instance" "bastion":
│   67:       condition     = data.aws_ec2_instance_type.bastion.default_cores <= 2
│     ├────────────────
│     │ data.aws_ec2_instance_type.bastion.default_cores is 8
│ 
│ Change the value of bastion_instance_type to a type that has 2 or fewer
│ cores to avoid over provisioning.
╵

Terraform Cloud上でのOPA Policy チェック

このチュートリアルでは、2つのポリシーを設定しました。

  • セキュリティグループのingressで「0.0.0.0/0」を開けることを拒否
  • 金曜日にデプロイすることを拒否

OPA Policyの中身は以下から用意されているサンプルリポジトリ内から確認できます。

learn-terraform-drift-and-opa/opa/policies at main · hashicorp/learn-terraform-drift-and-opa

それぞれOPAポリシーをディレクトリに用意して、Terraform CloudのOrganization設定の部分でOPAポリシーのインテグレーションを作成します。

設定後Terraformコード上のセキュリティグループで「0.0.0.0/0」を許可に変更後、ApplyするとOPA policies failedを確認できます。

同様に金曜にデプロイしようとするとOPA Policies failedを確認できます。

注意点 OPA Policyが実際はFailedでもCLI上はPassedになる

チュートリアルのNoteにもありましたが、一応共有です。

現在、OPA Policyチェックの機能はベータ版でCLI出力が実装されていません。 そのため、CLI上では実際はFailedになっていても、以下のようにPassedで表示されます。

$ terraform apply # terraformコード上はチェックに失敗する設定
# 省略
Post-plan Tasks:

All tasks completed! 0 passed, 0 failed

│ 
│ Overall Result: Passed

Terraform CloudのGUIからは正常に確認できます。

Terraform Cloudの機能を使用したドリフト検出

最後はドリフト検出です。こちらに関しては、Terraformコード自体の修正は行わずに試すことができます。

作成したリソースのセキュリティグループのCIDR BlockをGUI上で変更して、Drift Detectionを有効化、検出されることを確認するといった流れです。

最終的には以下のように、Terraform CloudのGUI上でドリフトを確認できます。

おわりに

OPA Policyのチュートリアルでした。 OPA Policy以外にも、ドリフト検出やpreconditionについても紹介されていました。

OPA Policyで曜日指定でデプロイ禁止といったこともできることを知らなかったので、OPA Policy自体にもより興味が湧きました。

Styraと連携させるチュートリアルだったり、他にも面白そうなものがあるので色々試していきたいと思います。

以上、AWS事業本部の佐藤(@chari7311)でした。

参考