OpeTacoでOPAを使ったポリシーテストをやってみる(インラインポリシー)
OpenTacoではOPAを使ったポリシーチェックを行うことが可能です。
OpenTacoでOPAポリシーを設定する方法は以下の3つがあります。
via Management Repo
via (unofficial) Orchestrator API
inline via Conftest
今回はinline via Conftest(以下、インラインポリシー)を使った方法を紹介します。
OpenTacoではワークフロー内で任意のコマンドを実行するカスタムコマンド機能があります。
この機能を使ってterraform planを実行するタイミングで、conftestを使ってOPAポリシーチェックを実行します。
GitHub ActionsワークフローでConftestを使えるようにする
OpenTaco用のGitHub Actionsワークフロー内でConftestが利用できるように設定します。
name: Digger Workflow
on:
workflow_dispatch:
inputs:
spec:
required: true
run_name:
required: false
run-name: '${{inputs.run_name}}'
jobs:
digger-job:
runs-on: ubuntu-latest
permissions:
contents: write # required to merge PRs
actions: write # required for plan persistence
id-token: write # required for workload-identity-federation
pull-requests: write # required to post PR comments
issues: read # required to check if PR number is an issue or not
statuses: write # required to validate combined PR status
steps:
- uses: actions/checkout@v4
+ - name: Install Conftest
+ run: |
+ LATEST_VERSION=$(curl -s "https://api.github.com/repos/open-policy-agent/conftest/releases/latest" | grep '"tag_name":' | sed -E 's/.*"([^"]+)".*/\1/' | cut -c 2-)
+ ARCH=$(uname -m | sed 's/x86_64/x86_64/' | sed 's/aarch64/arm64/')
+ SYSTEM=$(uname)
+ curl -L "https://github.com/open-policy-agent/conftest/releases/download/v${LATEST_VERSION}/conftest_${LATEST_VERSION}_${SYSTEM}_${ARCH}.tar.gz" -o conftest.tar.gz
+ tar xzf conftest.tar.gz
+ sudo mv conftest /usr/local/bin
+ conftest --version
- name: ${{ fromJSON(github.event.inputs.spec).job_id }}
run: echo "job id ${{ fromJSON(github.event.inputs.spec).job_id }}"
- uses: diggerhq/digger@vLatest
with:
digger-spec: ${{ inputs.spec }}
setup-aws: true
setup-terraform: true
terraform-version: 1.14.3
aws-role-to-assume: ${{ secrets.AWS_ROLE_ARN }}
env:
GITHUB_CONTEXT: ${{ toJson(github) }}
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
ポリシーファイルを追加する
動作確認用にOPAのポリシーファイルを用意します。
EC2インスタンスに必須タグ(Environment Owner Name)が設定されているかチェックするポリシーです。
package main
# EC2インスタンスに必須タグが設定されているかチェック
required_tags := ["Environment", "Owner", "Name"]
deny contains msg if {
resource := input.resource_changes[_]
resource.type == "aws_instance"
required_tag := required_tags[_]
not resource.change.after.tags[required_tag]
msg := sprintf("EC2 instance '%s' is missing required tag: %s", [resource.address, required_tag])
}
EC2にNameタグだけ設定している状態でローカルでチェックを試しました。
想定通り、Environment Ownerタグが付いていないことを検知できました。
$ cd prod
$ terraform plan -out="test.tfplan"
$ terraform show -json test.tfplan > test.json
$ conftest test --policy ../policies test.json
WARN - prod-add-tag.json - main - EC2 instance 'aws_instance.vm_instance' is missing required tag: Environment
WARN - prod-add-tag.json - main - EC2 instance 'aws_instance.vm_instance' is missing required tag: Owner
2 tests, 0 passed, 2 warnings, 0 failures, 0 exceptions
OpenTaco設定ファイルにポリシーチェックのコマンドを追加する
OpenTacoの設定ファイルで、ポリシーチェック用のカスタムコマンドを追加します。
projects:
- name: production
dir: prod
# 以下を追加
workflow: my_custom_workflow
workflows:
my_custom_workflow:
plan:
steps:
- init:
- plan:
- run: "terraform show -json $DIGGER_PLANFILE > prod.json"
- run: "conftest test ./prod.json -p ../policies"
workflow_configuration:
on_pull_request_pushed: [digger plan]
on_pull_request_closed: [digger unlock]
on_commit_to_default: [digger apply]
以下を参考に作成しました。
検証時点では、ドキュメントそのままではGitHub Actions上で以下のエラーがでてポリシーチェックができませんでした。
ポリシーチェック用のファイル(prod.json)が見つからない旨のエラーでした。
time=2026-01-20T06:47:31.234Z level=INFO msg="Running command" command="conftest test ./prod.json -p ../policies" project=hoge/quickstart-actions-aws#production
Error: running test: parse files: get file info: stat ./prod.json: no such file or directory
これを解消するために、prod.jsonを生成するためのカスタムコマンド- run: "terraform show -json $DIGGER_PLANFILE > prod.json"を追加しました。
DIGGER_PLANFILEでterraform plan -out="<ファイル名>"で出力されるファイルのファイルパスを取得できます。
動作確認
Pull Request経由でterraform planを実行します。
ポリシーに違反しエラーが出て、Planを実行できませんでした。

GitHub Actionsのログを見てみると、該当するポリシーも確認できました。

この部分を修正して、GitHubにPushします。自動的にOpenTacoによってPlanが実行されます。
resource "aws_instance" "vm_instance" {
ami = "ami-05c13eab67c5d8861" # us-east-1 Amazon Linux 2023 AMI 2023.2.20231030.1 x86_64 HVM kernel-6.1
instance_type = "t2.micro"
subnet_id = aws_subnet.vpc_subnet.id
vpc_security_group_ids = [aws_security_group.security_group.id]
tags = {
Name = "terraform-instance"
+ Environment = "Production"
+ Owner = "SatoMasaki"
}
}
ポリシーチェックに合格したため、terraform planが成功しました。


おわりに
OpenTaco上でOPAを使ったポリシーチェックをやってみました。
ポリシーチェックの詳細もPull Requestのコメント上で見られたらより便利そうだと思いました。
デフォルトでは該当ワークフローへのリンクはコメントで確認できるため、そこからポリシーチェックの詳細を確認する形になります。
方法がないかを確認してみようと思います。
今回はインラインポリシーを使った方法でやりました。他の方法も試してみたいと思います。
参考






