Многострочные строки для команд локального выполнения 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', но это тоже не работает.

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


50
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()
  }
}