Терраформ уничтожить не удалось в CircleCI - PullRequest
0 голосов
/ 17 января 2019

В настоящее время я использую CircleCI в качестве инструмента CI для построения инфраструктуры AWS с использованием Terraform

Мой поток,

  1. Создание экземпляра AWS с использованием Terraform
  2. Установите Docker и запустите на нем образ Nginx
  3. Уничтожить инфраструктуру

Моя конфигурация CircleCI следующая,

version: 2
jobs:
  terraform_apply:
    working_directory: ~/tmp
    docker:
            - image: hashicorp/terraform:light
            - image: ubuntu:16.04

    steps:
      - checkout
      - run:
          name: terraform apply
          command: |
            terraform init
            terraform apply -auto-approve
      - store_artifacts:
          path: terraform.tfstate

  terraform_destroy:
    working_directory: ~/tmp
    docker:
            - image: hashicorp/terraform:light
            - image: ubuntu:16.04
    steps:
      - checkout
      - run:
          name: terraform destroy
          command: |
            terraform init
            terraform destroy -auto-approve

workflows:
  version: 2
  terraform:
    jobs:
      - terraform_apply
      - click_here_to_delete:
          type: approval
          requires:
            - terraform_apply
      - terraform_destroy:
          requires:
            - click_here_to_delete

Здесь я использую 2 задания, одно для создания и одно для удаления в рабочем процессе CircleCI.

Мое первое задание успешно выполняется, но когда я запустил второе, оно началось с нуля, поэтому я не смог получить предыдущее состояние применения terraform , следовательно, terraform не смог уничтожить мою уже созданную инфраструктуру.

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

1 Ответ

0 голосов
/ 17 января 2019

Вы должны использовать Удаленное состояние .

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

Вы можете смешивать и сопоставлять любые доступные бэкэнды состояний, но, поскольку вы уже используете AWS, возможно, имеет смысл использовать S3 бэкэнд .

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

В качестве примера у вас должно быть что-то вроде этого блока вв каждом из каталогов, в которых вы будете запускать Terraform:

terraform {
  backend "s3" {}
}

Затем вы можете завершить настройку во время terraform init:

terraform init -backend-config="bucket=uniquely-named-terraform-state-bucket" \
               -backend-config="key=state-key/terraform.tfstate"

Как только вы запустите terraform init, Terraform получит состояние из S3 для любых планов.Затем на terraform apply или terraform destroy он обновит файл состояния по мере необходимости.

Это позволит вам легко делиться состоянием между коллегами, а также с машинами CI / CD.Вам также следует рассмотреть возможность блокировки состояния с использованием DynamoDB, чтобы предотвратить повреждение состояния несколькими людьми, изменяющими состояние одновременно.Точно так же вы должны также рассмотреть возможность включения управления версиями в корзине S3, используемой для хранения вашего состояния, чтобы вы всегда могли вернуться к более ранней версии состояния в случае любых проблем.

...