OpenTacoのTerraformドリフト検出を試してみた
OpenTacoのドリフト検出機能を試してみました。
Terraformのドリフトとは
Terraformで管理しているリソースに対して、Terraform外から変更を加えるとTerraformコードと実環境の設定に差分がある状態になります。
この差分がある状態をドリフトと呼びます。
ドリフトが発生すると、次回のTerraform適用時に想定外の変更が発生することがあります。
Terraformで環境を運用し続ける場合は、ドリフトを検出する仕組みを用意しておくことが望ましいです。
OpenTacoのドリフト検出機能
OpenTacoにはドリフト検出機能が含まれています。
指定したチェック頻度でドリフトチェックを行い、通知等のアクションを行う機能です。
ドリフト時には自動で以下のアクションを実行できます。
- GitHub Issueを自動で作成
- Slackに通知
やってみた
以下を参考にドリフト検出機能を試してみました。
ドリフト検出の設定
今回はGitHub Actionsを使って設定します。
以下のワークフローファイルを用意します。
※ワークフローファイル内では、diggerという名称が登場します。これはOpenTacoのリブランド前の名称です。GitHubリポジトリや一部サンプルコードで引き続きdiggerとなっているため、ブログ上でも一部diggerという名称を使います。
name: Digger Workflow for Drift Detection
on:
workflow_dispatch:
schedule:
- cron: '0 0 * * *'
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: write # required to check if PR number is an issue or not
statuses: write # required to validate combined PR status
jobs:
digger-job:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
with:
fetch-depth: 1
- name: Digger drift detection
uses: diggerhq/digger@vLatest
with:
mode: drift-detection
digger-filename: digger.yml
no-backend: true
setup-terraform: true
terraform-version: 1.14.3
setup-aws: true
aws-role-to-assume: ${{ secrets.AWS_ROLE_ARN }}
drift-detection-slack-notification-url: ${{ secrets.DRIFT_DETECTION_SLACK_NOTIFICATION_URL }}
env:
GITHUB_CONTEXT: ${{ toJson(github) }}
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
INPUT_DRIFT_GITHUB_ISSUES: 'true'
トリガーは、定期実行と手動実行を設定しています。
digger_workflows.ymlとpermissionはほとんど同じです。
異なる点は、Issueのwrite権限を与えている部分です。
OpenTacoのドリフト検出機能では、ドリフト発生時に自動でGitHubのIssueを作成することができます。
この機能はINPUT_DRIFT_GITHUB_ISSUES環境変数をtrueに設定することで利用できます。(ファイル内のjobs.digger-job.steps.env.INPUT_DRIFT_GITHUB_ISSUESで設定しています)
Issue作成のため、ワークフローにIssueのwrite権限を与えています。
drift-detection-slack-notification-url:にはSlackのWebhook URLを設定しました。これでドリフト検知時にSlackにも通知が飛びます。
補足: GitHub Actionsワークフローファイル no-backend: true
ワークフローでno-backend: trueを設定している点について補足します。
Diggerには以下の2つの実行モードがあります:
- バックエンド有り: Digger Cloudサービスと連携し、PRコメントでの実行や承認フローなどのオーケストレーション機能を利用
- バックエンド無し: CLIのみで実行し、Terraformコマンドの実行のみを行う
ドリフト検出用のワークフローはGitHub Actionsの定期実行または手動実行をトリガーにすることを想定しています。
OpenTaco側からキックすることは想定していないため、バックエンド無しで実行可能です。
バックエンド無しの設定であれば、OpenTacoの認証情報も省略できてシンプルなため、今回はこちらを選択しました。
ちなみに、no-backend: falseに設定して認証情報を省略すると、以下のエラーが発生しました。
unexpected status when reporting a project: 403
Could not find bearer token in Authorization header
動作確認: ドリフトの検出
以下で作成した環境でドリフトの検出を試してみます。
リソースを作成した後、EC2のタグを削除します。
これでコードと実リソースの設定差分(ドリフト)が発生しました。

先程作成したワークフローが実行されると、以下のようにIssue作成・Slack通知が行われました。


おわりに
ドリフト検出機能を自前で実装・運用するのは中々大変です。
OpenTacoを使うことでIssue作成やSlack通知も含めて簡単に実現できました。
今回は検出までですが、OpenTacoにはドリフト修復に役立つ機能もあります。こちらも後ほど試していきたいと思います。






