Terraformのoutputから.env環境変数ファイルを作成する
はじめに
データアナリティクス事業本部のkobayashiです。
Terraformを使ったプロジェクトでterraform outputで出力した値を環境変数として使いたい場面があったのでその方法をまとめたいと思います。
Output Values - Configuration Language | Terraform | HashiCorp Developer
Terrafrom outputで環境変数ファイルを作成する
Terraformを使っている際にoutput.tfを使うとTerraformで作成したリソース情報を出力することができます。今まではこのoutput.tfから出力された値はmodule間で出力された値をやり取りしたりterraform applyした際にコンソールに情報を出力するといった使い方をしていたのですが、リソース作成後に決まる値を環境変数として後続の処理で使用したい場合にterraform outputを使って作成できないかと考えたところjqを使ってうまく解決できました。
行いたい内容としては「output.tfのうちENV_
のプリフィックスの付いたもののみ環境変数として.env
に環境変数名=値
として出力する。」です。
内容としては以下のリソースを作成しているとします。
resource "aws_vpc" "main" { ... } resource "aws_subnet" "public" { ... } resource "aws_security_group" "https" { ... } resource "aws_lb" "webapp" { ... }
その際にoutput.tfとして以下のようなファイルがあるとします。
output "ENV_VPC_ID" { value = aws_vpc.main.id } output "SUBNET_ID" { value = aws_subnet.public.id } output "SG_ID" { value = aws_security_group.https.id } output "ENV_ALB_DNS_NAME" { value = aws_lb.webapp.dns_name }
これでリソース作成を行うと以下のような出力がされます。
$ terraform init $ terraform apply ENV_ALB_DNS_NAME = "aaaaaa-alb-00000000.ap-northeast-1.elb.amazonaws.com" ENV_VPC_ID = "vpc-333333333333333" SG_ID = "sg-1111111111111111" SUBNET_ID = "subnet-222222222222222"
この出力をそのままでもpython-dotenvなどを使うことで環境変数として扱えないことも無いですが、目的としてはENV_
のプリフィックスの付いたもののみ環境変数として出力したいのでterraform output
にjsonオプションを付けて出力した上でjqを使う事でうまくフィルタリングを行え出力する形式も変更することができます。
$ terraform output -json | jq -r 'to_entries | map(select(.key | startswith("ENV_")))|map("\(.key)=\(.value.value)")|.[]' > .env $ cat .env ENV_ALB_DNS_NAME=aaaaaa-alb-00000000.ap-northeast-1.elb.amazonaws.com ENV_VPC_ID=vpc-333333333333333
このような加工を行うことでterraform output
の出力結果をフィルタリングしつつ環境変数ファイルとして出力できます。
まとめ
terraformのoutput.tfの内容から環境変数ファイルを作成してみました。フィルタリングをjqを使って行ったため今回行った以外の加工もjqで行えるかと思うので色々試してみてください。
最後まで読んで頂いてありがとうございました。