TerraformでDockerの構成内容を変更する

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

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

今日は、Terraformを使用したDockerコンテナの修正についてご紹介します。

スポンサーリンク

背景

先日の記事でTerraformによるDockerのコンテナ起動をしましたので、今回はコンテナの内容を修正する方法をご紹介します。

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

TerraformでDockerの構成内容を変更する

前回は、Terraformを利用してDockerでNGINX サーバーをプロビジョニングしました。今回は、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
  }
}

構成内容の変更

ここで、コンテナーの外部ポート番号を更新します。 8000 の ports.external 値を 8080 に置き換えて、main.tf のプロバイダー ブロックの下にある docker_container.nginx リソースを変更します。

赤字の箇所が修正内容になります。

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

  ports {
    internal = 80
    external = 8080
  }
}

この更新により、コンテナーが nginx サーバーにサービスを提供するために使用するポート番号が変更されます。 Docker プロバイダーは、作成後にコンテナーのポートを変更できないことを認識しているため、Terraform は古いコンテナーを破棄して新しいコンテナーを作成します。

構成内容の変更を適用

構成を変更した後、terraform apply を再度実行して、Terraform がこの変更を既存のリソースにどのように適用するかを確認します。

terraform apply

接頭辞 -/+ は、Terraformがリソースを更新するのではなく、破棄して再作成することを意味します。Terraformは一部の属性を更新することができますが(プレフィックスが~の場合)、Dockerコンテナのポートを変更する場合は再作成が必要です。Terraformはこれらの詳細を処理し、実行プランにはTerraformが何を行うかが表示されます。

Terraform will perform the following actions:

  # docker_container.nginx must be replaced
-/+ resource "docker_container" "nginx" {

さらに、実行計画では、ポートの変更がTerraformにコンテナを置き換えることを強制するものであることが示されています。この情報を使って、必要であれば破壊的な更新を避けるように変更を調整することができます。

      ~ ports {
          ~ external = 8000 -> 8080 # forces replacement
            # (3 unchanged attributes hidden)
        }

もう一度、Terraformは実行計画を進める前に承認を求めるプロンプトを表示します。計画したステップを実行するために、Yesと答えてください。

Do you want to perform these actions?
  Terraform will perform the actions described above.
  Only 'yes' will be accepted to approve.

  Enter a value: 

実行計画に示されているように、Terraform は最初に既存のコンテナーを破棄し、次にその場所に新しいコンテナーを作成しました。

docker_container.nginx: Destroying... [id=25fa3084a958fbccd17cb765fa9f8495bb621352cf8b6b8c9ab7e968b670cc8f]
docker_container.nginx: Destruction complete after 1s
docker_container.nginx: Creating...
docker_container.nginx: Creation complete after 0s [id=e83c8c8a016227af6a5dca13ddd1a2a98584f89b566ca9ee02f3c5bcbe05313f]

動作確認

Web ブラウザーで localhost:8080 にアクセスして、Nginxが起動していることが確認できます。

解説

Terraform init

Terraform initは、Terraformプロジェクトを初期化するためのコマンドです。このコマンドは、Terraformが使用するプラグイン、モジュール、バックエンドなどのリソースを準備するために使用されます。

具体的には、以下のような作業を行います。

  1. プロバイダプラグインのダウンロード:Terraformは、AWS、Google Cloud Platform、Microsoft Azureなどのクラウドプロバイダを操作するために、各プロバイダのプラグインを必要とします。Terraform initは、Terraformが必要とするプロバイダプラグインをダウンロードしてインストールします。
  2. バックエンドの設定:Terraform initは、Terraformが使用するバックエンドを設定します。バックエンドは、状態の保存先を決定するために使用されます。例えば、ローカルファイルシステム、Amazon S3、Google Cloud Storageなどがあります。
  3. モジュールの取得:Terraform initは、Terraformが使用するモジュールをダウンロードしてインストールします。モジュールは、共通の構成要素を再利用可能な形で定義することができるため、プロジェクトの構造をより効率的に管理することができます。

Terraform initコマンドを実行することで、プロジェクトの初期化作業を自動的に行うことができます。これにより、プロジェクトをより迅速に開始することができます。

今回の例では、Terraform は docker プロバイダーをダウンロードし、.terraform という名前の現在の作業ディレクトリの隠しサブディレクトリにインストールします。 terraform init コマンドは、インストールされているプロバイダーのバージョンを出力します。 また、Terraform は、使用するプロバイダーの正確なバージョンを指定する .terraform.lock.hcl という名前のロック ファイルを作成するため、プロジェクトで使用するプロバイダーをいつ更新するかを制御できます。

Terraform apply

Terraform applyは、Terraformで定義したインフラストラクチャの実際の作成、変更、または削除を実行するコマンドです。このコマンドを実行することで、Terraformが管理するインフラストラクチャが現在の状態と一致するように、必要なリソースの作成や変更が行われます。

Terraform applyコマンドを実行する前に、Terraformファイル(.tfファイル)に記述されたリソース定義を読み込み、構文エラーなどがないかを確認するために、Terraform planコマンドを実行することが推奨されます。Terraform planは、適用される変更内容をプレビューすることができるため、変更内容を確認することができます。

Terraform applyコマンドを実行すると、以下のような作業が行われます。

  1. Terraformが管理するインフラストラクチャの現在の状態を特定するために、Terraformが保持する状態ファイルが読み込まれます。
  2. 定義されたリソースが実際に存在するかどうかを確認し、必要なリソースが存在しない場合は、作成されます。
  3. 定義されたリソースが既に存在する場合は、指定された構成に従って変更されます。
  4. Terraformが管理するインフラストラクチャの状態を更新するために、Terraformが状態ファイルを更新します。

Terraform applyは、本番環境での変更や削除に使用する場合は注意が必要です。不具合が発生した場合には、手動で修正する必要があるため、事前に慎重なプランニングとテストが必要です。

変更を適用する前に、Terraform は、構成に合わせてインフラストラクチャを変更するために Terraform が実行するアクションを説明する実行計画を出力します。 出力形式は、Git などのツールによって生成される diff 形式に似ています。

今回の例で説明をすると、Terraform が docker_container.nginx リソースを作成することを意味します。 その下に、設定される属性が表示されます。 表示される値が (known after apply) の場合は、リソースが作成されるまで値が不明であることを意味します。 たとえば、Docker は作成時にイメージにランダムな ID を割り当てるため、変更を適用して Docker プロバイダーがその値を返すまで、Terraform は id 属性の値を知ることができません。

Terraform は一時停止し、続行する前に承認を待ちます。 計画に誤りや危険性があると思われるものがある場合は、インフラストラクチャを変更せずにここで中止しても問題ありません。 承認の場合、認プロンプトで yes と入力して続行します。

おわりに

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

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

よっしー
よっしー

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

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

コメント

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