Назад | Перейти на главную страницу

Как проверить с помощью aws cli, существует ли конкретный экземпляр rds?

Я хочу, чтобы мой сценарий bash обнаруживал, существует ли уже экземпляр AWS RDS с определенным именем.

Вот что я пробовал:

#!/usr/bin/env bash

DBINSTANCEIDENTIFIER=greatdb

EXISTINGINSTANCE=$(aws rds describe-db-instances \
    --db-instance-identifier="$DBINSTANCEIDENTIFIER" \
    --output text\
    )

Я бы ожидал получить пустой список или в результате ноль, но получаю сообщение об ошибке:

An error occurred (DBInstanceNotFound) when calling the DescribeDBInstances operation: DBInstance greatdb not found.

Кто-нибудь знает, как правильно узнать, существует экземпляр или нет, без сообщения об ошибке?

Обратите внимание на ограничение в документации при использовании --db-instance-indentifier:

--db-instance-identifier (string)

  The user-supplied instance identifier. If this parameter is specified, 
  information from only the specific DB instance is returned. This parameter 
  isn't case-sensitive.

Constraints:   
  - If supplied, must match the identifier of an existing DBInstance

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

Использование запросов

Для поиска БД, которая может существовать или не существовать, вам придется использовать --query вариант:

$ aws rds describe-db-instances \
    --query 'DBInstances[*].[DBName,DBInstanceIdentifier]' --output text

В DBINstances Структура JSON доступна в справке по awscli:

$ aws rds describe-db-instances help --output text
...
...
       {
          "DBInstances": [
              {
                  "PubliclyAccessible": false,
                  "MasterUsername": "mymasteruser",
                  "MonitoringInterval": 0,
                  "LicenseModel": "general-public-license",
                  ...
                  ...
                  "DBName": "sample",
                  ...
                  ...
                  "DBInstanceStatus": "stopped",
                  "EngineVersion": "5.6.27",
                  "AvailabilityZone": "us-east-1e",
                  "StorageType": "standard",
                  "StorageEncrypted": false,
                  "DBInstanceClass": "db.t2.micro",
                  "DbInstancePort": 0,
                  "DBInstanceIdentifier": "mydbinstance-1"
              }
          ]
      }
...
...

Использование фильтров

Другое простое решение первоначального вопроса - использовать --filters параметр. Запрос вернет либо идентификатор экземпляра (если экземпляр существует), либо пустую строку (если он не существует):

#!/usr/bin/env bash

DBINSTANCEIDENTIFIER="greatdb"
EXISTINGINSTANCE=$(aws rds describe-db-instances \
    --query 'DBInstances[*].[DBInstanceIdentifier]' \
    --filters Name=db-instance-id,Values=$DBINSTANCEIDENTIFIER \
    --output text \
    )

if [ -z $EXISTINGINSTANCE ]
then
    echo "instance $DBINSTANCEIDENTIFIER does not exist!"
else
    echo "instance $DBINSTANCEIDENTIFIER exists!"
fi

Ссылки