Terraform varsファイルを解析し、TF varsファイルの変数をMakefileのvarsとして保存したいと思います。

Terraform varsファイルを解析し、TF varsファイルの変数をMakefileのvarsとして保存したいと思います。

vars.tfTerraform変数ファイル()とMakefileという2つのファイルがあります。

私が望むのは、Makefileにvars.tfTerraformファイルの一部の変数を「読み取る」ことです。

文書vars.tf:

variable "region" {
    default = "us-west-1"
    description = "AWS Region"
}
variable "profile" {
    default = "bobs-profile"
    description = "Please enter your AWS CLI profile name"
}
variable "env" {
    default = "dev"
    description = "Please label the environment this infrastructure will be deployed to eg dev, uat, prod"
}

vars.tfMakefileのファイルにリストされている変数を呼び出すことができるようにしたいです。ここに簡単な例があります。

.ONESHELL:
.SHELL := /usr/bin/bash
.PHONY: apply plan prep
VARS="variables/$(ENV)-$(REGION).tfvars"
CURRENT_FOLDER=$(shell basename "$$(pwd)")
AWS_PROFILE"bobs-profile"

たとえば、次の値が必要です。

  • $(ENV)
  • $(REGION)
  • $(AWS_PROFILE)

vars.tfMakefileが次の変数として実行されるように、Terraformファイルから抽出します。

ENV=dev
REGION=us-west-1
AWS_PROFILE=bobs-profile

これを達成する方法はありますか?

ベストアンサー1

表示されるファイルは、HCL(HashiCorp構成言語)で作成されました。 JSONに変換して使用できますjq

HCLファイルをJSONに変換するには、次のものを使用できますyjhttps://github.com/sclevine/yj)。これにより、次のコマンドがすでにjq生成されている可能性がありますmake

eval "$(
    yj -cj <vars.tf |
    jq -r '
        [
            "make",
            (.variable[] | keys[]) as $key |
                "\($key)=\(.variable[][$key][].default)"
        ] | @sh'
)"

与えられた例では、次のコマンドが生成されます。

'make' 'env=dev' 'profile=bobs-profile' 'region=us-west-1'

評価時に名前付き変数を実行しmake、記載された値に設定します。変数は必要に応じて小文字で表示されます。たとえば、この設定は、ENVMakefileのシェルコマンドの実行方法に影響を与える可能性があります(ENVこれは、シェルの起動時にインポートする必要があるファイルを指すことができるシェルの特殊変数です)。

変数と値をタブ区切りリストにインポートして、シェルから読み取ることもできます。

set --

yj -cj <vars.tf |
jq -r '
    (.variable[] | keys[]) as $key |
    [ $key, .variable[][$key][].default ] |
    @tsv' |
{
    while IFS=$'\t' read -r key value; do
        set -- "$@" "$key"="$value"
    done

    make "$@"
}

次に、位置引数リストの変数とその値を収集し、makeそれを使用して呼び出します。問題の文書を考慮すると、実行されるコマンドは次のとおりです。

make 'env=dev' 'profile=bobs-profile' 'region=us-west-1'

ちなみに、上記で作成したJSONドキュメントyjは次のとおりです。

{
  "variable": [
    {
      "region": [
        {
          "default": "us-west-1",
          "description": "AWS Region"
        }
      ],
      "profile": [
        {
          "default": "bobs-profile",
          "description": "Please enter your AWS CLI profile name"
        }
      ],
      "env": [
        {
          "default": "dev",
          "description": "Please label the environment this infrastructure will be deployed to eg dev, uat, prod"
        }
      ]
    }
  ]
}

おすすめ記事