🍎
Terraform+Docker 環境構築
目標
- 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 ./root/.bashrc /root/.bashrc
# ENTRYPOINTに指定するシェルファイル
COPY ./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
- コマンドが叩けたので目標達成!
(補足)今後の開発の流れについて
- /terraform ディレクトリ配下をローカルで修正
- コンテナの /terraform/src ディレクトリにて terraformコマンド(エイリアスで「tf」としてるのでそれでも可)を叩き、planやapply
という流れになります
Discussion