こんにちは。KOUKIです。
今回は、TerraformのFunctionsについて学びましょう。
<目次>
前回
join
join関数は、文字列結合時に役立ちます。
1 2 3 4 5 6 |
$ terraform console > join(";", ["thing", 1]) "thing;1" > join("-", ["this", "sentence", "has", 2 + 2, "dashes"]) "this-sentence-has-4-dashes" |
pythonとかで使うjoin関数と似てますね。
応用的な使い方も紹介しておきます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
# 前回作成したnoderedコンテナを立ち上げる terraform apply -auto-approve terraform console # コンテナの情報 > docker_container.nodered_container.ports[0].external 1880 > docker_container.nodered_container.ip_address "172.17.0.2" # joinする # ip address + port > join(":", [docker_container.nodered_container.ip_address, docker_container.nodered_container.ports[0].external]) "172.17.0.2:1880" |
この関数を使えば、このように「IP Address : Port」の文字列も簡単に作成できます。
もちろんjoin関数は、コードの中からでも利用可能です。
1 2 3 4 5 6 7 |
# --- root/main.tf --- output "IP-Address" { # value = docker_container.nodered_container.ip_address value = join(":", [docker_container.nodered_container.ip_address, docker_container.nodered_container.ports[0].external]) description = "The IP address of the container" } |
1 2 3 4 5 6 |
# 変更を反映 terraform apply -auto-approve # 確認 terraform output IP-Address = "172.17.0.2:1880" container-name = "nodered" |
複数のコンテナを立ち上げる方法
現在、noderedコンテナが一つだけ立ち上げっている状態ですが、このコンテナを複数同時に立ち上げる方法を見ていきましょう。
Randomリソース
Terraformには、Randomリソースがあります。これは、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 |
resource "random_string" "random" { length = 4 special = false upper = false } resource "random_string" "random2" { length = 4 special = false upper = false } resource "docker_container" "nodered_container" { name = join("", ["nodered", random_string.random.result]) image = docker_image.nodered_image.latest ports { internal = 1880 # external = 1880 } } resource "docker_container" "nodered_container2" { name = join("", ["nodered", random_string.random2.result]) image = docker_image.nodered_image.latest ports { internal = 1880 # external = 1880 } } |
random_stringは、ランダムな文字列を生成するリソースです。そして、結果を取得するにはresultを呼びます。
コンテナのリソースを2つ作り、nameに先ほど学習したjoin関数とrandomリソースから取得した文字列とをjoinし、コンテナ名にしています。
下記のコマンドで、変更を反映しましょう。
1 2 3 4 5 6 7 8 |
terraform init terraform plan terraform apply -auto-approve docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 6fa37e4bd5a0 db209923532e "npm --no-update-not…" 30 seconds ago Up 28 seconds (health: starting) 0.0.0.0:55001->1880/tcp noderedacv6 3da8c6c2d95c db209923532e "npm --no-update-not…" 2 minutes ago Up 2 minutes (healthy) 0.0.0.0:55000->1880/tcp nodered4p8z |
Count
複数のコンテナを作成することに成功しましたが、正直な話、少しばかり冗長です。
Terraformには、countパラメータが組み込まれており、これを使うともう少しスッキリとしたコードを書くことができます。
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 |
# --- root/main.tf --- resource "random_string" "random" { count = 2 # リソースを2つ作る length = 4 special = false upper = false } resource "docker_container" "nodered_container" { count = length(random_string.random) // random数分作る name = join("-", ["nodered", random_string.random[count.index].result]) 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" } |
複数作成したリソースにアクセスするには、Splat(*)オペレータを使います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
# 前回作成したリソースを削除する terraform destroy -auto-approve terraform plan terraform apply -auto-approve terraform output IP-Address = [ "172.17.0.2", "172.17.0.3", ] container-name = [ "nodered-obth", "nodered-mzc5", ] $ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES b244dfbb2c58 db209923532e "npm --no-update-not…" 30 seconds ago Up 27 seconds (health: starting) 0.0.0.0:55002->1880/tcp nodered-obth 72a5a40308cc db209923532e "npm --no-update-not…" 30 seconds ago Up 26 seconds (health: starting) 0.0.0.0:55003->1880/tcp nodered-mzc5 |
for
Terraformには、for文もあります。
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 |
$ terraform console > [for i in [1, 2, 3]: i + 1] [ 2, 3, 4, ] > [for i in docker_container. nodered_container[*]: i.name] [ "nodered-qww2", "nodered-hh7w", ] > [for i in docker_container. nodered_container[*]: i.ports[*]["external"]] [ tolist([ 55000, ]), tolist([ 55001, ]), ] > [for i in docker_container.nodered_container[*] : join(":", [i.ip_address],[i.name])] [ "172.17.0.2:nodered-qww2", "172.17.0.3:nodered-hh7w", ] |
もちろん、for文はコード内でも使えます。
1 2 3 4 5 6 7 8 |
# --- root/main.tf -- output "IP-Address" { value = [ for i in docker_container.nodered_container[*] : join(":", [i.ip_address], i.ports[*]["external"])] description = "The IP address of the container" } |
1 2 3 4 5 6 7 8 9 10 11 12 |
terraform apply -auto-approve ... Outputs: IP-Address = [ "172.17.0.2:55000", "172.17.0.3:55001", ] container-name = [ "nodered-qww2", "nodered-hh7w", ] |
ブラウザから「http://localhost:55000/」にアクセスするとNoderedコンテナに接続できます。

次回
次回は、Variablesについて学びましょう。
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 37 38 39 40 41 42 43 44 45 |
# --- 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 "random_string" "random" { count = 2 # リソースを2つ作る length = 4 special = false upper = false } resource "docker_container" "nodered_container" { count = length(random_string.random) // random数分作る name = join("-", ["nodered", random_string.random[count.index].result]) image = docker_image.nodered_image.latest ports { internal = 1880 # external = 1880 } } output "IP-Address" { value = [ for i in docker_container.nodered_container[*] : join(":", [i.ip_address], i.ports[*]["external"])] 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 35 36 37 38 |
.PHONY: init validate plan apply destroy fmt console show output 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 output: terraform output # docker-compose run --rm terraform output |
コメントを残す
コメントを投稿するにはログインしてください。