中文:使用VS Code Remote Container配置Azure + Terraform + GitHub Actions环境

引言

我使用 Fork 和 Clone 来创建了一个能够快速在 Azure 上使用 Terraform 的 devcontainer。我使用了 VS Code 的 Remote Development (Remote – Containers) 功能,因此只要在本地拥有 VS Code 和 Docker Desktop 的环境,就可以通过简单的准备来执行以下操作。

    • Terraform で Azure を管理する

terraform や Azure CLI az コマンドがすでに Docker コンテナ上のインストールされています。

GitHub Actions で Push された内容を自動で反映する

GitHub仓库地址如下:
https://github.com/hoisjp/terraform-azure-ghactions-devcontainer

步骤 (bù

需要在事前准备的物品

请准备以下物品。只需要这些!

    1. Visual Studio Code:https://code.visualstudio.com/download

VS Code扩展:VS Code远程开发(远程-容器)

Docker桌面版:https://www.docker.com/get-started
无论是Windows、Mac还是Linux操作系统都可以使用。

来吧!远程开发!

Reopen in containers

使用Terraform操作Azure

Terraform后端用于Azure存储。

首先,我们尝试创建一个用于Terraform后端的Azure存储。这个存储是必需的,用于管理Terraform的状态。

    1. 使用VS Code打开终端。应该在存储库的主目录中。

$ pwd
/workspace/<你的存储库名>

登录到Azure。打开登录页面并输入指定的代码进行身份验证。下面的************部分进行替换。

$ az login
To sign in, use a web browser to open the page https://microsoft.com/devicelogin and enter the code ************ to authenticate.

成功登录后,您将收到以JSON格式返回的拥有的Azure订阅列表。

选择适当的订阅,执行以下命令。请使用自己的订阅GUID替换先前JSON结果的id属性。

$ az account set –subscription <你的订阅GUID>

然后,切换到以下目录。

$ cd 00-create-azurerm-backend

为执行Terraform需要初始化状态。
执行以下terraform init命令。

$ terraform init

正在初始化后端…

正在初始化提供程序插件…

Terraform初始化成功!

现在可以开始使用Terraform进行操作。尝试运行”terraform plan”以查看基础架构所需的任何更改。现在,在Terraform上运行的所有命令都应该可以工作。

如果您曾经设置或更改过Terraform的模块或后端配置,请重新运行此命令以重新初始化您的工作目录。如果您忘记了,其他命令将检测到并提醒您必要时重新运行该命令。

初始化成功后,请执行terraform plan。
您将被要求输入存储帐户名称。它必须在全球范围内是唯一的。输入一个不与其他名称重复的名称。

$ terraform plan

var.backend_storage_account_name
用于terraform后端的存储帐户名称

输入值:****

如果输出以下类似terraform plan的结果,则说明成功。



计划:添加3个,更改0个,销毁0个。

注意:如果没有登录到Azure,则会显示以下错误消息。请返回并继续从az login开始。

错误:构建AzureRM Client时出错:仅支持以用户(而不是服务主体)的方式进行Azure CLI的身份验证。

执行terraform apply以创建资源。将再次要求输入存储帐户名称,因此输入之前在terraform plan中确认的名称。

$ terraform apply

var.backend_storage_account_name
用于Terraform后端的存储帐户名称

输入值:****

您将收到确认消息,如果同意,请输入yes。



计划:添加3个,更改0个,销毁0个。

是否要执行这些操作?
Terraform将执行上述描述的操作。
只接受“yes”以批准。

输入值:yes

创建成功。稍等片刻。

azurerm_resource_group.rg: 创建中…
azurerm_resource_group.rg: 创建完成后经过0秒[ id=/subscriptions/****GUID****/resourceGroups/terraform-rg ]
azurerm_storage_account.strg: 正在创建…
azurerm_storage_account.strg: 正在创建… [已经过去10秒]
azurerm_storage_account.strg: 正在创建… [已经过去20秒]
azurerm_storage_account.strg: 创建完成后经过20秒 [ id=/subscriptions/****GUID****/resourceGroups/terraform-rg/providers/Microsoft.Storage/storageAccounts/****你的存储帐户名称**** ]
azurerm_storage_container.strg-container: 创建中…
azurerm_storage_container.strg-container: 创建完成后经过0秒 [ id=https://********.blob.core.windows.net/tfstate ]

如果显示以下消息,则说明完成!

Apply complete! Resources: 3 added, 0 changed, 0 destroyed.

最后,确认一下存储帐户是否已成功创建。

$ az group show –name terraform-rg –out table
(结果)

$ az storage account show –name ‘<用您的名称替换>’ –out table
(结果)

使用GitHub Actions进行操作

如果您了解机制,请查看以下文件的页面比较快速。

在Blob存储中,准备远程状态文件。

    1. 在GitHub的秘密位置中存储Azure的认证信息,即服务主体。请用以下命令替换:

az ad sp create-for-rbac –name “” –role contributor –sdk-auth

当执行上述命令后,会返回以下JSON结果。在后续的步骤中会使用到。

{
“clientId”: “XXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXXX”,
“clientSecret”: “XXXXXXXXXXXXXXXXXXXXXXXXXXXXX”,
“subscriptionId”: “XXXXXXXXX-XXXXX-XXXX-XXXX-XXXXXXXXXXXXX”,
“tenantId”: “XXXXXXXX-XXXXX-XXXX-XXXX-XXXXXXXXXXX”,

}

在GitHub的存储库页面上,选择”设置”-> “秘密”菜单。使用以下秘密名称添加4个秘密。

ARM_CLIENT_ID
ARM_CLIENT_SECRET
ARM_SUBSCRIPTION_ID
ARM_TENANT_ID

从存储库中的01-hello-azure.yml工作流文件中提取一部分如下所示。将以下4行添加到env变量中。

env:
tf_version: ‘latest’
tf_working_dir: ’01-hello-azure’
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
# add below 4 lines from the result of “az ad sp create-for-rbac …”
ARM_SUBSCRIPTION_ID: ${{ secrets.ARM_SUBSCRIPTION_ID }}
ARM_CLIENT_ID: ${{ secrets.ARM_CLIENT_ID }}
ARM_CLIENT_SECRET: ${{ secrets.ARM_CLIENT_SECRET }}
ARM_TENANT_ID: ${{ secrets.ARM_TENANT_ID }}

然后,使用hashicorp/setup-terraform@v1的uses命令设置terraform命令:

– name: “Terraform Setup”
uses: hashicorp/setup-terraform@v1
with:
terraform_version: ${{ env.tf_version }}

执行各种terraform命令,例如init, plan, apply。当进行terraform apply时,指定推送条件时,在拉取请求时不会执行apply操作。而在合并并推送时会反映配置。此外,重要的是要添加-auto-approve选项。如果没有该选项,工作流程执行时将等待yes输入。

– if: github.event_name == ‘push’
name: ‘Terraform Apply’
run: terraform apply -auto-approve
working-directory: ${{ env.tf_working_dir }}

声明指定文件。

从下次开始,在执行terraform init时,指定state文件。

用 HCL 文件定义文件的指定。

resource_group_name  = "terraform-rg"
storage_account_name = "tfstatehoisjp" # replace here by yours
container_name       = "tfstate"
key                  = "terraform.tfstate.00-hello-azure"

使用terraform init命令,指定文件路径。

$ terraform init -backend-config=backend-prod.hcl

Initializing the backend...

Successfully configured the backend "azurerm"! Terraform will automatically
use this backend unless the backend configuration changes.

Initializing provider plugins...
- Finding hashicorp/azurerm versions matching "~> 2.71.0"...
- Installing hashicorp/azurerm v2.71.0...
- Installed hashicorp/azurerm v2.71.0 (signed by HashiCorp)

Terraform has created a lock file .terraform.lock.hcl to record the provider
selections it made above. Include this file in your version control repository
so that Terraform can guarantee to make the same selections by default when
you run "terraform init" in the future.

Terraform has been successfully initialized!

You may now begin working with Terraform. Try running "terraform plan" to see
any changes that are required for your infrastructure. All Terraform commands
should now work.

If you ever set or change modules or backend configuration for Terraform,
rerun this command to reinitialize your working directory. If you forget, other
commands will detect it and remind you to do so if necessary.

在工作流文件中,初始化如下所示。

    - name: 'Terraform Init'
      run: terraform init -backend-config=backend-prod.hcl
      working-directory: ${{ env.tf_working_dir }}

定制

一旦开始动手,您就会想要对各种环境进行自定义设置。您可以通过更改以下文件来进行自定义设置。
更多详情请参考VS Code的文档。

    • .devcontainer/devcontainer.json

.devcontainer/Dockerfile

Azure CLI のイメージ mcr.microsoft.com/azure-cli:latest をベースに、Terraform 各種をインストールしています。

个人化 dotfiles 的口味调整

在团队中使用这个存储库非常方便,但可能会有个别偏好,例如Shell配置。当遇到这种情况时,每个用户可以使用自己的dotfiles在容器中个性化设置。让我们看一下以下文件的相关部分。

.devcontainer/devcontainer.json 的翻譯為中文

    "settings": {
        // ...
        // dotfiles
        "dotfiles.repository": "hoisjp/terraform-azure-ghactions-devcontainer", // change here to your repository.
        "dotfiles.targetPath": "~/.devcontainer/dotfiles",
        "dotfiles.installCommand": "~/.devcontainer/dotfiles/install.sh"
    },

如果您在此更改 dotfiles 存储库的引用位置,它会在创建容器时应用。
请参考此文档以了解其工作原理。 使用 dotfile 存储库进行个性化。

总结

VS Code 的 Remote Development 功能非常強大。通過這個功能,團隊成員可以輕鬆自然地共享完全相同的容器環境,而不需要進行特殊的努力(這是非常重要的)。

以往,在安裝 Azure CLI 和 Terraform 等準備工作方面,團隊中的每個人都需要分別進行。但是現在,通過使用 devcontainer 的機制,我們再也不需要像「環境準備手冊」那樣的東西了。環境設置都在 Git 上進行管理。如果有人改進了環境,這些改進會立即反映在整個團隊身上。

現在可以專注於 Azure 和 Terraform 了!

请参考以上内容。

V S Code 文档

    • Developing inside a Container : https://code.visualstudio.com/docs/remote/containers

VS Code 本を書きましたのでよかったら! : https://www.amazon.co.jp/dp/4839970920/

Azure 的 Terraform 文件

    • https://docs.microsoft.com/en-us/azure/developer/terraform/

 

    • Terraform – Azure Provider : https://www.terraform.io/docs/providers/azurerm/index.html

Terraform – Azure Provider – GitHub Repos
Terraform – Azure Provider – GitHub Repos – Examples

Azure的GitHub Actions文档

    https://docs.microsoft.com/ja-jp/azure/developer/github/github-actions
广告
将在 10 秒后关闭
bannerAds