Terraform - многострочный JSON в однострочный? - PullRequest
0 голосов
/ 07 августа 2020

Я создал строку JSON с помощью шаблона / интерполяции. Мне нужно передать это в local-exe c, который, в свою очередь, использует шаблон Powershell для вызова CLI.

Первоначально я пытался просто сослаться на шаблон json в самой команде Powershell

--cli-input-json file://lfsetup.tpl

.. однако шаблон не интерполируется.

Затем я попытался установить json на локальный. Однако это многострочный интерфейс, и это не нравится CLI. Может быть, если бы я мог преобразовать в одну строку?

Любые предложения или рекомендации приветствуются !! Спасибо

JSON (.tpl или переменная)

{
    "CatalogId": "${account_id}",
    "DataLakeSettings": {
        "DataLakeAdmins": [
            {
                "DataLakePrincipalIdentifier": "arn:aws:iam::${account_id}:role/Role1"
            },
            {
                "DataLakePrincipalIdentifier": "arn:aws:iam::${account_id}:role/Role2"
            }
        ],
        "CreateDatabaseDefaultPermissions": [],
        "CreateTableDefaultPermissions": []
    }
}

.tf

locals {
  assume_role_arn  = "arn:aws:iam::${local.account_id}:role/role_to_assume"
  lf_json_settings = templatefile("${path.module}/lfsetup.tpl", { account_id = local.account_id})
  cli_region = "region"
}

resource "null_resource" "settings" {
  provisioner "local-exec" {
    command     = templatefile("${path.module}/scripts/settings.ps1", { role_arn = local.assume_role_arn, json_settings = local.lf_json_settings, region = local.cli_region})
    interpreter = ["pwsh", "-Command"]
  }
}

.ps

$ErrorActionPreference = "Stop"
$json = aws sts assume-role --role-arn ${role_arn} --role-session-name sessionname
$accessTokens = ConvertFrom-Json (-join $json)
$env:AWS_ACCESS_KEY_ID = $accessTokens.Credentials.AccessKeyId
$env:AWS_SECRET_ACCESS_KEY = $accessTokens.Credentials.SecretAccessKey
$env:AWS_SESSION_TOKEN = $accessTokens.Credentials.SessionToken
aws lakeformation put-data-lake-settings --cli-input-json file://lfsetup.tpl --region ${region}
$env:AWS_ACCESS_KEY_ID = ""
$env:AWS_SECRET_ACCESS_KEY = ""
$env:AWS_SESSION_TOKEN = ""

Вывод: Для это я поместил вывод шаблона в локальный и передал локальный в PowerShell. Затем сделал вариации с / out jsonencde и попытался заменить '\ n'. Странные результаты в некоторых случаях: введите описание изображения здесь

1 Ответ

0 голосов
/ 08 августа 2020

Используйте средство подготовки файлов для создания файла. json из обработанного файла .tpl:

locals {
  ...
  settings_json_file = "/tmp/lfsetup.json"
}

resource "null_resource" "settings" {
   provisioner "file" {
     content     = templatefile("${path.module}/lfsetup.tpl", { account_id = local.account_id})
     destination = local.settings_json_file
   }
   provisioner "local-exec" {
     command     = templatefile("${path.module}/scripts/settings.ps1", role_arn = local.assume_role_arn, json_settings = local.settings_json_file, region = local.cli_region})
     interpreter = ["pwsh", "-Command"]
   }
}

Обновите файл .ps заменить file://lfsetup.tpl на file://${json_settings}

aws lakeformation put-data-lake-settings --cli-input-json file://${json_settings} --region ${region}
...