こんにちは。よっしーです(^^)
今日は、Terraformを使用したDockerコンテナの構成内容を変数で定義する方法についてご紹介します。
背景
これまで、Terraform を使用してマシン上で Docker コンテナを作成、更新および破棄をしました。これで有用な構成を作成するのに十分な Terraform の知識が得られましたが、これまでの例ではハードコーディングされた値が使用されていました。 Terraform 構成には、構成をより動的かつ柔軟にするための変数を含めることができますので、変数を使用方法について説明します。
Terraformのインストール記事に関しては、下記をご覧ください。
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"
}
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にあります。
何か質問や相談があれば、遠慮なくコメントしてください。また、エンジニア案件についても、いつでも相談にのっていますので、お気軽にお問い合わせください。
それでは、また明日お会いしましょう(^^)
コメント