Как передать массив и карты с помощью вызовов облачного API terraform

Мне нужно передать массив и значения карты в рабочее пространство terraform с помощью terraform api

пытался вызвать

{
    "data": {
      "id":"",
      "attributes": {
        "key":"PREFIXES",
        "value":'{a = "b"}',
        "description":"some description",
        "category":"terraform",
        "hcl": false,
        "sensitive": false
      },
      "type":"vars"
    }
  }

и завиток вызов

curl \
  --header "Authorization: Bearer $TOKEN" \
  --header "Content-Type: application/vnd.api+json" \
  --request PATCH \
  --data @payload.json \
  https://app.terraform.io/api/v2/workspaces/$WORKSPACE_ID/vars/$PREFIXES_ID

закончить с ошибкой

{"errors":[{"status":"400","title":"JSON body is invalid","detail":"784: unexpected token at '{    \"data\": {      \"id\":\"\",      \"attributes\": {        \"key\":\"PREFIXES\",        \"value\":'{a=\"b\"}',        \"description\":\"some description\",        \"category\":\"terraform\",        \"hcl\": false,        \"sensitive\": false      },      \"type\":\"vars\"    }  }'"}]}

Я попытался реализовать то же самое с помощью python. как всегда моя terraform дает ошибки:

Ошибка: недопустимый аргумент for_each

в строке 18 main.tf в ресурсе «aws_s3_bucket_object» «obj»: 18: for_each = переменные.префиксы

python3
def update_workspace_vars(workspace_vars, var_values, params):
    headers = {"Authorization": "Bearer " + params["TOKEN"],
               "Content-Type": "application/vnd.api+json"}
    for k in var_values:
        payload = {
            "data": {
                "id": workspace_vars[k],
                "attributes": {
                    "key": k,
                    "value": var_values[k],
                    "category": "terraform"
                },
                "type": "vars"
            }
        }
        patch_params = dict((k, params[k]) for k in ("workspace_id", "tfe_host"))
        patch_params.update({"var_id": workspace_vars[k]})
        url = "https://{tfe_host}/api/v2/workspaces/{workspace_id}/vars/{var_id}".format(**patch_params)
        response = http.request("PATCH", url, headers=headers, body=json.dumps(payload)).data


var_variables = {"prefixes": {"a": ["a1", "a2", "a3"], "b": ["b1", "b2", "b3"]}}

и мой код терраформирования:


resource "aws_s3_bucket" "b" {
  bucket = "my-tf-test-bucket-pinnaka"
  acl    = "private"
}

resource "aws_s3_bucket_object" "obj" {
  for_each = var.prefixes
  bucket = aws_s3_bucket.b.id
  key = each.key
  content = each.value
}```
"value":'{a = "b"}', JSON не использует одинарные кавычки для ключей или значений. Используйте двойные кавычки и избегайте \" двойных кавычек. "value":"{a=\"b\"}",stackoverflow.com/a/15637481/8016720
John Hanley 25.12.2020 19:44
Как сделать HTTP-запрос в Javascript?
Как сделать HTTP-запрос в Javascript?
В JavaScript вы можете сделать HTTP-запрос, используя объект XMLHttpRequest или более новый API fetch. Вот пример для обоих методов:
0
1
953
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Ваш JSON кажется недействительным.

{
    "data": {
      "id":"",
      "attributes": {
        "key":"PREFIXES",
        "value":'{a = "b"}',
        "description":"some description",
        "category":"terraform",
        "hcl": false,
        "sensitive": false
      },
      "type":"vars"
    }
  }

"value":'{a = "b"}' недопустимый синтаксис JSON.

Либо используйте "value": { "a" : "b"} как JSON, либо иначе "value":\"{a=\'b\'}\" избегайте одинарных кавычек, чтобы {"a"="b"} не анализировался как JSON.

Я создал имена локальных переменных local_prefix и передал var.prefixes в jsoncode.

это сработало.

locals{
 local_prefix = jsoncode(var.prefix)
}

применяется for_each для local_prefix

Другие вопросы по теме