こんにちは。KOUKIです。
前回に引き続き、Terraformの基礎を学習しましょう。
今回は、Terraformを使ってNode-REDコンテナを作成し、その情報を確認する方法を紹介します。
<目次>
前回
前回は、ここで確認ください。
他のリソースを参照する方法
前回、docker imageのリソースを作成しました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
# --- root/main.tf --- terraform { required_providers { docker = { source = "kreuzwerker/docker" } } } provider "docker" {} resource "docker_image" "nodered_image" { # docker image name = "nodered/node-red:latest" } |
nodered_imageは、nodered imageをローカルに落としてくるだけですが、このイメージを使ってdockerコンテナを作成したいと思います。
新しくdocker containerのリソースを作成し、docker imageを参照してみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 |
# --- root/main.tf --- ... resource "docker_container" "nodered_container" { name = "nodered" # https://registry.terraform.io/providers/kreuzwerker/docker/latest/docs/resources/image#read-only image = docker_image.nodered_image.latest ports { internal = 1880 external = 1880 } } |
imageに指定している「docker_image.nodered_image」は、先に指定したdocker imageのリソース名と定義した名前です。
そして、latestタグでimageのIDをdockerコンテナに指定しています。
これで準備ができたので、Terraformでコンテナを立ち上げてみましょう。
MakefileにTerraformコマンドをまとめておきましたので、よかったら使ってください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
.PHONY: init validate plan apply destroy fmt console show init: terraform init # docker-compose run --rm terraform init validate: terraform validate # docker-compose run --rm terraform validate plan: terraform plan # docker-compose run --rm terraform plan apply: terraform apply -auto-approve # docker-compose run --rm terraform apply -auto-approve destroy: terraform destroy -auto-approve # docker-compose run --rm terraform destroy -auto-approve fmt: terraform fmt -recursive --diff # docker-compose run --rm terraform fmt -recursive --diff console: terraform console # docker-compose run --rm terraform console show: terraform show # docker-compose run --rm terraform show |
コマンドを実行します。
1 2 |
make plan make apply |
docker psを確認すると、コンテナが起動していることがわかります。
1 2 3 |
$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES c14ed65af779 db209923532e "npm --no-update-not…" 10 seconds ago Up 7 seconds (health: starting) 0.0.0.0:1880->1880/tcp nodered |
ブラウザから「http://localhost:1880/」へアクセスします。

Terraform Console
Terrafromには、Console機能が提供されています。
1 2 3 |
$ make console terraform console > |
このコンソール上では、Terraformで作成したリソース情報の確認や関数の呼び出しが行えます。
先ほど立ち上げたNoderedのコンテナ名やIP Addressを出力してみましょう。
1 2 3 4 |
> docker_container.nodered_container.name "nodered" > docker_container.nodered_container.ip_address "172.17.0.2" |
便利そうですよね。
Outputs
Terraform情報を出力するのに「Outputs」も使えます。
例えば、以下のように使います。
1 2 3 4 5 6 7 8 9 10 11 12 |
# --- root/main.tf --- ... output "IP-Address" { value = docker_container.nodered_container.ip_address description = "The IP address of the container" } output "container-name" { value = docker_container.nodered_container.name description = "The name of the container" } |
ここで出力した情報はTerraformのコード内からも使えますが、apply後のConsole上に結果として表示することも可能です。
1 2 3 4 5 6 7 |
terraform apply -auto-approve ... Outputs: IP-Address = "172.17.0.2" container-name = "nodered" |
Terraform show
Terraformのshowコマンドで、情報の確認が行えます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 |
$ terraform show # docker_container.nodered_container: resource "docker_container" "nodered_container" { attach = false command = [] cpu_shares = 0 dns = [] dns_opts = [] dns_search = [] entrypoint = [ "npm", "--no-update-notifier", "--no-fund", "start", "--cache", "/data/.npm", "--", "--userDir", "/data", ] env = [] gateway = "172.17.0.1" group_add = [] hostname = "41a438a71872" id = "41a438a71872dbbd6ecc9fa620fda22bc3b61ebe4d2b7cf984bad2677f3545a0" image = "sha256:db209923532eb78b1ea206277ca8f50498c526709ac572b28cee7a8f8f5d4465" init = false ip_address = "172.17.0.2" ip_prefix_length = 16 ipc_mode = "private" links = [] log_driver = "json-file" log_opts = {} logs = false max_retry_count = 0 memory = 0 memory_swap = 0 must_run = true name = "nodered" network_data = [ { gateway = "172.17.0.1" global_ipv6_address = "" global_ipv6_prefix_length = 0 ip_address = "172.17.0.2" ip_prefix_length = 16 ipv6_gateway = "" network_name = "bridge" }, ] network_mode = "default" privileged = false publish_all_ports = false read_only = false remove_volumes = true restart = "no" rm = false security_opts = [] shm_size = 64 start = true stdin_open = false sysctls = {} tmpfs = {} tty = false user = "node-red" working_dir = "/usr/src/node-red" healthcheck { interval = "0s" retries = 0 start_period = "0s" test = [ "CMD-SHELL", "node /healthcheck.js", ] timeout = "0s" } ports { external = 1880 internal = 1880 ip = "0.0.0.0" protocol = "tcp" } } # docker_image.nodered_image: resource "docker_image" "nodered_image" { id = "sha256:db209923532eb78b1ea206277ca8f50498c526709ac572b28cee7a8f8f5d4465nodered/node-red:latest" latest = "sha256:db209923532eb78b1ea206277ca8f50498c526709ac572b28cee7a8f8f5d4465" name = "nodered/node-red:latest" repo_digest = "nodered/node-red@sha256:8c861522fddf1f71fb56fe0a881981cc79c40957a0816c11c6950ee67eb2c1d0" } Outputs: IP-Address = "172.17.0.2" container-name = "nodered" |
このままでも十分に使えますが、grepすることも可能です。
1 2 3 4 5 6 |
$ terraform show | grep name hostname = "41a438a71872" name = "nodered" network_name = "bridge" name = "nodered/node-red:latest" container-name = "nodered" |
次回
次回は、TerraformのFunctionsについて学びましょう。
Terraformまとめ
ソースコード
main.tf
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
# --- root/main.tf --- terraform { required_providers { docker = { source = "kreuzwerker/docker" } } } provider "docker" {} resource "docker_image" "nodered_image" { # docker image name = "nodered/node-red:latest" } resource "docker_container" "nodered_container" { name = "nodered" # https://registry.terraform.io/providers/kreuzwerker/docker/latest/docs/resources/image#read-only image = docker_image.nodered_image.latest ports { internal = 1880 external = 1880 } } output "IP-Address" { value = docker_container.nodered_container.ip_address description = "The IP address of the container" } output "container-name" { value = docker_container.nodered_container.name description = "The name of the container" } |
Makefile
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
.PHONY: init validate plan apply destroy fmt console show init: terraform init # docker-compose run --rm terraform init validate: terraform validate # docker-compose run --rm terraform validate plan: terraform plan # docker-compose run --rm terraform plan apply: terraform apply -auto-approve # docker-compose run --rm terraform apply -auto-approve destroy: terraform destroy -auto-approve # docker-compose run --rm terraform destroy -auto-approve fmt: terraform fmt -recursive --diff # docker-compose run --rm terraform fmt -recursive --diff console: terraform console # docker-compose run --rm terraform console show: terraform show # docker-compose run --rm terraform show |
コメントを残す
コメントを投稿するにはログインしてください。