
こんにちは。よっしーです(^^)
今日は、Terraformでの状態管理について解説しています。
背景
下記の記事の続きになります。
実施内容
下記のコマンドを実行します。
docker run --name hashicorp-learn --detach --publish 8080:80 nginx:latest
git clone https://github.com/hashicorp/learn-terraform-import.git
cd learn-terraform-import
terraform import docker_container.web $(docker inspect -f {{.ID}} hashicorp-learn)
terraform show -no-color > docker.tf
terraform plan
警告やエラーが出力されるので、docker.tfファイルを下記の属性だけにします。
resource "docker_container" "web" {
    image = "sha256:xxx"
    name  = "hashicorp-learn"
    ports {
        external = 8080
        internal = 80
        ip       = "0.0.0.0"
        protocol = "tcp"
    }
}下記のコマンドを実行します。
terraform plan
terraform applydocker.tfファイルに下記のリソースを追加します。
resource "docker_image" "nginx" {
  name         = "nginx:latest"
}下記のコマンドを実行します。
terraform applydocker.tfファイルのdocker_container.webリソースで、image属性の値を書き換えます。
resource "docker_container" "web" {
    image = docker_image.nginx.image_id
    name  = "hashicorp-learn"
    ports {
        external = 8080
        internal = 80
        ip       = "0.0.0.0"
        protocol = "tcp"
    }
}下記のコマンドを実行します。
terraform applydocker.tfファイルのdocker_container.webリソースで、external属性の値を書き換えます。
resource "docker_container" "web" {
    image = docker_image.nginx.image_id
    name  = "hashicorp-learn"
    ports {
        external = 8081
        internal = 80
        ip       = "0.0.0.0"
        protocol = "tcp"
    }
}下記のコマンドを実行します。
terraform applyブラウザで「http://localhost:8081/」にアクセスして、下図のような画面になれば成功です。

解説
terraform import docker_container.web $(docker inspect -f {{.ID}} hashicorp-learn)
このコマンドはTerraformとDockerに関連しています。一つずつ説明していきましょう。
- terraform import: これはTerraformのコマンドで、既存のインフラストラクチャリソースをTerraformの状態に取り込むために使用されます。
- docker_container.web: これはTerraformの設定ファイル内で定義されているリソース名です。ここでは、- webという名前のDockerコンテナリソースを指しています。
- $(...): これはコマンド置換を行うシェルの構文です。括弧内のコマンドが実行され、その出力が親コマンドの引数として使用されます。
- docker inspect -f {{.ID}} hashicorp-learn: これはDockerのコマンドです。
- docker inspect: 指定されたDockerオブジェクト(ここではコンテナ)の詳細情報を取得します。
- -f {{.ID}}: 出力をフォーマットし、コンテナのIDのみを取得します。
- hashicorp-learn: これは対象となるDockerコンテナの名前です。
このコマンド全体の意味は以下のとおりです:
「hashicorp-learnという名前のDockerコンテナのIDを取得し、そのコンテナをTerraformの状態にdocker_container.webというリソース名でインポートする」
これにより、既存のDockerコンテナをTerraformの管理下に置くことができます。
terraform show -no-color > docker.tf
このコマンドは Terraform の状態を表示し、その出力を docker.tf ファイルに保存するものです。詳しく説明しましょう:
- terraform show: これは現在の Terraform の状態(state)を人間が読める形式で表示するコマンドです。このコマンドは、現在管理されているリソースの詳細な情報を出力します。
- -no-color: このオプションは、出力からANSIカラーコードを除去します。これにより、プレーンテキストの出力が得られます。
- > docker.tf: この部分はシェルのリダイレクト操作です。- >は標準出力をファイルにリダイレクトします。ここでは、- terraform showの出力を- docker.tfというファイルに保存します。
このコマンドの目的は通常、以下のようなケースで使用されます:
- 現在の Terraform の状態を HCL(HashiCorp Configuration Language)形式で取得し、それを新しい Terraform 設定ファイルの基礎として使用する。
- 既存のインフラストラクチャの状態を Terraform の設定ファイルとして保存し、それを基に今後の管理や変更を行う。
ただし、このコマンドの出力をそのまま Terraform の設定ファイルとして使用する場合は注意が必要です。出力には現在の状態に関する情報が含まれていますが、それがそのまま理想的な設定ファイルになるとは限りません。多くの場合、手動での編集や調整が必要になるでしょう。
おわりに
今日は、Terraformでの状態管理について解説しました。

何か質問や相談があれば、コメントをお願いします。また、エンジニア案件の相談にも随時対応していますので、お気軽にお問い合わせください。
それでは、また明日お会いしましょう(^^)
 
  
  
  
  



コメント