OpenTacoのTerraformドリフト検出を試してみた

OpenTacoのTerraformドリフト検出を試してみた

2026.01.17

OpenTacoのドリフト検出機能を試してみました。

Terraformのドリフトとは

Terraformで管理しているリソースに対して、Terraform外から変更を加えるとTerraformコードと実環境の設定に差分がある状態になります。

この差分がある状態をドリフトと呼びます。

ドリフトが発生すると、次回のTerraform適用時に想定外の変更が発生することがあります。

Terraformで環境を運用し続ける場合は、ドリフトを検出する仕組みを用意しておくことが望ましいです。

OpenTacoのドリフト検出機能

OpenTacoにはドリフト検出機能が含まれています。

指定したチェック頻度でドリフトチェックを行い、通知等のアクションを行う機能です。

ドリフト時には自動で以下のアクションを実行できます。

  • GitHub Issueを自動で作成
  • Slackに通知

やってみた

以下を参考にドリフト検出機能を試してみました。

https://docs.opentaco.dev/ce/drift/slack-notifications
https://docs.opentaco.dev/ce/drift/github-issues

ドリフト検出の設定

今回はGitHub Actionsを使って設定します。

以下のワークフローファイルを用意します。

※ワークフローファイル内では、diggerという名称が登場します。これはOpenTacoのリブランド前の名称です。GitHubリポジトリや一部サンプルコードで引き続きdiggerとなっているため、ブログ上でも一部diggerという名称を使います。

.github/workflows/digger_drift.yml
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

動作確認: ドリフトの検出

以下で作成した環境でドリフトの検出を試してみます。

https://dev.classmethod.jp/articles/open-taco-terraform-pr-comment-plan-apply/

リソースを作成した後、EC2のタグを削除します。

これでコードと実リソースの設定差分(ドリフト)が発生しました。

タグを管理___EC2___us-east-1.png

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

random__Channel__-_test_-_Slack.png

Drift_detected_in_project__production_·_Issue__11_·_msato0731_quickstart-actions-aws.png

おわりに

ドリフト検出機能を自前で実装・運用するのは中々大変です。

OpenTacoを使うことでIssue作成やSlack通知も含めて簡単に実現できました。

今回は検出までですが、OpenTacoにはドリフト修復に役立つ機能もあります。こちらも後ほど試していきたいと思います。

https://docs.opentaco.dev/ce/drift/remediation

この記事をシェアする

FacebookHatena blogX

関連記事