首页 > 解决方案 > 上传 azurerm_storage_blob 时出现问题,因为 azurerm_storage_container 存在

问题描述

我想将生成的文件作为新的 blobobject 上传到 azure。我的问题是,如果azurerm_storage_container不存在,我必须将其创建为资源。但是如果这个容器已经存在于存储帐户中,我会收到错误消息

'指定的容器已经存在'。

所以我想我可以将我的azurerm_storage_container定义为 Data 对象。但后来我得到一个错误

module.components.data.azurerm_storage_container.blobstorage:提供程序不支持数据源:azurerm_storage_container

澄清一下:如果天蓝色中不存在,我想创建一个新的存储容器。之后,我想将生成的本地文件上传到一个新的 blobobject 中,并将其包含在存储容器中。

我试图将所有对象设置为资源和数据。我找不到这些对象的正确组合来实现我的目标

标签: azureterraformterraform-provider-azurehcl

解决方案


据我所知,您可以使用Terraform 外部数据源执行脚本以获取容器是否存在的信息,然后根据状态创建容器或不创建容器。

以下是使用 Azure CLI 命令的 bash 脚本示例代码:

#!/bin/bash

eval "$(jq -r '@sh "export container_name=\(.container_name) account_name=\(.account_name)"')"
flag=$(az storage container exists --name $container_name --account-name $account_name --query exists)
if [ $flag ]
then
    echo "{\"exists\":\"True\"}"
else
    echo "{\"exists\":\"False\"}"
fi

地形:

variable "container_name" {}

data "azurerm_storage_account" "test" {
    name = "charlescloudshell"
    resource_group_name = "v-chaxu-ChinaCXPTeam"
}

data "external" "exists" {
    program = ["/bin/bash", "./container.sh"]

    query = {
        container_name = "${var.container_name}"
        account_name = "${data.azurerm_storage_account.test.name}"
    }
}

resource "azurerm_storage_container" "test" {
    count = "${data.external.exists.result["exists"] == "False" ? 1 : 0}"
    name  = "${var.container_name}"
    storage_account_name = "${data.azurerm_storage_account.test.name}"
    container_access_type = "private"
}

推荐阅读