AWS Vaultを使ってDockerコンテナ内でも安全にTerraformを実行してみた

AWS Vaultを使ってDockerコンテナ内でも安全にTerraformを実行してみた

2025.12.02

こんにちは。クラウド事業本部の桑野です。

みなさん、DockerコンテナでTerraformを実行する際、AWSクレデンシャルの管理はどうされていますか?

2025年11月、sha1-hulud脆弱性が発見され、平文で保存されているAWS Credentialが盗まれるリスクが現実的な脅威として認識されるようになりました。実際、私も過去の記事でDocker Compose実行時に.awsディレクトリをボリュームマウントする方法を紹介していましたが、この運用方法にはセキュリティ上の大きな問題があることを深刻に受け止めています。

環境変数として渡したり、ボリュームマウントで共有したりする方法は手軽ですが、クレデンシャルが平文で露出するリスクがあります。特にチーム開発やCI/CD環境では、このリスクを最小限に抑える必要があります。

今回は、AWS Vaultを使ってDockerコンテナ内でも安全にTerraformを実行する方法を共有します。AWS Vaultはクレデンシャルを暗号化して保管し、必要な時だけ一時的な認証情報を生成してくれる便利なツールです。これをDockerコンテナと組み合わせることで、sha1-huludのような脅威からも保護された、よりセキュアな開発環境を実現できます。

以下の記事を参考にしております。

https://dev.classmethod.jp/articles/aws-vault-role-chain-management-console/

https://dev.classmethod.jp/articles/aws-vault-credential-docker-container/

AWS Vaultとは

AWS Vaultは、AWSのクレデンシャルを安全に保管し、一時的なセッショントークンを生成するためのツールです。

主な特徴は以下の通りです。

  • クレデンシャルをOSのキーチェーン(macOSの場合Keychain)に暗号化して保存
  • 必要な時だけ一時的な認証情報(STS)を生成
  • MFA(多要素認証)にも対応
  • クレデンシャルがプレーンテキストで保存されることを防ぐ

https://github.com/99designs/aws-vault

今回は、このAWS VaultをDockerコンテナ環境と組み合わせて、Terraform実行時のセキュリティを向上させます。

構成内容

今回は、過去の記事で紹介したDocker Compose環境をベースに、AWS Vaultを組み込んだ構成にアップデートします。

https://dev.classmethod.jp/articles/colima-docker-terraform/

過去の記事からの主な変更点

  • 変更前: .awsディレクトリをボリュームマウント

    • 問題点: クレデンシャルが平文で共有される
  • 変更後: AWS Vaultで一時的な認証情報を環境変数として渡す

    • メリット: クレデンシャルを暗号化して保管、一時的なSTSトークンのみ使用

構築する内容

  • AWS Vaultでクレデンシャルを管理
  • Dockerコンテナ内でTerraformを実行
  • aws-vault execコマンドを使って一時的な認証情報をコンテナに渡す
  • 検証用にシンプルなVPCリソースを作成

前提

下記の条件で検証しています。

  • OS:macOS Sequoia バージョン 15.6.1
  • チップ:Apple M4
  • Docker Client:28.4.0
  • Docker Server:28.3.3
  • Colima:0.8.4
  • docker compose:2.39.3
  • AWS Vault:7.2.0

元々の構築手順については「構成内容」で取り上げた過去の記事をご参照ください。

また、IAMユーザーのクレデンシャル(アクセスキー、シークレットアクセスキー)を事前に発行しておきましょう。

構築

コードは下記GitHubリポジトリにて公開しています。

https://github.com/k-kuwan0/docker-with-aws-vault

1. AWS Vaultのインストール

HomebrewでAWS Vaultをインストールします。

brew install --cask aws-vault

インストールが完了したら、バージョンを確認しておきましょう。
私の場合は7.2.0でした。

aws-vault --version
v7.2.0

2. AWS Vaultへクレデンシャルを登録

AWS Vaultにクレデンシャルを登録します。今回はterraform-runnerというプロファイル名で登録します。

aws-vault add terraform-runner

コマンドを実行すると、以下のように入力を求められます。

Enter Access Key ID: AKIA...
Enter Secret Access Key: ****

事前に発行しておいたアクセスキーとシークレットアクセスキーを入力しましょう。

入力が完了すると、macOSのKeychainにクレデンシャルが暗号化して保存されます。
以下のコマンドで確認できます。

aws-vault list

実行結果

Profile                  Credentials              Sessions                 
=======                  ===========              ========                 
terraform-runner         terraform-runner         -             

3. docker-compose.ymlの変更

docker-compose.ymlをAWS Vault用に修正します。
過去の記事では以下の記述で構成していました。

変更前(過去の記事)

