Ошибка: применение не разрешено для рабочих пространств с подключением VCS

#terraform #github-actions

#terraform #github-действия

Вопрос:

 Error: Apply not allowed for workspaces with a VCS connection
 

Я получаю эту ошибку при попытке применить план terraform с помощью действий Github.

Действие Github (применение terraform)

 - name: Terraform Apply Dev
  id: apply_dev
  if: github.ref == 'refs/heads/master' amp;amp; github.event_name == 'push'
  run: TF_WORKSPACE=dev terraform apply -auto-approve deployment/
 

Terraform workspace
Рабочее пространство было создано в Terraform Cloud как Version control workflow и вызывается app-infra-dev

Серверная часть Terraform

 # The configuration for the `remote` backend.
terraform {
  backend "remote" {
    hostname = "app.terraform.io"
    organization = "my-org-name"
    workspaces {
      prefix = "app-infra-"
    }
  }
} 
 

Итак, поскольку я вызвал свою рабочую app-infra-dev область, мой префикс рабочей области в бэкэнд-файле равен app-infra- и TF_WORKSPACE=dev установлен в моем действии GH. Я бы надеялся, что этого будет достаточно, чтобы заставить его работать.

Спасибо за любую помощь!

Ответ №1:

Тип вашего рабочего пространства должен быть «Рабочий процесс, управляемый API«.

https://learn.hashicorp.com/tutorials/terraform/github-actions

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

Извлечено из документации:

В рабочем процессе пользовательского интерфейса и VCS каждое рабочее пространство связано с определенной ветвью репозитория VCS конфигураций Terraform. Terraform Cloud регистрирует веб-ссылки у вашего поставщика VCS при создании рабочей области, а затем автоматически ставит в очередь запуск Terraform всякий раз, когда новые коммиты объединяются с этой ветвью связанного репозитория workspace.

https://www.terraform.io/docs/cloud/run/ui.html#summary

Ответ №2:

Вместо if: github.ref == 'refs/heads/master' amp;amp; github.event_name == 'push' этого вы можете рассмотреть возможность запуска apply для самого события GitHub, как в этом примере

 name: terraform apply

# Controls when the action will run.
on:
  # Triggers the workflow on push or pull request events but only for the main branch
  push:
    branches: [ master ]
 

В этом примере вы можете видеть, что terraform apply используется в конце последовательности команд terraform:

 
# A workflow run is made up of one or more jobs that can run sequentially or in parallel
jobs:
  # This workflow contains a single job called "build"
  apply:
    # The type of runner that the job will run on
    runs-on: ubuntu-latest

    # Steps represent a sequence of tasks that will be executed as part of the job
    steps:
      # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
      - uses: actions/checkout@v2
      - uses: hashicorp/setup-terraform@v1
        with:
          terraform_wrapper: true
          terraform_version: 0.14.0

      # Runs a single command using the runners shell
      - name: create credentials
        run: echo "$GOOGLE_APPLICATION_CREDENTIALS" > credentials.json
        env:
          GOOGLE_APPLICATION_CREDENTIALS: ${{ secrets.GOOGLE_APPLICATION_CREDENTIALS }}

      - name: export GOOGLE_APPLICATION_CREDENTIALS
        run: |
          echo "GOOGLE_APPLICATION_CREDENTIALS=`pwd`/credentials.json" >> $GITHUB_ENV
      - name: terraform init
        run: terraform init

      - name: terraform workspace new
        run: terraform workspace new dev-tominaga
        continue-on-error: true

      - name: terraform workspace select
        run: terraform workspace select dev-tominaga
        continue-on-error: true

      - name: terraform init
        run: terraform init

      - name: terraform workspace show
        run: terraform workspace show

      - name: terraform apply
        id: apply
        run: terraform apply -auto-approve
 

Проверьте, можете ли вы адаптировать это к своему рабочему процессу.

Комментарии:

1. Спасибо за предложение. Я попробовал то, что вы сказали, и удалил операторы if, которые у меня были, и все равно столкнулся с той же проблемой, когда дело доходит до применения: (