Веб-Сервисы Amazon. Почему «Внешний» Источник Данных Всегда Выходит Из Строя?

  • Автор темы Pvepost
  • Обновлено
  • 22, Oct 2024
  • #1

Итак, моя проблема в том, что terraform действительно не нравится команда, которую я пытаюсь запустить, используя внешний источник данных.

Я пытаюсь обойти проблему, из-за которой terraform не будет ждать завершения операции шифрования KMS, прежде чем пытаться использовать зашифрованный текст, возвращаемый KMS. Я также поднял проблему в терраформировании по этому поводу.

Итак, вот что я пытаюсь сделать:

 
 data.external.encrypt_url: data.external.encrypt_url: failed to execute "bash":
bash: export ENC_HOOK_URL=$(aws --profile ${AWS_PROFILE} kms encrypt --key-id ${KMS_ALIAS} --plaintext ${HOOK_URL} --output json --region ${AWS_REGION}): 
No such file or directory
 

Это будет работать нормально без encrypt_url datasource but will fail with the following error when trying to run:

resource "aws_kms_alias" "kms_alias" { name = "alias/${var.lambda_name}" target_key_id = "${aws_kms_key.hook_url.arn}" } data "external" "encrypt_url" { program = ["bash", "export ENC_HOOK_URL=$(aws --profile $${AWS_PROFILE} \ kms encrypt --key-id $${KMS_ALIAS} --plaintext $${HOOK_URL} --output json \ --region $${AWS_REGION})"] } resource "aws_lambda_function" "lambda_function" { depends_on = ["data.external.encrypt_url"] filename = "deploymentPackage.zip" function_name = "${var.lambda_name}" role = "${var.lambda_role_arn}" handler = "index.lambda_handler" source_code_hash = "${base64sha256(file("deploymentPackage.zip"))}" runtime = "python3.6" publish = "true" environment { variables = { HOOK_URL = "${data.external.encrypt_url.result.ciphertextBlob}" } } tags { LastUpdated = "${var.timestamp}-${var.iamuser}-Terraform" } }

Теперь здесь не пытается вызваться ни один файл или каталог, и я не могу найти много информации об этом, поскольку эта функция недостаточно документирована.

Если у кого-нибудь есть подсказки, было бы здорово!

#amazon-web-services #terraform #amazon-kms

Pvepost


Рег
13 May, 2006

Тем
60

Постов
217

Баллов
557
  • 25, Oct 2024
  • #2

Команда, выполняемая

 
 
 
 
 data "external" "encrypt_url" {  

program = ["bash", "${path.module}/encrypt_url.sh"]
}
 
provider here is equivalent to the following:

#!/usr/bin/env bash aws --profile ${AWS_PROFILE} \ kms encrypt --key-id ${KMS_ALIAS} \ --plaintext ${HOOK_URL} \ --output json \ --region ${AWS_REGION}

Bash здесь терпит неудачу, потому что при таком использовании он ожидает, что его первым аргументом будет имя файла запускаемого сценария.

encrypt_url.sh option changes this interpretation so that it will instead expect this argument to be an встроенный скрипт бежать, и это, кажется, то, что вы здесь намеревались сделать. В конфигурации Terraform это можно выразить следующим образом:

data "external" "encrypt_url" { program = ["bash", "-c", "aws --profile $${AWS_PROFILE} kms encrypt --key-id $${KMS_ALIAS} --plaintext $${HOOK_URL} --output json --region $${AWS_REGION}"] }

Наряду с добавлением -c option, it also seems like this script doesn't actually do anything, instead just assigning a result to a variable. Given that you asked the AWS command to produce JSON, I think perhaps the following will do what you want:

data "external" "encrypt_url" { program = ["bash", "-c", "export ENC_HOOK_URL=$(aws --profile $${AWS_PROFILE} kms encrypt --key-id $${KMS_ALIAS} --plaintext $${HOOK_URL} --output json --region $${AWS_REGION})"] }

Однако в интересах удобства чтения я бы рекомендовал переместить эту команду во внешний файл сценария (например, -c ) and then referencing it from the config:

bash "export ENC_HOOK_URL=$(aws --profile ${AWS_PROFILE} \ kms encrypt --key-id ${KMS_ALIAS} --plaintext ${HOOK_URL} --output json \ --region ${AWS_REGION})"

...

external

Это позволяет избежать необходимости экранировать знаки доллара, позволяет редактировать его в режиме выделения сценария оболочки вашего текстового редактора и позволяет легко запускать сценарий вне Terraform в целях тестирования.

 

Гузи


Рег
15 May, 2020

Тем
89

Постов
199

Баллов
664
Похожие темы Дата
Похожие темы
Windows — Невозможно Запустить Playbook На Удаленном Компьютере С Помощью Шаблона Задания Ansible. Соединение Не Удалось
Дженкинс — Преобразовать Декларативный Конвейер В Скриптовый Конвейер
Рабочий Каталог Вызова Локального Хоста Ansible Playbook
Соль — Saltstack Указывает Шаблон И Заменяет Несколько Файлов В Каталоге И Совпадения Нескольких Строк.
Непрерывная Интеграция — Инструменты, Используемые На Уровне Предприятия Для Переноса Артефактов Сборки С Сервера Ci На Работающий Сервер.
Невозможно Запустить Нисходящее Задание Jenkins На Основе Плагина Продвигаемых Сборок
Jenkins - Вносите Конкретные Изменения (Исправление Дефекта), А Не Изменения Функций
Управление Затратами — Дешевая Альтернатива Базе Данных Azure Sql.
Aws Cli – Как Избежать Обрезания Вывода При Запуске Команды Aws Ssm?
Docker – Как Пользователь Контейнера И Пользователь Хоста Могут Иметь Доступ К Одним И Тем Же Файлам На Томе?
Тем
403,760
Комментарии
400,028
Опыт
2,418,908

Интересно