services:
  terraform-runner:
    container_name: terraform-runner
    build:
      context: ./dockerfiles
      dockerfile: terraform-runner/Dockerfile
    volumes:
      - ./terraform:/terraform-runner/terraform
      - ./.aws:/root/.aws:ro  # ← クレデンシャルを平文で共有
    entrypoint: sh
    tty: true

変更後(今回)

services:
  terraform-runner:
    container_name: terraform-runner
    build:
      context: ./dockerfiles
      dockerfile: terraform-runner/Dockerfile
    volumes:
      - ./terraform-runner:/terraform-runner
    environment: # ← 環境変数を定義
      - AWS_ACCESS_KEY_ID
      - AWS_SECRET_ACCESS_KEY
      - AWS_SESSION_TOKEN
    entrypoint: sh
    tty: true

主な変更点は以下の通りです。

  • .awsディレクトリのボリュームマウントを削除
  • AWS Vaultから渡される3つの環境変数(AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEYAWS_SESSION_TOKEN)を追加

4. docker composeの実行

AWS Vaultを使ってコンテナを起動します。
まずはDockerfileのビルドを行います。
この部分は特に変更点がありません。

docker compose build

次にupコマンドでコンテナを起動します。
このタイミングでAWS Vaultの情報をコンテナに渡します。
以下のコマンドを実行します。

aws-vault exec terraform-runner -- docker compose up -d

aws-vault exec terraform-runner --の部分で、AWS Vaultが以下の処理を行います。

  1. Keychainから暗号化されたクレデンシャルを取得
  2. AWS STSを使って一時的な認証情報を生成
  3. 生成した認証情報を環境変数(AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEYAWS_SESSION_TOKEN)にセット
  4. その環境変数を引き継いでdocker compose up -dを実行

https://github.com/99designs/aws-vault?tab=readme-ov-file#how-it-works

これにより、docker-compose.ymlで定義した環境変数に自動的に一時的な認証情報が設定されます。
先ほどdocker-compose.ymlに変更を加えたのは、環境変数がセットされる場所を作るためだったということですね。

実行時にはキーチェーンからパスワードを要求されます。

スクリーンショット 2025-12-02 14.20.41

パスワード認証が完了したら、コンテナが起動します。
devcontainerでterraform-runnerのコンテナにアクセスしましょう。

5. Terraform定義の変更

これまではマウントしたクレデンシャルからprofileを指定してTerraformを実行していました。
これからはAWS Vaultで環境変数を経由してTerraformを実行します。
ですので、backendブロックとproviderブロックからprofileの定義を削除する必要があります。

変更前(過去の記事)

provider "aws" {
  region = "ap-northeast-1"
  profile = "colima-docker-terraform"
}

terraform {
  backend "s3" {
    # お好みのバケット名を設定する
    bucket  = "terraform-state"
    key     = "terraform-container/terraform.state"
    region  = "ap-northeast-1"
    profile = "colima-docker-terraform"
  }
}

変更後(今回)

provider "aws" {
  region = "ap-northeast-1"
}

terraform {
  backend "s3" {
    # お好みのバケット名を設定する
    bucket  = "terraform-state"
    key     = "terraform-container/terraform.state"
    region  = "ap-northeast-1"
  }
}

これでTerraformがAWS Vaultからコンテナに渡された環境変数を使用することができます。

7. 検証

それでは実際にTerraformを実行してみましょう。
terraform-runnerコンテナ内で以下のコマンドを実行します。

cd /terraform-runner/environments/dev/
terraform init
terraform apply

AWSマネジメントコンソールにアクセスし、VPCが作成されていることを確認します。

スクリーンショット 2025-12-02 14.47.39

無事、AWS Vaultを経由してDockerコンテナ内からTerraformでリソースを作成できました。

8. AWSリソースの削除

今回作成したリソースは、放っておくとお金がかかり続けます。
実施が終わったあと、リソースを残しておく必要がなければ削除することを忘れずに行なっておきましょう。

terraform destroy

まとめ

いかがだったでしょうか?

AWS Vaultを使うことで、以下のメリットが得られます。

  • クレデンシャルをプレーンテキストで保存しない
  • 一時的な認証情報(STS)を使用するため、セキュリティリスクが低減
  • Dockerコンテナ環境でも安全にTerraformを実行可能
  • チーム開発やCI/CD環境でも応用できる

これまでに私が紹介していた、ボリュームマウントで.aws/credentialsを共有する方法は、平文で配置されており、gitignoreの設定次第でリポジトリに含めてしまう可能性があったことから、セキュリティ面で不安がありました。
しかし、今回のようにAWS Vaultを使えば、その不安を解消できます。

また、今回はTerraformでの利用例を紹介しましたが、AWS CLIを使う任意のコンテナ環境でも同様の方法が使えます。

セキュアなAWS開発環境を構築したい方は、ぜひ試してみてください。

最後までご覧いただきありがとうございました。

この記事をシェアする

FacebookHatena blogX

関連記事