Post 在 Terraform 中构建步骤

Post Build Steps In Terraform

我最近在为我们的 Web 应用程序制作 Azure 事件网格主题订阅时在 Terraform 中遇到了一个问题。 Terraform 构建 web 应用程序,以及除事件主题订阅之外的所有其他内容,因为在管道上我事先传递了一个 Csproj 文件,并且对于事件网格主题 webhook 握手来验证 web 应用程序需要来自 运行 的文件csproj 文件

然后我想为主题做一个 post 构建步骤,在我的管道上 Terraform 制作所有资源然后工件部署到网络应用程序,然后 post Terraform 任务运行和会构建事件网格主题订阅,所以我想。

我把这个 post 构建 tf 文件放在 repo 上它自己的文件夹中,但在所有其他 tf 文件所在的主项目下,所以基本上其他所有内容都位于主项目文件中,然后是 post 构建文件夹位于主项目文件下,但我在我的管道上收到一条错误消息:

╷
│ Error: Reference to undeclared resource
│ 
│   on eventgrid_subscriptions.tf line 3, in data "azurerm_eventgrid_topic" "read_system_notification_topic":
│    3:     azurerm_eventgrid_topic.Event_Grid_System_Notification_Topic
│ 
│ A managed resource "azurerm_eventgrid_topic"
│ "Event_Grid_System_Notification_Topic" has not been declared in the root
│ module.
╵
╷
│ Error: Reference to undeclared resource
│ 
│   on eventgrid_subscriptions.tf line 6, in data "azurerm_eventgrid_topic" "read_system_notification_topic":
│    6:   resource_group_name = azurerm_resource_group.example.name
│ 
│ A managed resource "azurerm_resource_group"
│ "example" has not been declared in the root
│ module.
╵
##[error]Error: The process '/opt/hostedtoolcache/terraform/1.0.4/x64/terraform' failed with exit code 1

然而,Terraform 刚刚开始并成功地在管道任务的另一部分中创建了这些资源。就像它看不到文件夹之外的任何东西。我确实在 post 构建文件夹中进行了初始化,我应该这样做吗?我还使用了一个远程状态,我也将 Terraform 代码指向了 post 构建文件夹,但是主构建和 post 构建的状态文件是相同的。我假设 Terraform 会知道并在它刚刚 运行 并成功制定的基础上启动一个计划。

这是我的事件网格主题订阅代码:

data "azurerm_eventgrid_topic" "read_system_notification_topic" {
  depends_on = [
    azurerm_eventgrid_topic.Event_Grid_System_Notification_Topic
  ]
  name                = var.Event_Grid_System_Notification_Topic_name
  resource_group_name = azurerm_resource_group.example.name
}

resource "azurerm_eventgrid_event_subscription" "sub" {
  name  = "SystemNotificationToWebsite"
  scope = data.azurerm_eventgrid_topic.read_system_notification_topic.id

  webhook_endpoint {
    url = format("https://${azurerm_app_service.website_app.name}.azurewebsites.net/messaging?authcode=${local.resource_group_id}")
  }
  included_event_types = ["SystemNotification.MaintenanceStarted", "SystemNotification.MaintenanceFinished", "SystemNotification.MaintenanceWarning"]
}

基本上我是在问什么是在 Terraform 中制作 post 构建步骤的最佳方法?

是否使用工作空间? https://www.terraform.io/cli/workspaces

或者我可以使用数据资源来尝试拉取信息吗?或者Variables,我可以传递变量吗?

问题更新:

文件夹结构:

主题代码:

resource "azurerm_eventgrid_topic" "Event_Grid_System_Notification_Topic" {
  name                = var.Event_Grid_System_Notification_Topic_name
  resource_group_name = azurerm_resource_group.example.name
  location            = azurerm_resource_group.example.location

  tags = {
    environment = "Development"
  }
}

我在我的本地环境中尝试了相同的代码和结构,但收到了如下相同的错误:

因此,作为解决方案,我们必须 为我们拥有的所有资源添加 data blocks 在根文件夹中创建并且添加一个包含所需变量的variable.tf文件 我们在里面使用 post_build :

eventgrid_subscriptions.tf :

provider "azurerm" {
  features{}
}

data "azurerm_resource_group" "example" {
  name = var.rg_name
}
data "azurerm_app_service" "website_app" {
  name = var.app_name
  resource_group_name = data.azurerm_resource_group.example.name
}
data "azurerm_eventgrid_topic" "read_system_notification_topic" {
  name                = var.Event_Grid_System_Notification_Topic_name
  resource_group_name = data.azurerm_resource_group.example.name
}

resource "azurerm_eventgrid_event_subscription" "sub" {
  name  = "SystemNotificationToWebsite"
  scope = data.azurerm_eventgrid_topic.read_system_notification_topic.id

  webhook_endpoint {
    url = format("https://${data.azurerm_app_service.website_app.name}.azurewebsites.net/messaging?authcode=${data.azurerm_resource_group.example.id}")
  }
  included_event_types = ["SystemNotification.MaintenanceStarted", "SystemNotification.MaintenanceFinished", "SystemNotification.MaintenanceWarning"]
}

variable.tf

variable "rg_name" {
  default="testbuild"
}
variable "Event_Grid_System_Notification_Topic_name" {
  default="testansumantopic"
}
variable "app_name" {
  default="ansumantestapp"
}

输出: