Como verificar via aws cli se existe uma instância específica do rds?

3

Quero que meu script bash seja detectado, se uma instância do AWS RDS com um nome específico já existir.

Isso é o que eu tentei:

#!/usr/bin/env bash

DBINSTANCEIDENTIFIER=greatdb

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

Espero uma lista vazia ou um zero como resultado, mas recebo uma mensagem de erro:

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

Alguém sabe como descobrir corretamente se uma instância existe ou não, sem uma mensagem de erro?

    
por where 03.07.2018 / 06:45

1 resposta

4

Observe a restrição nos documentos ao usar --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

Portanto, você só pode usar essa opção se souber que o DB realmente existe.

Usando consultas

Para procurar por um banco de dados que pode ou não existir, você terá que usar a opção --query :

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

A estrutura DBINstances JSON está acessível na ajuda do 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"
              }
          ]
      }
...
...

Usando filtros

Outra solução simples para a pergunta inicial é usar o parâmetro --filters . A consulta retornará o identificador da instância (se a instância existir) ou uma string vazia (se ela não existir):

#!/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

Referências

por 03.07.2018 / 09:19