💾

Terragrunt Provider Cache Serverを使いディスク容量の逼迫を回避する

に公開

はじめに

terragruntを利用する際、一般的に以下のようなディレクトリ構造[1]を取るかと思います。

└── live
    ├── prod
    │   ├── ec2
    │   │   └── terragrunt.hcl
    │   ├── rds
    │   │   └── terragrunt.hcl
    │   └── vpc
    │       └── terragrunt.hcl
    ├── qa
    │   ├── ec2
    │   │   └── terragrunt.hcl
    │   ├── rds
    │   │   └── terragrunt.hcl
    │   └── vpc
    │       └── terragrunt.hcl
    └── stage
        ├── ec2
        │   └── terragrunt.hcl
        ├── rds
        │   └── terragrunt.hcl
        └── vpc
            └── terragrunt.hcl

この時、実行環境が全てローカルマシンであることは稀かもしれませんが、今回の本質ではないので考慮外とします。全ての環境の全てのrootに対して同一のマシンでterraformを実行する場合、この構成では9つのrootが存在し、通常それぞれに.terragrunt-cacheディレクトリが作られそれぞれにAWS providerがダウンロードされます。

ここで、25年7月現在AWS providerは700MB程度あり、9箇所にダウンロードされると単純計算では6.3GBのディスクを使うことになります。

Provider Cache Server

terragruntではこの問題に対し、Provider Cache Serverという機能を用意しています。
https://terragrunt.gruntwork.io/docs/features/provider-cache-server/

あとは全て上記のページに書いています、終わり。

Provider Plugin Cacheとの関係

というのもアレなので、僭越ながら続けます。

terraformにも、Provider Plugin Cacheと呼ばれる同様の機能が用意されています。
https://developer.hashicorp.com/terraform/cli/v1.7.x/config/config-file#provider-plugin-cache

これは、terragruntの場合でも単一のrootに対しては(恐らく)機能します。
ただし、terraform/terragrunt両方のドキュメントに記載されている通り、terraform initの同時実行の際の挙動が保証されていません。

Note: The plugin cache directory is not guaranteed to be concurrency safe. The provider installer's behavior in environments with multiple terraform init calls is undefined.

一方で、terragruntを利用する以上run-all/stack runの利用は必須のはずで、従ってterraformのProvider Plugin Cacheは利用できません。

使用方法

有効化の方法

公式ドキュメントの通り、二通りの使用方法があります。
CI/CDパイプラインとの親和性を考えると個人的には環境変数が良いかとは思いますが、どちらでも良いと思います。

今回のケースに限った話ではありませんが、環境変数のprefix「TG_」はあるバージョン以前のterragruntではTERRAGRUNT_でした。現在は後方互換性の為に残されていますが、非推奨となっています。
https://terragrunt.gruntwork.io/docs/reference/cli-options/#provider-cache

キャッシュディレクトリのPATHについて

実行環境のOSに依ってデフォルトでは以下の場所にキャッシュ用のディレクトリが作成されます。

$HOME/.cache/terragrunt/providers on Unix systems
$HOME/Library/Caches/terragrunt/providers on Darwin
%LocalAppData%\terragrunt\providers on Windows

また、TG_PROVIDER_CACHE_DIRで任意のPATHを指定することも可能です。
更に、未検証ですがhostの設定もあるため外部サーバをキャッシュサーバとする運用も可能だと考えられます。

小ネタ1

How Terragrunt Provider Caching worksは使う分には特に読まなくても問題ありませんが、Provider Cache Serverは、裏ではsymbolic linkの仕組みを使っています。
ここで、Linux系では問題にならないはずですが、Windowsでは管理者権限または開発者モードでなければシンボリックリンクを作成することができず、設定は正しいはずなのに正常に動作しない(各.terragrunt-cacheにproviderがダウンロードされてしまう)という現象が発生します。

小ネタ2

providerのバージョンを固定しない場合、キャッシュディレクトリにどんどん新しいバージョンのproviderがダウンロードされます。別途対策が必要です。

おわりに

この記事が誰かのディスクを救うことになれば幸いです。

脚注
  1. 公式ドキュメントから抜粋し分かりやすさのために一部変更しています。 ↩︎

Discussion