Не удается создать контейнер Azure сразу после создания учетной записи хранения - PullRequest
0 голосов
/ 20 июня 2019

Я пытаюсь создать учетную запись хранения из 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

Я отправляю эти az cli команды из .bash файла, и поэтому я отправляю туда другие TF_VAR_azurerm ... переменные

Наконец, когда я выполняю первый bash-файл 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,

.

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=

В поисках аналогичного поведения, Я нашел эту проблему в репозитории terraform провайдера Azurerm

А также согласно эта проблема , созданная непосредственно в репозитории terraform. Это похоже на сетевую операционную ошибку ... Но странно, что это было исправлено ..

Я использую версию terraform v0.12.1

⟩ terraform version
Terraform v0.12.2

Согласно ответу @ Gaurav-Mantri, необходимо дождаться подготовки учетной записи хранения, чтобы продолжить выполнение другой задачи, связанной с самой учетной записью хранения.

Создание учетной записи хранения является асинхронным процессом. Когда вы выполняете создание учетной записи хранилища az для создания учетной записи хранилища, в Azure отправляется запрос, и вы возвращаете принятый ответ (если все прошло хорошо).

Весь процесс создания (предоставления) учетной записи хранения занимает некоторое время (максимум 1 минута в моем опыте), и до тех пор, пока учетная запись хранения не будет подготовлена, никакие операции с этой учетной записью запрещены.

Как включить процесс ожидания после создания учетной записи хранения? Кажется, что только с помощью команды bash sleep или приостановки оболочки bash с помощью команды read на некоторое время недостаточно ..

1 Ответ

1 голос
/ 21 июня 2019

Создание учетной записи хранения является асинхронным процессом.Когда вы выполняете az storage account create для создания учетной записи хранения, запрос отправляется в Azure, и вы получаете ответ accepted (если все прошло хорошо).

Весь процесс создания (предоставления) учетной записи хранениязанимает некоторое время (максимум 1 минута в моем опыте), и до тех пор, пока учетная запись хранения не будет подготовлена, никакие операции с этой учетной записью запрещены.

По этой причине вы получаете сообщение об ошибке, потому что вы сразу же пытаетесьвыполнить операцию после отправки запроса на создание.

Не знаю, как вы это сделаете, но вам нужно подождать, пока учетная запись хранения не будет подготовлена.Вы можете периодически получать свойства учетной записи хранения (скажем, каждые 5 секунд) и проверять состояние ее подготовки.Как только состояние инициализации будет успешным, вы можете попытаться создать контейнер.В этот момент ваш запрос должен быть успешным.

...