Я пытаюсь создать учетную запись хранения из 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
,
.
но на практике это действие неэффективно, я получаю следующий вывод:
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
на некоторое время недостаточно ..