IaC(Terraformなど)で構成をコード化するなら、その土台はGitです。本記事は未経験〜駆け出しの方向けに、AWS運用の現場で必要になるGitのユースケース(最小ワークフロー→ブランチ/PR→tfstateの扱い→事故防止→CI/CD)を、コピペで動く断片つきで整理します。

01なぜGit — IaC は「構成をコードで管理」する

AWS の構成をマネジメントコンソールの手作業(ポチポチ)で作ると、「誰がいつ何を、なぜ変えたか」が残りません。同じ環境をもう一度作るのも一苦労です。IaC(Infrastructure as Code)は、構成を Terraform / CloudFormation / CDK などのコードで書き、そのコードを Git で管理する考え方です。

Git を挟むだけで、手作業では得られなかった安全網が手に入ります。

現場のコツ:「本番を直接触る」前に、「コードを直す → レビュー → 適用する」の順番に変える。この一手だけで事故は大きく減ります。

IaC の設計思想や、複数アカウントをコードで束ねる話は クラウドエンジニアの基礎(教科書)AWS Organizations 設計(IaC・委任) も合わせて読むと視野が広がります。

02最小ワークフロー — まずこれだけ

日々使うのは、ごく少数のコマンドです。「取得 → 変更 → 確認 → 記録 → 共有」の流れを体に入れましょう。

git clone https://github.com/my-org/my-iac-repo.git   # 最初の1回だけ
cd my-iac-repo

git status                 # 今どのファイルが変わっているか
git diff                   # 変更の中身を差分で確認

git add main.tf            # 記録したい変更をステージ(git add -p で部分選択も可)
git commit -m "vpc: サブネットを3AZに拡張"   # 1つの意味ある単位で記録

git pull                   # リモートの最新を取り込む(push 前に)
git push                   # 自分の変更を共有
git log --oneline --graph  # 履歴を1行ずつ・流れで確認
現場のコツ:迷ったら git status。今の状態と「次にやるべきこと」をGit自身が教えてくれます。

03ブランチとPR — main を直接触らない

チーム開発では、本番相当の main を直接触らず、作業ごとにブランチを切ります。作業が終わったらプルリク(PR)を出し、レビューを受けてからマージします。

git switch -c feature/add-nat-gateway   # ブランチを作って移動(旧: git checkout -b)
# ... main.tf を編集 ...
git add main.tf
git commit -m "network: プライベートサブネット用にNAT GWを追加"
git push -u origin feature/add-nat-gateway   # 初回は -u でひも付け

# → GitHub/GitLab 側でプルリクを作成し、terraform plan の結果を貼ってレビュー依頼
# → 承認されたらマージ。ローカルは main を最新化
git switch main
git pull
switch / restore は比較的新しいコマンドです。古い環境や資料では checkout が使われますが、同じことができます。git checkout -bgit switch -c と読み替えて構いません。

ブランチ運用の型(GitHub Flow など)そのものを深掘りしたい場合は GitHub Flow / GitLab Flow / トランクベースの比較 もどうぞ。

04ユースケース:IaCリポジトリの運用 — 入れないものを決める

IaC リポジトリで最初にやるのは、「Git に入れてはいけないもの」を .gitignore で除外することです。とくに Terraform の tfstate は Git 管理しません

# ---- .gitignore(IaCリポジトリの例)----
# Terraform
*.tfstate
*.tfstate.*
.terraform/
crash.log

# 環境ごとの値。機密を含みやすいので原則コミットしない
*.tfvars
!example.tfvars        # サンプルだけは共有したい場合は除外解除

# 認証情報・鍵
.env
*.pem
*.key
credentials
.aws/

state の置き場所(バックエンド)は、暗号化を有効にした S3 とロック用の DynamoDB テーブルで構成するのが定番です。

terraform {
  backend "s3" {
    bucket         = "my-tfstate-bucket"
    key            = "prod/network/terraform.tfstate"
    region         = "ap-northeast-1"
    dynamodb_table = "terraform-locks"   # 同時 apply を防ぐロック
    encrypt        = true                # 保存時暗号化
  }
}
現場のコツ:tfvars に機密を直書きするくらいなら、値は SSM パラメータストアや Secrets Manager に置き、Terraform から参照する。「秘密はコードに書かない」を最初のルールに。
もし state をうっかりコミットしてしまうと、機密が履歴に残ります。次のセクション(事故防止)の考え方が効いてきます。

05ユースケース:事故防止 — secrets はコミットしない

もっとも避けたい事故は、アクセスキーやパスワードをコミットして push してしまうことです。とくに公開リポジトリでは、上がった瞬間に自動収集される前提で動くべきです。

重要なのは順番です。履歴に一度入った秘密は、後から消すのが非常に困難です(履歴を書き換えても、clone された分は取り戻せません)。だから「消す」より先に、そのキーを無効化(ローテーション)するのが正解です。

コミット前に機械的に止める仕組みとして、AWS Labs 製の git-secretsgithub.com/awslabs/git-secrets)が定番です。Git のフックとして働き、AWS キーらしき文字列を含むコミットをブロックします。

# macOS: brew install git-secrets(他OSはリポジトリの手順を参照)
cd /path/to/my-iac-repo
git secrets --install          # このリポジトリにフックを入れる
git secrets --register-aws     # AWSキー検出パターンを登録
git secrets --scan             # 追跡中ファイルを走査
git secrets --scan-history     # 過去の履歴も走査
現場のコツ:サンプルに載せる値は必ず YOUR_ACCESS_KEY のようなダミーに。「後で消す」は間に合いません。

06ユースケース:AWSと繋ぐCI/CD — キーレスが基本

push をトリガに terraform plan / apply を回すと、レビュー済みのコードだけが AWS に反映されます。実行基盤は GitHub Actions や AWS CodePipeline が代表的です。

