我使用GitHub Actions通过Terraform更新(修改)了Azure的ResourceGroup

摘要

本文概述了使用Terraform和GitHub Actions创建Azure资源的流程,但由于未将tfstate文件存储在远程存储库中,因此无法更新(更改)创建的资源。因此,本次尝试解决了这个问题,现在可以正常更新。

运行环境

macOS Monterey 12.3.1 可使用的版本包括 python 3.8.12 和 Azure CLI 2.34.1。

事前准备的意思是事情发生之前所做的准备工作。

この記事のリポジトリと Github Actions の環境が準備されていること

この記事 にあるように Terraform の tfstate ファイル保存用のストレージアカウント・コンテナが準備されており、かつ、そのストレージアカウントの認証情報を入手できていること

ストレージアカウント情報

リソースグループ名 : rg-ituru-tfstate
アカウント名 : iturutfstate
コンテナ名 : tfstate

認証情報

ARM_ACCESS_KEY


在GitHub上进行额外的烹饪准备

将秘密密钥添加到GitHub帐户中

スクリーンショット 2022-09-12 10.00.52.png

需要的代码

只记录了来自该文章的修改文件。

Terraform代码

只有一个文件需要编辑。

# プロバイダーの定義
terraform {
  required_providers {
    azurerm = "~> 2.33"
  }
}

# tfstate ファイルの保存先(ローカルに保存の場合、不要)   <--- ここを追加
terraform {
  backend "azurerm" {
    resource_group_name   = "rg-ituru-tfstate"
    storage_account_name  = "iturutfstate"
    container_name        = "tfstate"
    key                   = "githubactions001/terraform.tfstate"
  }
}

provider "azurerm" {
  features {}
}

# リソースグループ
resource "azurerm_resource_group" "this" {
  name     = var.resource_group_name
  location = var.region
  tags     = var.tags_def
}

在 GitHub Actions 上更新并增加一个 YAML 文件。

编辑位于 .github/workflows 目录下的 terraform.yml 文件。

name: 'Terraform'
 
on:
  push:
    branches:
    - main
  pull_request:
 
jobs:
  terraform:
    name: 'Terraform'
    env:
      ARM_CLIENT_ID: ${{ secrets.ARM_CLIENT_ID }}
      ARM_CLIENT_SECRET: ${{ secrets.ARM_CLIENT_SECRET }}
      ARM_SUBSCRIPTION_ID: ${{ secrets.ARM_SUBSCRIPTION_ID }}
      ARM_TENANT_ID: ${{ secrets.ARM_TENANT_ID }}
      ARM_ACCESS_KEY: ${{ secrets.ARM_ACCESS_KEY }}           # <--- ここを追加
    runs-on: ubuntu-latest
 
    defaults:
      run:
        shell: bash

    steps:
    - name: Checkout
      uses: actions/checkout@v2
 
    - name: setup Terraform
      uses: hashicorp/setup-terraform@v1
      with:
        terraform_version: 1.0.11

    # - name: 'Terraform Format'
    #   run: terraform fmt -check -recursive

    - name: 'Terraform Init'
      run: terraform init

    - name: 'Terraform Plan'
      run: terraform plan -no-color -lock=false

    - name: Terraform Apply
      if: github.ref == 'refs/heads/main'
      run: terraform apply -auto-approve

如何以中文本地化的方式改述原文:如果您知道如何解决以下问题,请通知我,因为在运行Actions时对「Terraform Format」进行了注释,会导致出现以下错误。

## Errorメッセージ
Error: Terraform exited with code 3.
Error: Process completed with exit code 1.

新建Azure资源

尝试进行git push(创建新资源)。

通过进行git push操作,将会使用Terraform创建一个新的Azure ResourceGroup。

git add .
git commit -m "Actions commit"
git push -u origin main

从本地环境进行确认

使用Azure CLI,检查新创建的ResourceGroup。

$ az group show --name rg_ituru_github
{
  "id": "/subscriptions/xxxxxxxx-1717-4343-9797-zzzzzzzzzzzz/resourceGroups/rg_ituru_github",
  "location": "japaneast",
  "managedBy": null,
  "name": "rg_ituru_github",
  "properties": {
    "provisioningState": "Succeeded"
  },
  "tags": {
    "CostCenter": "PSG2",
    "Environment": "Github",
    "owner": "ituru",
    "period": "2022-09-12"
  },
  "type": "Microsoft.Resources/resourceGroups"
}

资源已成功创建!

确认Terraform tfstate文件

使用Azure CLI,检查存储账户容器中创建的tfstate文件。

## コンテナー内の BLOB を一覧表示する
$ az storage blob list --account-name iturutfstate --container-name tfstate -o table
Name                                Blob Type    Blob Tier    Length    Content Type      Last Modified              Snapshot
----------------------------------  -----------  -----------  --------  ----------------  -------------------------  ----------
githubactions001                    BlockBlob    Hot                                      2022-09-12T14:34:57+00:00
githubactions001/terraform.tfstate  BlockBlob    Hot          1080      application/json  2022-09-12T14:37:50+00:00

更新 Azure 资源

编辑标签信息

将标签信息按以下方式更新(将period从2022-09-12 更改为 2022-09-30)。

# タグ情報
variable "tags_def" {
  default = {
    owner       = "ituru"
    period      = "2022-09-25"        # <--- ここを更新
    CostCenter  = "PSG2"
    Environment = "Gitlab"
  }
}

# 各種パラメータ
variable "region" {}              // 利用リージョン
variable "resource_group_name" {} // リソースグループ名

尝试进行git push以更新资源。

通过执行 git push 命令,会更新 Terraform 中的 Azure ResourceGroup 的标签信息。

git add .
git commit -m "Tags_period Modify"
git push -u origin main

请确认来自本地环境。

使用Azure CLI检查更新后的ResourceGroup。

$ az group show --name rg_ituru_github
{
  "id": "/subscriptions/xxxxxxxx-1717-4343-9797-zzzzzzzzzzzz/resourceGroups/rg_ituru_github",
  "location": "japaneast",
  "managedBy": null,
  "name": "rg_ituru_github",
  "properties": {
    "provisioningState": "Succeeded"
  },
  "tags": {
    "CostCenter": "PSG2",
    "Environment": "Github",
    "owner": "ituru",
    "period": "2022-09-25"       # <--- 更新され、日付が変わっています
  },
  "type": "Microsoft.Resources/resourceGroups"
}

资源已经成功更新!


整理

通过使用 GitHub Actions 结合 Terraform 创建 Azure 资源,我们可以确认通过将 Terraform 的 tfstate 文件存储在远程存储中,无问题地更新(更改)资源。接下来,关于如何销毁创建的资源(即 terraform destroy),我想要集成删除资源的方法。

给一个额外的选择

获取用于 teffarom tfstate 的存储帐户的验证信息的方法(可以使用 Key1 或 Key2 中的任一)。

$ az storage account keys list --account-name $STORAGE_TF_ACCOUNT --subscription $SUBS_NAME --resource-group $RG_TF_NAME --output table
CreationTime                      KeyName    Permissions    Value
--------------------------------  ---------  -------------  ----------------------------------------------------------------------------------------
2021-12-04T16:11:49.888094+00:00  key1       FULL           pppppppppppppppppppppppppppp....ppppp
2021-12-04T16:11:49.888094+00:00  key2       FULL           qqqqqqqqqqqqqqqqqqqqqqqqqqqq....qqqqq

请参阅这篇文章。

感谢您提供以下文章作为参考。通过GitHub Actions使用Terraform创建AKS。使用GitHub Actions执行Terraform。azurerm。