在创建存储账户后无法创建Azure容器

3
我正在尝试使用 Terraform 创建一个存储帐户,并使用其中一些访问密钥创建 Blob 容器。我的 Terraform 配置是从 Bash 文件中获取的,因此,以下是最重要的步骤之一:
customer_prefix=4pd
customer_environment=dev

RESOURCE_GROUP_NAME=$customer_prefix
az group create --name $RESOURCE_GROUP_NAME --location westeurope

# Creating Storage account
STORAGE_ACCOUNT_NAME=4pdterraformstates
az storage account create --resource-group $RESOURCE_GROUP_NAME --name $STORAGE_ACCOUNT_NAME  --sku Standard_LRS --encryption-services blob

# We are getting the storage account key to access to it when we need to store the terraform .tf production state file
ACCOUNT_KEY=$(az storage account keys list --resource-group $RESOURCE_GROUP_NAME --account-name $STORAGE_ACCOUNT_NAME --query [0].value -o tsv)


# Creating a blob container
CONTAINER_NAME=4pd-tfstate
az storage container create --name $CONTAINER_NAME --account-name $STORAGE_ACCOUNT_NAME --account-key $ACCOUNT_KEY

source ../terraform_apply_template.sh

我正在从一个.bash文件中发送那些az cli命令,因此,我在那里发送其他的TF_VAR_azurerm ...变量。
最后,当我执行第一个bash文件时,会调用terraform_apply_template.sh创建计划并应用它。如下所示:
#!/bin/bash
#Terminates script execution after first failed (returned non-zero exit code) command and treat unset variables as errors.
set -ue

terraform init -backend-config=$statefile -backend-config=$storage_access_key -backend-config=$storage_account_name

#TF:
function tf_plan {
    terraform plan -out=$outfile
}

case "${1-}" in
    apply)
        tf_plan && terraform apply $outfile
        ;;

    apply-saved)
        if [ ! -f $outfile ]; then tf_plan; fi
        terraform apply $outfile
        ;;

    *)
        tf_plan

        echo ""
        echo "Not applying changes. Call one of the following to apply changes:"
        echo " - '$0 apply': prepares and applies new plan"
        echo " - '$0 apply-saved': applies saved plan ($outfile)"
        ;;
esac

但我的输出结果是这样的,azurerm 后端已初始化,创建了名为 4pdterraformstates 的存储帐户,以及 4pd-tfstate blob 容器。

enter image description here

但在实践中,这个操作并不有效,我得到了以下输出:
Initializing the backend...

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

Error: Failed to get existing workspaces: storage: service returned error: StatusCode=404, ErrorCode=ContainerNotFound, ErrorMessage=The specified container does not exist.
RequestId:2db5df4e-f01e-014c-369d-272246000000
Time:2019-06-20T19:21:01.6931098Z, RequestInitiated=Thu, 20 Jun 2019 19:21:01 GMT, RequestId=2db5df4e-f01e-014c-369d-272246000000, API Version=2016-05-31, QueryParameterName=, QueryParameterValue=

寻找类似的行为,我在azurerm提供程序terraform存储库中找到了这个问题

根据直接在terraform存储库中创建的此问题,看起来像是网络操作错误...但奇怪的是它已经被修复了。

我正在使用terraform v0.12.1版本

⟩ terraform version
Terraform v0.12.2


根据@Gaurav-Mantri的回答,需要等待存储帐户被配置完成后才能继续执行与存储帐户本身相关的其他任务。
创建存储帐户是一个异步过程。当您执行az storage account create以创建存储帐户时,请求将发送到Azure,并且如果一切顺利,您将收到已接受的响应。
完整的创建(配置)存储帐户的过程需要一些时间(在我的经验中最长1分钟),在存储帐户被配置之前,不允许对该存储帐户进行任何操作。
如何在存储帐户创建后包含等待过程? 似乎仅使用bash的sleep命令或暂停bash shell的read命令一段时间是不够的。
1个回答

2
创建存储账户是一个异步过程。当您执行 az storage account create 命令创建存储账户时,请求将被发送到 Azure 并返回 accepted 响应(如果一切顺利的话)。
整个创建(配置)存储账户的过程需要一些时间(根据我的经验,最多需要 1 分钟),在存储账户被配置之前,不允许对该存储账户执行任何操作。
这就是您收到错误信息的原因,因为您在发送创建请求后立即尝试执行操作。
我不确定您该如何处理,但您需要等待存储账户被配置。您可以定期获取存储账户的属性(例如,每 5 秒钟一次)并检查其配置状态。一旦配置状态成功,您可以尝试创建容器。此时,您的请求应该会成功。

很好的解释。在存储账户创建后,我该如何包含等待过程?似乎仅使用bash的sleep命令或暂停bash shell一段时间的read命令是不够的。 - bgarcial
很遗憾,我没有使用过Bash,无法为您提供更多帮助。 - Gaurav Mantri

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接