Многострочные строки для команд локального выполнения terraform

Я изучаю Терраформ. В настоящее время я развертываю свое приложение на AWS. Я использую EC2, Cluster, Task Definition, ASG и другие.

Развертывание моего приложения включает в себя создание образа Docker с моим кодом Java, который находится в другом репозитории GitHub. Я использую GitHub Actions для развертывания.

Теперь часть моего кода Terraform выглядит так:

resource "null_resource" "build_docker_image" {

provisioner "local-exec" {
working_dir = var.work_directory
command     = \<\<EOF
aws ecr get-login-password --region ${var.region} | docker login --username AWS --password-stdin ${data.aws_caller_identity.current_user.account_id}.dkr.ecr.${var.region}.amazonaws.com && cd ${var.work_directory} && chmod +x ./mvnw && ./mvnw clean package && docker build -t ${var.back_repository_name} . && docker tag ${var.back_repository_name}:latest ${data.aws_caller_identity.current_user.account_id}.dkr.ecr.${var.region}.amazonaws.com/${var.back_repository_name}:latest && docker push ${data.aws_caller_identity.current_user.account_id}.dkr.ecr.${var.region}.amazonaws.com/${var.back_repository_name}:latest
EOF
}

triggers = {
"run_at" = timestamp()
}

}

Однако эта команда очень длинная, поскольку написана в одну строку.

Я пытался сделать эту строку короче, но мне это не удалось. Если я напишу эту команду в несколько строк, то при запуске Terraform (terraform apply) запустится только первая строка.

Я пробовал использовать bash, но это не сработало (<3>WSL (34) ОШИБКА: CreateProcessParseCommon:711: Не удалось перевести):


  provisioner "local-exec" {
    working_dir = var.work_directory
    command     = <<EOF
bash deploy.sh ${var.region} ${data.aws_caller_identity.current_user.account_id} ${var.back_repository_name}
    EOF
  }


#!/bin/bash
aws ecr get-login-password --region $1 | docker login --username AWS --password-stdin $2.dkr.ecr.$1.amazonaws.com
docker build -t $3 .
docker tag $3:latest $2.dkr.ecr.$1.amazonaws.com/$3:latest
docker push $2.dkr.ecr.$1.amazonaws.com/$3:latest

Кроме того, я пытаюсь использовать '/' или '\n', но это тоже не работает.

Пожалуйста, помогите мне решить проблему. Возможно, есть шаблоны для создания образа докера.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Из руководства по bash:

Символ обратной косой черты ‘\’ можно использовать для удаления какого-либо специального значения. для следующего прочитанного символа и продолжения строки.

Поэтому, если вы хотите разбить одну команду на несколько строк, вам нужно использовать символ \ в том месте, где вы хотите переместить команду на следующую строку:

resource "null_resource" "build_docker_image" {
  
  provisioner "local-exec" {
    working_dir = var.work_directory
    
    command     = <<EOF
aws ecr get-login-password --region ${var.region} | docker login \
--username AWS \
--password-stdin ${data.aws_caller_identity.current_user.account_id}.dkr.ecr.${var.region}.amazonaws.com && \
cd ${var.work_directory} && \
chmod +x ./mvnw && \
./mvnw clean package && \
docker build -t ${var.back_repository_name} . && \
docker tag ${var.back_repository_name}:latest ${data.aws_caller_identity.current_user.account_id}.dkr.ecr.${var.region}.amazonaws.com/${var.back_repository_name}:latest && \
docker push ${data.aws_caller_identity.current_user.account_id}.dkr.ecr.${var.region}.amazonaws.com/${var.back_repository_name}:latest
EOF
  }

  triggers = {
    "run_at" = timestamp()
  }
}

Или для лучшей читаемости начните heredoc с <<EOF- (обратите внимание на дефис), чтобы вы могли использовать отступы внутри heredoc, которые будут игнорироваться Terraform (Heredoc с отступом):

resource "null_resource" "build_docker_image" {

  provisioner "local-exec" {
    working_dir = var.work_directory
    command     = <<-EOF
    aws ecr get-login-password --region ${var.region} | docker login \
    --username AWS \
    --password-stdin ${data.aws_caller_identity.current_user.account_id}.dkr.ecr.${var.region}.amazonaws.com && \
    cd ${var.work_directory} && \
    chmod +x ./mvnw && \
    ./mvnw clean package && \
    docker build -t ${var.back_repository_name} . && \
    docker tag ${var.back_repository_name}:latest ${data.aws_caller_identity.current_user.account_id}.dkr.ecr.${var.region}.amazonaws.com/${var.back_repository_name}:latest && \
    docker push ${data.aws_caller_identity.current_user.account_id}.dkr.ecr.${var.region}.amazonaws.com/${var.back_repository_name}:latest
    EOF
  }

  triggers = {
    "run_at" = timestamp()
  }
}

Ты прав! Спасибо!

Maksym Matveichuk 28.07.2024 21:07

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