パーソル&サーバーワークス

ENGINEER BLOG ENGINEER BLOG
  • 公開日
  • 最終更新日

【Terraform】コードをPushする際に.gitignoreで管理対象から除外する

この記事を共有する

目次

はじめに

皆さん、こんにちは!サービスGの三宅です。
Terraformを使ってインフラをコード管理しているとプロジェクト内で自動的に生成される.terraformフォルダなどの大きなファイルがGitの管理対象となってしまうことがあります。

これらのファイルはGitHubなどのリモートリポジトリにプッシュするとファイルサイズ制限に引っかかってエラーとなることがあります。
そこでこれらのファイルをGitの管理対象から除外する方法として、.gitignoreを使う方法を試しましたのでその内容について共有します。

前提

  • 事前にGitHub上でterraformというリモートリポジトリを用意しておきます。
  • 今回は開発環境としてAmazon EC2(Amazon Linux 2023)を利用します。
  • 開発環境では下記のようなディレクトリ構造で実施します。

スクリーンショット 2025-01-27 084023.jpg

GitHubにプッシュするとエラーが発生

まず、上記のディレクトリで作業を進め、GitHubにプッシュしてみます。

1. 変更を追加し、コミットしました

$ git add .
$ git commit -m "Add initial Terraform project structure and modules"

ここでは.terraform/内のファイルも含めてコミットしています。

2. GitHubリモートリポジトリを設定し、プッシュを試みます

$ git remote add origin https://github.com/git-test/terraform.git
$ git push origin main

すると、以下のようなエラーが返ってきました。

Enumerating objects: 18, done.
Counting objects: 100% (18/18), done.
Delta compression using up to 2 threads
Compressing objects: 100% (10/10), done.
Writing objects: 100% (17/17), 160.32 MiB | 21.34 MiB/s, done.
Total 17 (delta 1), reused 5 (delta 0), pack-reused 0
remote: Resolving deltas: 100% (1/1), done.
remote: error: Trace: fad95edb339294dd244898d210df40e5483642d66d10e8ecdbc0541a0edc4c43
remote: error: See https://gh.io/lfs for more information.
remote: error: File .terraform/providers/registry.terraform.io/hashicorp/aws/5.82.2/linux_amd64/terraform-provider-aws_v5.82.2_x5 is 626.73 MB; this exceeds GitHub's file size limit of 100.00 MB
remote: error: GH001: Large files detected. You may want to try Git Large File Storage - https://git-lfs.github.com.
To https://github.com/git-test/terraform.git
! [remote rejected] main -> main (pre-receive hook declined)
error: failed to push some refs to 'https://github.com/git-test/terraform.git'

このエラーは、GitHubに100MBを超える大きなファイルをプッシュしようとしたために発生しています。
エラーメッセージにもありますが、.terraform/providers/registry.terraform.io/hashicorp/aws/5.82.2/linux_amd64/terraform-provider-aws_v5.82.2_x5というファイルが 626.73MB と非常に大きいため、GitHubの制限を超えているとのことです。

GitHub での大きいファイルについて - GitHub Docs

.gitignoreを使ってファイルを除外する

今度はプッシュする前に事前にterraform/.gitignoreを作成しておきます。

ファイル内にはプッシュ時に管理対象から除外するファイルやディレクトリを記載します。

# .gitignore
.terraform/

これで.terraform/フォルダにあるすべてのファイルがGitの管理対象外となります。

過去のコミット履歴を削除

ただし、.gitignoreを追加しただけでは既にコミットされた大きなファイルはGitの履歴に残ったままとなり、再度GitHubにプッシュしても同じエラーが発生します。そのため、git filter-repoコマンドを使用して、リポジトリの履歴から大きなファイルを削除する必要があります。

$ git filter-repo --path .terraform/ --invert-paths

※前述で設定したリモートリポジトリURLなど、 .git/config ファイルに格納されている一部の構成が削除されます。

リポジトリからの機微なデータの削除 - GitHub Docs

再度Githubにプッシュする

履歴から不要なファイルを削除した後、変更を追加しコミットしました。

$ git add .
$ git commit -m "Add .gitignore to exclude .terraform/ directory"

再びGitHubリモートリポジトリを設定しプッシュを試みます。

$ git remote add origin https://github.com/git-test/terraform.git
$ git push origin main

以下のようにプッシュ成功の結果が返ってきました。

Enumerating objects: 15, done.
Counting objects: 100% (15/15), done.
Delta compression using up to 2 threads
Compressing objects: 100% (10/10), done.
Writing objects: 100% (15/15), 1.2 MiB | 1.2 MiB/s, done.
Total 15 (delta 5), reused 5 (delta 0), pack-reused 0
To https://github.com/git-test/terraform.git
e2db616..e5c5858 main -> main

以下のコマンドでも確認してみると.gitignore ファイルが正しく機能しており、.terraform/ は無視されていることが確認できます。

$ git status --ignored
On branch main
Ignored files:
(use "git add -f <file>..." to include in what will be committed)
.terraform/

nothing to commit, working tree clean

まとめ

Terraformを使ったインフラのコード管理はとても便利ですが、大きなファイルを誤ってプッシュしてしまうとエラーに直面します。その対処の一つとして今回は.gitignoreを使った方法を紹介しました。
初めから.gitignoreを用意しておくことでコミット履歴の削除などの手間はかかりませんが、もし誤って100MBを超えるファイルをコミットしてしまった場合でも今回の手順を試すことで対処することができます。

さいごに

この記事がどなたかの役に立てば幸いです。

この記事は私が書きました

三宅 啓右

年内を目標にAWS資格全冠を目指して奮闘中です 猫派でしたが最近犬派になりました。

三宅 啓右

この記事を共有する

クラウドのご相談

CONTACT

クラウド導入や運用でお悩みの方は、お気軽にご相談ください。
専門家がサポートします。

サービス資料ダウンロード

DOWNLOAD

ビジネスをクラウドで加速させる準備はできていますか?
今すぐサービス資料をダウンロードして、詳細をご確認ください。