Terraformのoutputから.env環境変数ファイルを作成する

2024.01.01

はじめに

データアナリティクス事業本部の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環境変数名=値として出力する。」です。

内容としては以下のリソースを作成しているとします。

main.th

resource "aws_vpc" "main" {
...
}

resource "aws_subnet" "public" {
...
}

resource "aws_security_group" "https" {
...
}

resource "aws_lb" "webapp" {
...
}

その際にoutput.tfとして以下のようなファイルがあるとします。

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を使う事でうまくフィルタリングを行え出力する形式も変更することができます。

.env

$ 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で行えるかと思うので色々試してみてください。

最後まで読んで頂いてありがとうございました。