TerraformでDockerの構成内容を変数で定義する

スポンサーリンク
TerraformでDockerの構成内容を変数で定義する ノウハウ
TerraformでDockerの構成内容を変数で定義する
この記事は約8分で読めます。
よっしー
よっしー

こんにちは。よっしーです(^^)

今日は、Terraformを使用したDockerコンテナの構成内容を変数で定義する方法についてご紹介します。

スポンサーリンク

背景

これまで、Terraform を使用してマシン上で Docker コンテナを作成、更新および破棄をしました。これで有用な構成を作成するのに十分な Terraform の知識が得られましたが、これまでの例ではハードコーディングされた値が使用されていました。 Terraform 構成には、構成をより動的かつ柔軟にするための変数を含めることができますので、変数を使用方法について説明します。

Terraformのインストール記事に関しては、下記をご覧ください。

https://amzn.to/3M0b7Y4

Terraformで変数を使用する

Terraformを利用してDockerでNGINX サーバーをプロビジョニングしました。今回は、変数を称してプロビジョニングします。

前回の復習

Terraformを利用してDockerでNGINX サーバーをプロビジョニングした手順は下記になります。

# 作業ディレクトリの作成
mkdir learn-terraform-docker-container

# 作業ディレクトリの移動
cd learn-terraform-docker-container

# tf用のファイルを作成
vi main.tf

# 初期化
terraform init

# Dokcerコンテナ起動 : localhost:8000 でnginxが起動していることを確認
terraform apply

main.tfの内容は下記になります。

terraform {
  required_providers {
    docker = {
      source  = "kreuzwerker/docker"
      version = "~> 3.0.1"
    }
  }
}

provider "docker" {}

resource "docker_image" "nginx" {
  name         = "nginx"
  keep_locally = false
}

resource "docker_container" "nginx" {
  image = docker_image.nginx.image_id
  name  = "tutorial"

  ports {
    internal = 80
    external = 8000
  }
}

変数

現在の構成には、多くのハードコードされた値が含まれています。 Terraform 変数を使用すると、柔軟で再利用しやすい構成を記述できます。 コンテナー名を定義する変数を追加します。 新しい container_name 変数を定義するブロックを含む variables.tf という名前の新しいファイルを作成します。

variable "container_name" {
  description = "Value of the name for the Docker container"
  type        = string
  default     = "ExampleNginxContainer"
}

Terraform は現在のディレクトリ内の .tf で終わるすべてのファイルをロードするため、構成ファイルには任意の名前を付けることができます。

main.tf で、新しい変数を使用するように docker_container リソース ブロックを更新します。 container_name 変数ブロックは、別の値を宣言しない限り、デフォルト値 (“ExampleNginxContainer”) になります。

赤字の部分が更新内容になります。

resource "docker_container" "nginx" {
  image = docker_image.nginx.image_id
  name  = var.container_name
  ports {
    internal = 80
    external = 8000
  }
}

適用

構成を適用します。確認プロンプトに「yes」で応答します。

terraform apply

docker ps コマンドでNAMESの欄が「ExampleNginxContainer」になっていれば成功です。

% docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED          STATUS          PORTS                  NAMES
ebc44eb2004f   6405d9b26faf   "/docker-entrypoint.…"   47 seconds ago   Up 46 seconds   0.0.0.0:8000->80/tcp   ExampleNginxContainer

ここで構成を再度適用します。今回は、-var フラグを使用して変数を渡すことにより、デフォルトのコンテナー名をオーバーライドします。 Terraform は、コンテナーの name 属性を新しい名前で更新します。確認プロンプトに yes で応答します。

terraform apply -var "container_name=YetAnotherName"

docker ps コマンドでNAMESの欄が「YetAnotherName」になっていれば成功です。

% docker ps                                           
CONTAINER ID   IMAGE          COMMAND                  CREATED         STATUS         PORTS                  NAMES
e77e5834a695   6405d9b26faf   "/docker-entrypoint.…"   2 seconds ago   Up 2 seconds   0.0.0.0:8000->80/tcp   YetAnotherName

コマンドラインから変数を設定しても、その値は保存されません。 Terraform では、変数を使用および設定するさまざまな方法がサポートされているため、コマンドを実行するときに変数を繰り返し入力する必要がなくなります。 詳細については、下記の公式サイトをご覧ください。

解説

variable ブロック

Terraformのvariableブロックは、Terraformファイル内で使用される変数を定義するために使用されます。このブロックを使用することで、Terraformファイル内で使用される値を外部から設定することができます。

variableブロックは、以下のような構文で定義されます。

variable "variable_name" {
  [type    = "type"]
  [default = "default value"]
}

変数名は”variable_name”の部分に指定し、その後にオプションとして変数の型、デフォルト値を設定することができます。

たとえば、以下のような変数ブロックを定義することができます。

variable "aws_region" {
  type    = string
  default = "us-west-2"
}

この場合、”aws_region”という名前の変数が定義されており、型はstring、デフォルト値は”us-west-2″に設定されています。これにより、Terraformファイル内の任意の場所で、変数”${var.aws_region}”を使用して、この変数の値を参照することができます。

また、変数ブロックは、Terraformの実行時に外部から渡された値で上書きすることができます。たとえば、以下のようにTerraformコマンドの-varオプションを使用して、変数を上書きすることができます。

terraform apply -var "aws_region=us-east-1"

このように、Terraformのvariableブロックを使用することで、Terraformファイル内で使用する値を動的に設定し、柔軟なインフラストラクチャ管理を実現することができます。

おわりに

今日は、Terraformを使用して、Dockerコンテナを変数を使用して構成する方法をご紹介しました。機会があれば、AWSでインフラ環境を構築する方法をご紹介しようと思います。

今回使用したTerraformのソースは下記のGitHubにあります。

よっしー
よっしー

何か質問や相談があれば、遠慮なくコメントしてください。また、エンジニア案件についても、いつでも相談にのっていますので、お気軽にお問い合わせください。

それでは、また明日お会いしましょう(^^)

https://amzn.to/3M0b7Y4

コメント

タイトルとURLをコピーしました