ここで重要なのが認証方法です。GitHub Actions から AWS を操作するとき、長期アクセスキーを Secrets に置くのは避け、OIDC で IAM ロールを引き受ける「キーレス」構成にするのが推奨です。

push すると plan / apply が回る(キーレス) 開発者 git push GitHub Actions ワークフロー実行 AWS IAM ロール OIDC 信頼で 一時認証情報を発行 Terraform plan / apply
静的なアクセスキーを置かず、GitHub が発行する OIDC トークンを AWS の IAM ロールが検証し、短時間だけ権限を貸す(キーレス)。

ワークフロー側は、id-token: write 権限を与え、aws-actions/configure-aws-credentials でロールを引き受けます。

permissions:
  id-token: write        # OIDCトークン発行に必須
  contents: read

jobs:
  terraform:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: aws-actions/configure-aws-credentials@v4
        with:
          role-to-assume: arn:aws:iam::123456789012:role/gha-terraform
          aws-region: ap-northeast-1
      - run: terraform init
      - run: terraform plan
      # apply は main へのマージ時だけ、人の承認を挟んで実行する

AWS 側は token.actions.githubusercontent.com を信頼する OIDC プロバイダを作り、IAM ロールの信頼ポリシーで sts:AssumeRoleWithWebIdentity を許可します。sub 条件で「対象リポジトリ・ブランチだけ」に絞るのが肝心です。

"Condition": {
  "StringEquals": {
    "token.actions.githubusercontent.com:aud": "sts.amazonaws.com"
  },
  "StringLike": {
    "token.actions.githubusercontent.com:sub": "repo:my-org/my-iac-repo:ref:refs/heads/main"
  }
}
ホスティング先について:AWS CodeCommit は2024年7月に新規顧客の受付を一旦停止しましたが、2025年11月に一般提供へ復帰し、新規登録が再び可能になりました(AWS公式)。ただし多くのチームはすでに GitHub / GitLab 等へ移行しており、本記事も GitHub / GitLab を前提に解説しています。選定時は最新の公式情報を確認してください。
現場のコツ:apply の権限は強力です。plan は誰でも回せてよいが、apply は main マージ時+人の承認、のように「読む」と「変える」を分けましょう。CI/CD の全体像は AWSのCI/CD入門 も参考に。

07つまづきポイント — 事故りやすい所

コンフリクト(衝突):pullmerge で同じ行を別々に変えていると、Git がファイルに衝突マーカーを書き込みます。両方を見て正しい形に手で直し、マーカーを消してから add → commit します。

<<<<<<< HEAD
  instance_type = "t3.small"
=======
  instance_type = "t3.medium"
>>>>>>> feature/scale-up

上の3種類のマーカー行(<<< / === / >>>)を削除し、残す方を決めて保存 → git addgit commit で解消完了です。

現場のコツ:「force を使いたくなった」ときは、たいてい設計かレビューの手前で無理をしています。まず落ち着いて git statusgit log で現状を確認しましょう。

08早見表 — Gitコマンド逆引き(1画面チートシート)

やりたいことコマンドひとことメモ
リポジトリを取得するgit clone リポジトリURL最初の1回だけ
今の状態を見るgit statuscommit前に必ず
変更の中身を見るgit diff差分で確認
記録する(部分選択も)git add -p → git commit -m "…"意味ある単位で
共有する/取り込むgit push / git pullpush前にpull
履歴を短く見るgit log --oneline --graph流れを把握
ブランチを作って移るgit switch -c feature/x旧: checkout -b
ブランチを切り替えるgit switch main旧: checkout
取り込む(マージ)git merge feature/xPR経由が基本
直前のcommitを戻す(未push)git reset --soft HEAD~1変更は手元に残る
作業を一時退避するgit stash / git stash pop割り込み対応
安全に強制pushするgit push --force-with-lease--force は避ける
secretsを走査するgit secrets --scan-historyawslabs製フック
特定コミットの中身を見るgit show コミットID中身確認
関連:AWS CLI 実践リファレンス(同シリーズ)、AWS Organizations 設計(IaC・委任)。基礎から積み上げたい方は 採用情報・カジュアル面談はこちら もどうぞ。

09よくある質問(FAQ)

tfstate は Git に入れてはいけないのですか?

入れないのが基本です。state には接続情報やパスワードが平文で含まれることがあり、複数人が同時に apply すると壊れる恐れもあります。暗号化を有効にした S3 バックエンド+DynamoDB ロックに置き、共有はバックエンド経由で行います。

間違ってアクセスキーをコミットしてしまいました。どうすれば?

まず対象のキーを無効化(ローテーション)してください。履歴からの削除より無効化が先です。一度 push すると取り戻せない前提で動き、git-secrets の導入と、以後はダミー値・環境変数・Secrets Manager 参照で再発を防ぎます。

CodeCommit と GitHub、どちらを使えばよいですか?

CodeCommit は2024年7月に新規受付を一旦停止し、2025年11月に一般提供へ復帰しました。ただし実運用では GitHub/GitLab が主流で、GitHub Actions の OIDC キーレス連携など周辺エコシステムも厚めです。最新の公式情報を確認しつつ、チームの標準に合わせて選ぶのが無難です。

git switch と git checkout の違いは?

できることは重なりますが、switch/restore は「ブランチ操作」と「ファイル復元」に役割を分けた新しめのコマンドで、誤操作が減ります。古い資料の checkout -b は switch -c に読み替えて構いません。

EMWは「基礎を積む姿勢」を大切にする札幌のAWSコンサルです。IaCやCI/CDの型づくり、Gitの運用ルール整備もご相談ください。未経験からの成長を後押しします。

相談する
← ブログ一覧へ戻る