👋

docker-composeでTerraform実行

2022/09/28に公開

このページについて

hashicorp/terraform のdocker imageを使って、docker-composeでTerraform実行させます。
https://hub.docker.com/r/hashicorp/terraform/

環境

  • Docker Desktop 4.12.0
  • docker-compose 2.10.2
  • aws-cli 2.7.27
  • direnv 2.32.1

AWS環境構築の場合

docker-compose.yaml
version: "3"

services:
  terraform:
    image: hashicorp/terraform:X.X.X
    volumes:
      - ~/.aws:/root/.aws:ro
      - ./:/workdir
    working_dir: "/workdir"
    environment:
      - AWS_ACCESS_KEY_ID
      - AWS_SECRET_ACCESS_KEY
      - AWS_SESSION_TOKEN
      - AWS_REGION
      - AWS_DEFAULT_REGION
      - AWS_PROFILE

image

hashicorp/terraform のtagでTerraformバージョンを指定します。

volumes

AWSの認証情報( ~/.aws )をReadOnlyでマウントします。
実行するディレクトリにはtfファイルが配置されている想定で、tfファイルをworking_dirにマウントします。

environment

必要なパラメータに応じて設定します。
以下のdirenvの設定も参考までに。

direnvの設定

https://github.com/direnv/direnv

AWSの認証情報を以下のように設定することも可能ですが、誤って .envrc ファイルをgitにあげてしまうリスクがあります。

.envrc
export AWS_ACCESS_KEY_ID=AKIXXXXXXXXXXXXXXXXXXXXXXXXX
export AWS_SECRET_ACCESS_KEY=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
export AWS_DEFAULT_REGION=ap-northeast-1

そのため、基本的には AWS_PROFILE のみを指定しておくことを推奨します。

.envrc
export AWS_PROFILE=sample-project

アクセスキー、シークレットアクセスキーは以下のように、 ~/.aws/credentials に記載しておきます。

~/.aws/credentials
[sample-project]
aws_access_key_id = AKIXXXXXXXXXXXXXXXXXXXXXXXXX
aws_secret_access_key = XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-configure-files.html

コマンド実行

tfファイルが配置されているディレクトリで、docker-compose実行します。

terraform plan

$ docker-compose run --rm terraform plan

terraform apply

$ docker-compose run --rm terraform apply

New Relic設定の場合

TerraformでNew Relicの設定をする場合に必要な設定は以下となります。

  • direnv
.envrc
export TF_VAR_new_relic_account_id="アカウントID文字列"
export TF_VAR_new_relic_api_key="APIキー文字列"
export TF_VAR_new_relic_region="US"
export TF_VAR_NEW_RELIC_API_SKIP_VERIFY=true
  • terraform
provider.tf
variable "NEW_RELIC_ACCOUNT_ID" {}
variable "NEW_RELIC_API_KEY" {}
variable "NEW_RELIC_REGION" {}
variable "NEW_RELIC_API_SKIP_VERIFY" {}

provider "newrelic" {
  account_id = var.NEW_RELIC_ACCOUNT_ID
  api_key    = var.NEW_RELIC_API_KEY
  region     = var.NEW_RELIC_REGION
  insecure_skip_verify = var.NEW_RELIC_API_SKIP_VERIFY
}
  • docker-compose
docker-compose.yaml
version: "3"

services:
  terraform:
    image: hashicorp/terraform:X.X.X
    volumes:
      - ~/.aws:/root/.aws:ro
      - ./:/workdir
    working_dir: "/workdir"
    environment:
      - AWS_ACCESS_KEY_ID
      - AWS_SECRET_ACCESS_KEY
      - AWS_SESSION_TOKEN
      - AWS_REGION
      - AWS_DEFAULT_REGION
      - AWS_PROFILE
      - TF_VAR_NEW_RELIC_ACCOUNT_ID
      - TF_VAR_NEW_RELIC_API_KEY
      - TF_VAR_NEW_RELIC_REGION
      - TF_VAR_NEW_RELIC_API_SKIP_VERIFY

tfstateをS3に置く場合もあるため、AWS認証情報については必要に応じて設定します。

変数について

https://registry.terraform.io/providers/newrelic/newrelic/latest/docs#argument-reference

insecure_skip_verify を使用して自己証明書の認証をスキップしないと、terraform applyでエラーになります。

Error: POST https://api.newrelic.com/graphql giving up after 1 attempt(s): Post "https://api.newrelic.com/graphql": x509: certificate signed by unknown authority

Datadog設定の場合

TerraformでDatadogの設定をする場合に必要な設定は以下となります。

  • direnv
.envrc
export TF_VAR_api_key="APIキー文字列"
export TF_VAR_app_key="APPキー文字列"
  • terraform
provider.tf
variable "api_key" {}
variable "app_key" {}

provider "datadog" {
  api_key = var.api_key
  app_key = var.app_key
}
  • docker-compose
docker-compose.yaml
version: "3"

services:
  terraform:
    image: hashicorp/terraform:X.X.X
    volumes:
      - ~/.aws:/root/.aws:ro
      - ./:/workdir
    working_dir: "/workdir"
    environment:
      - AWS_ACCESS_KEY_ID
      - AWS_SECRET_ACCESS_KEY
      - AWS_SESSION_TOKEN
      - AWS_REGION
      - AWS_DEFAULT_REGION
      - AWS_PROFILE
      - TF_VAR_api_key
      - TF_VAR_app_key

tfstateをS3に置く場合もあるため、AWS認証情報については必要に応じて設定します。

TF_VAR_name

https://www.terraform.io/cli/config/environment-variables#tf_var_name

参考記事

https://qiita.com/m0559reen/items/1e433ff9e6f6229c3291

GitHubで編集を提案
アイレット株式会社

Discussion