Обработка таймаутов при создании экземпляра gcloud sql

Я использую gcloud sql instances create создавать экземпляры CloudSQL. Чаще всего эта команда истекает, но предоставляет команду для ожидания создания базы данных.

$ gcloud sql instances create mydb
Creating Cloud SQL instance...failed.
ERROR: (gcloud.sql.instances.create) Operation https://www.googleapis.com/sql/v1beta4/projects/foobar/operations/abcd is taking longer than expected. 
You can continue waiting for the operation by running `gcloud sql operations wait --project foobar abcd`
$ gcloud sql operations wait --project foobar abcd
Waiting for [https://www.googleapis.com/sql/v1beta4/projects/foobar/operations/abcd]...done.
NAME  TYPE    START                          END                            ERROR  STATUS
abcd  CREATE  2018-03-19T15:04:29.477+00:00  2018-03-19T15:10:08.561+00:00  -      DONE

Интересно, можно ли настроить время ожидания для gcloud sql instances create? Я не могу найти ничего в документах, даже тайм-аут, который используется по умолчанию.

Другой вариант - начать создание экземпляра асинхронно, перечислить ожидающие операции и дождаться их завершения:

$ gcloud sql instances create mydb --async
$ PENDING_OPERATIONS=$(gcloud sql operations list --instance=mydb --filter='status!=DONE' --format='value(name)')
$ gcloud sql operations wait "${PENDING_OPERATIONS}"

Но опять же, будет gcloud sql operations wait тайм-аут в какой-то момент? В документах также не упоминается тайм-аут.

0 ответов

E сть --timeout флаг в waitкоманда (не уверен, что это недавнее добавление). По умолчанию - 300 с.

https://cloud.google.com/sdk/gcloud/reference/sql/operations/wait

Так ты можешь сделать gcloud sql operations wait "${PENDING_OPERATIONS}" --timeout=unlimited

Я думаю, что время истекло, потому что я создаю экземпляр MySQL на самой маленькой машине: db-f1-micro, которой достаточно для моей платформы dev.

Я пробовал несколько вариантов, чтобы захватить вывод команды и выполнить предложенную команду, но не могу найти способ ее получить. Это как если бы вывод был напечатан на чем-то еще, stderr или stdout.

Я пробовал следующее:

MyVAR=$($COMMAND)
$COMMAND | tee command.log
$COMMAND 2>&1 > command.log

если бы мы могли зафиксировать вывод команды, мой скрипт, приведенный ниже, сработал бы.

gcloud sql instances create ${MYSQL_INSTANCE}    \
        --assign-ip                              \
        ${BACKUP}                                \
        ${BACKUP_START_TIME}                     \
        ${BACKUP_ENABLE_BIN_LOG}                 \
        --database-flags=${MYSQL_FLAGS}          \
        --database-version=${MYSQL_DB_VERSION}   \
        --gce-zone=${MYSQL_ZONE}                 \
        --maintenance-release-channel=production \
        --maintenance-window-day=MON             \
        --maintenance-window-hour=4              \
        --pricing-plan=PER_USE                   \
        --storage-auto-increase                  \
        --storage-size=${MYSQL_STORAGE}          \
        --storage-type=${MYSQL_STORAGE_TYPE}     \
        --tier=${MYSQL_TIER}                     \
        --format=json                            | tee logs/${COUNTRY}-${ENV}.log

GCLOUD_CREATE_INSTANCE_RETURN_CODE=$?

if [ ${GCLOUD_CREATE_INSTANCE_RETURN_CODE} -eq 0 ]
then
  echo "Successfully created DB"
else
  echo "Error returned while creating the DB"

  TIMEOUT_ERROR=$(cat logs/${COUNTRY}-${ENV}.log | tail -1 | grep "gcloud beta sql operations wait" | wc -l)

  if [ "${TIMEOUT_ERROR}" = "1" ]
  then
    echo "It's a timeout error, continue waiting"
    FOLLOW_UP_COMMAND=$(cat logs/${COUNTRY}-${ENV}.log | tail -1 |cut -d '`' -f2)
    ${FOLLOW_UP_COMMAND}
  else
    echo "It's NOT a timeout error"
    echo "return code : ${GCLOUD_CREATE_INSTANCE_RETURN_CODE}"
    echo  ${GCLOUD_CREATE_INSTANCE_OUTPUT}
    exit 1
  fi
fi

gcloud sql user set-password root --instance=${MYSQL_INSTANCE} --password=${MYSQL_ROOT} --host "%"

В конце концов, после команды create instance я установил большой сон, чтобы установить пароль root.

для db-f1-micro завершение создания заняло 2 минуты 53 секунды.

Другие вопросы по тегам