Я хочу, чтобы мой сценарий 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