【问题标题】:Github Actions revert/destroy terraform AWS infrastructure created by Terraform PlanGithub Actions 恢复/销毁 Terraform Plan 创建的 terraform AWS 基础设施
【发布时间】:2021-11-04 11:49:25
【问题描述】:

我已经为 AWS 基础设施设置了 terraform,但无法设置可以触发销毁使用 Terraform 计划/应用创建的基础设施的工作流。

可以在不推送代码或创建拉取请求的情况下手动触发 github 操作吗?

我不想在 hashcorp 上注册工作区,而是想在 Github Actions 本身上运行管道。

有这个资源用于破坏基础设施,但它只适用于Pull request close

【问题讨论】:

  • actions 有一个[Re-run jobs],您可以使用它来手动触发它……这就是您要找的吗?
  • 不,所以我想在出现问题时触发手动销毁 terraform 基础设施。如果资源已存在,则计划失败。因此想要创建一个可以在需要时删除基础设施的作业。
  • 已在Manual workflows 上找到此资源,但我如何将其与先前 terraform 计划的状态文件联系起来
  • 我不明白...Plan fails if the resource already exist 只有在有人手动创建资源时才会发生这种情况,运行terraform destroy 不会“修复”这些错误
  • 好的,但是如果我已经创建了一个特性分支并且想在测试后销毁资源,我可以从 Github 操作中触发手动销毁吗?

标签: amazon-web-services terraform github-actions


【解决方案1】:

【讨论】:

  • 是的,但这不会将 Terraform 计划作业的状态文件链接到新的 terraform 销毁作业
  • 你的状态存储在哪里?您可以将该位置作为输入变量提供给workflow_dispatchterraform destroy 只关心你的状态。
  • 是的,我正在尝试在计划步骤成功后将状态文件存储到 AWS 并在销毁之前下载它
【解决方案2】:

我创建了另一个可以手动触发并使用状态文件破坏现有基础设施的工作流

为此,我需要存储状态文件。我将文件存储在 AWS S3 上。

注意:您可以使用 terraform Backend 来维护状态文件的版本

我没有这样做,因为我无法为不同的环境配置它,并且不允许使用变量。

以下是 Terraform create Infrastructure 作业中的更改:

- name: AWS Plan Copy
        id: copyfrom
        run: aws s3 cp s3://your-bucket/yourapp-${{ env.ENVIRONMENT }}.tfstate yourapp-${{ env.ENVIRONMENT }}.tfstate
        env:
          AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
          AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          AWS_DEFAULT_REGION: ${{ secrets.REGION }}
        continue-on-error: true // incase infra does not exist

- name: Terraform Plan
        id: plan
        if: ${{ github.event_name == 'pull_request' || github.event_name == 'push' }} // Plan creation is required both on pull_request, push
        run: terraform plan 
        continue-on-error: true

- name: Terraform Apply
        id: apply
        if: github.event_name == 'push'
        run: terraform apply -auto-approve
      
      - name: AWS Plan Copy
        if: github.event_name == 'push' && steps.apply.outcome == 'success'
        run: aws s3 cp terraform.tfstate s3://your-bucket/yourapp-${{ env.ENVIRONMENT }}.tfstate
        id: copy
        env:
          AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
          AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          AWS_DEFAULT_REGION: ${{ secrets.REGION }}

销毁工作流程:

name: Manually triggered workflow
on:
  workflow_dispatch:
    inputs:
      env:
        description: 'Environment'
        required: true
        default: 'dev'

jobs:
  destroy:
    name: "Destroy AWS"
    runs-on: ubuntu-latest
    steps:
        - name: AWS Plan Copy
          run: aws s3 cp s3://your-bucket/yourapp-${{ github.event.inputs.env }}.tfstate terraform.tfstate
          id: copy
          env:
            AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
            AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
            AWS_DEFAULT_REGION: ${{ secrets.REGION }}

        - name: Show Destroy plan
          run: terraform plan -destroy
          continue-on-error: true

        - name: Destroy resources jobs
          id: destroy
          run: terraform destroy -auto-approve

        - name: Delete plan file
          if: steps.destroy.outcome == 'success'
          run: aws s3 rm s3://your-bucket/yourapp-${{ github.event.inputs.env }}.tfstate
          env:
            AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
            AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
            AWS_DEFAULT_REGION: ${{ secrets.REGION }}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-12
    • 1970-01-01
    • 2019-06-08
    • 2022-10-13
    • 2019-07-17
    • 2017-04-03
    • 1970-01-01
    • 2021-10-25
    相关资源
    最近更新 更多