🍎

Terraform+Docker 環境構築

2022/03/20に公開

目標

  • Terraform CLIを叩ける環境をコンテナで作る

環境

  • macOS Big Sur v11.6.1(Intel)
  • Docker for Mac v4.3.1
    • Docker v20.10.11
    • docker-compose v1.29.2

前提

  • Docker for Macなどを導入し、docker・docker-composeコマンドを叩ける状態にする

手順

今回のプロジェクトのディレクトリ作成

mkdir <任意>

ディレクトリ構成

  • 作成したディレクトリ直下に、下記の通りディレクトリ、ファイルを作成
---- terraform
   │   └ src
   │   │   └ main.tf
   │   │   └ その他もろもろ // Terraform関連ソース(docker-composeでマウントする)
   │   └ home
   │   │   └ entrypoint.sh // TerraformコンテナのENTRYPOINTに指定するシェルコマンド
   │   └ root
   │   │   └ .bashrc // bashのエイリアスなどをここに記載
   │   └ Dockerfile
   └ docker-compose.yaml

docker-compose.yaml、Dockerfile作成

docker-compose.yaml

  • environmentはNewRelicをTerraformでコード化する際の例
docker-compose.yaml
version: "3.8"

services:
  terraform:
    container_name: tf
    build: ./terraform
    environment: // コンテナ内の環境変数を指定する => 導入するプロバイダーや求める環境次第
      - NEW_RELIC_API_KEY=${NEW_RELIC_API_KEY}
      - NEW_RELIC_ACCOUNT_ID=${NEW_RELIC_ACCOUNT_ID}
      - NEW_RELIC_REGION=US
    volumes:
      - ./terraform/src:/terraform/src

Dockerfile

Dockerfile
FROM python:3.6

# 前提となるパッケージのインストール
RUN apt-get update && apt-get install -y vim wget unzip sudo

# Terraformインストール (執筆時点での最新版を導入してます。バージョン一覧 => https://releases.hashicorp.com/terraform/)
RUN wget https://releases.hashicorp.com/terraform/1.1.7/terraform_1.1.7_linux_amd64.zip \
  && unzip ./terraform_1.1.7_linux_amd64.zip -d /usr/local/bin/ \
  && rm ./terraform_1.1.7_linux_amd64.zip

# コンテナ内でコマンドエイリアスをつくるため(任意)
COPY --chmod=777 ./root/.bashrc /root/.bashrc
# ENTRYPOINTに指定するシェルファイル
COPY --chmod=777 ./home/entrypoint.sh /home/entrypoint.sh

ENTRYPOINT ["/home/entrypoint.sh"]

(参考)その他のファイル

  • /terraform/src/main.tf
    • terraformのブロックが存在していれば entrypoint.sh に記載している $ terraform init はとりあえず通る
main.tf
# Terraformのコンフィグ
terraform {
  required_version = "~> 1.0"
  required_providers {
    newrelic = {
      source = "newrelic/newrelic"
    }
  }
}

# New Relic providerのコンフィグ => 環境変数で指定しているので中身は空
provider "newrelic" {}
  • /terraform/root/.bashrc
    • よく使うコマンドにはエイリアスを作っておくのが良い
.bashrc
alias ll='ls -la --color'
alias tf='terraform'
  • /terraform/home/entrypoint.sh
    • このシェルが正常終了するとコンテナもストップしてしまうので最終行でコンテナを稼働させ続けてる
entrypoint.sh
#!/bin/bash

# NewRelic用の設定
cd /terraform/src;
terraform init;

# NewRelic用の環境変数が正常にセットされているか確認
echo -e '\n\nenvironment';
echo '$NEW_RELIC_API_KEY=' $NEW_RELIC_API_KEY;
echo '$NEW_RELIC_REGION=' $NEW_RELIC_REGION;
echo '$NEW_RELIC_ACCOUNT_ID=' $NEW_RELIC_ACCOUNT_ID;

# コンテナを稼働し続ける
tail -f /dev/null

(参考)ローカルでの環境変数設定方法

CLIで設定する場合

$ NEW_RELIC_API_KEY=xxxx-xxxxxxxxxxxxxxxxxxxxxxx \
   && echo ${NEW_RELIC_API_KEY}

xxxx-xxxxxxxxxxxxxxxxxxxxxxx
$ NEW_RELIC_ACCOUNT_ID=1111111 \
   && echo ${NEW_RELIC_ACCOUNT_ID}

1111111

.zshenvで設定する場合

~/.zshenv
# NEWRELIC
export NEW_RELIC_API_KEY=xxxx-xxxxxxxxxxxxxxxxxxxxxxx
export NEW_RELIC_ACCOUNT_ID=1111111
  • ターミナルを開き直し、正しく環境変数が設定されていることを確認すること
echo ${NEW_RELIC_API_KEY}

xxxx-xxxxxxxxxxxxxxxxxxxxxxx

コンテナの立ち上げ

ビルド

$ docker-compose build

作成&起動

$ docker-compose up

起動確認

  • logs コマンドでコンテナ内のログを表示する
    • 想定通り [entrypoint.sh](http://entrypoint.sh) が動いているか確認する
$ docker logs tf
(参考)ログ
  • コメント行っぽく書いている箇所は /home/entrypoint.sh の記載内容と対比させるため追記している

    //----------------------
    // cd /terraform/src;
    // terraform init;
    //----------------------
    Initializing modules...
    
    Initializing the backend...
    
    Initializing provider plugins...
    - Reusing previous version of newrelic/newrelic from the dependency lock file
    - Using previously-installed newrelic/newrelic v2.39.2
    
    Terraform has been successfully initialized!
    
    You may now begin working with Terraform. Try running "terraform plan" to see
    any changes that are required for your infrastructure. All Terraform commands
    should now work.
    
    If you ever set or change modules or backend configuration for Terraform,
    rerun this command to reinitialize your working directory. If you forget, other
    commands will detect it and remind you to do so if necessary.
    
    //----------------------
    // echo -e '\n\nenvironment';
    // echo '$NEW_RELIC_API_KEY=' $NEW_RELIC_API_KEY;
    // echo '$NEW_RELIC_REGION=' $NEW_RELIC_REGION;
    // echo '$NEW_RELIC_ACCOUNT_ID=' $NEW_RELIC_ACCOUNT_ID;
    //----------------------
    environment
    $NEW_RELIC_API_KEY= NRAK-97G2CRZHP0MEY1JEEDRJ0O49TS5
    $NEW_RELIC_REGION= US
    $NEW_RELIC_ACCOUNT_ID= 3016590
    

コンテナ内でTerraformコマンドを使用できるか確認

コンテナに入る

docker exec -it tf /bin/bash

terraformコマンド使用確認

# terraform -v
Terraform v1.1.7
on linux_amd64
+ provider registry.terraform.io/newrelic/newrelic v2.39.2
  • コマンドが叩けたので目標達成!

(補足)今後の開発の流れについて

  1. /terraform ディレクトリ配下をローカルで修正
  2. コンテナの /terraform/src ディレクトリにて terraformコマンド(エイリアスで「tf」としてるのでそれでも可)を叩き、planやapply

という流れになります

Discussion