Como usar o Cloud SQL para PostgreSQL

Nesta página, mostramos como se conectar a uma instância do Cloud SQL para PostgreSQL a partir de um aplicativo do App Engine e como fazer leituras e gravações no Cloud SQL. O Cloud SQL é um banco de dados SQL que reside na nuvem do Google.

Para saber mais, consulte a documentação do Cloud SQL. Para informações sobre preços e limites do Cloud SQL, consulte a página de preços do Cloud SQL. Os aplicativos do App Engine também estão sujeitos às cotas dessa plataforma.

Antes de começar

  1. Crie ou selecione um projeto do GCP no Console do GCP e verifique se o projeto inclui um aplicativo do App Engine e se o faturamento está ativado:
    Acessar o App Engine

    O Painel será aberto se houver um aplicativo do App Engine no projeto e o faturamento estiver ativado. Caso contrário, siga as instruções para escolher uma região e ativar o faturamento.

  2. {% dynamic if "no_credentials" in setvar.task_params %}{% dynamic setvar credential_type %}NO_AUTH{% dynamic endsetvar %}{% dynamic if not setvar.redirect_url %}{% dynamic setvar redirect_url %}https://console.cloud.google.com{% dynamic endsetvar %}{% dynamic endif %}{% dynamic endif %}{% dynamic if setvar.in_henhouse_no_auth_whitelist %}{% dynamic if not setvar.credential_type %}{% dynamic setvar credential_type %}NO_AUTH{% dynamic endsetvar %}{% dynamic endif %}{% dynamic elif setvar.in_henhouse_service_account_whitelist %}{% dynamic if not setvar.credential_type %}{% dynamic setvar credential_type %}SERVICE_ACCOUNT{% dynamic endsetvar %}{% dynamic endif %}{% dynamic endif %}{% dynamic if not setvar.service_account_roles and setvar.credential_type == "SERVICE_ACCOUNT" %}{% dynamic setvar service_account_roles %}{% dynamic endsetvar %}{% dynamic endif %}{% dynamic setvar console %}{% dynamic if "no_steps" not in setvar.task_params %}
  3. {% dynamic endif %}{% dynamic if setvar.api_list %}{% dynamic if setvar.in_henhouse_no_auth_whitelist or setvar.in_henhouse_service_account_whitelist %} Configure um projeto do Console do GCP.

    Configurar um projeto

    Clique para:

    • criar ou selecionar um projeto;
    • ativar {% dynamic if setvar.api_names %}{% dynamic print setvar.api_names %}{% dynamic else %}obrigatória{% dynamic endif %}{% dynamic if "," in setvar.api_list %} APIs{% dynamic elif "API" in setvar.api_names %}{% dynamic else %} API{% dynamic endif %} para o projeto;
    • {% dynamic if setvar.credential_type == 'SERVICE_ACCOUNT' %}
    • criar uma conta de serviço;
    • fazer o download de uma chave privada como JSON.
    • {% dynamic endif %}

    É possível ver e gerenciar esses recursos a qualquer momento no Console do GCP.

    {% dynamic else %}{% dynamic if "no_text" not in setvar.task_params %} Ativar {% dynamic if setvar.api_names %}{% dynamic print setvar.api_names %}{% dynamic else %}obrigatória{% dynamic endif %}{% dynamic if "," in setvar.api_list %} APIs{% dynamic elif "API" in setvar.api_names %}{% dynamic else %} API{% dynamic endif %}. {% dynamic endif %}

    Ativar {% dynamic if "," in setvar.api_list %} as APIs{% dynamic else %} a API{% dynamic endif %}

    {% dynamic endif %}{% dynamic endif %}{% dynamic if "no_steps" not in setvar.task_params %}
  4. {% dynamic endif %}{% dynamic endsetvar %}{% dynamic print setvar.console %}
  5. Para implantar o aplicativo com a ferramenta gcloud, você precisa fazer o download, instalar e inicializar o SDK do Cloud:
    Fazer o download do SDK

    Se você tiver a ferramenta gcloud instalada e quiser configurá-la para usar um código do projeto do GCP diferente do inicializado, consulte Como gerenciar configurações do SDK do Cloud.

Como configurar a instância do Cloud SQL

Para criar e configurar uma instância do Cloud SQL, siga as seguintes etapas:

  1. Crie uma instância do Cloud SQL para PostgreSQL.
  2. Defina a senha do usuário padrão na instância do Cloud SQL, se ainda não fez isso:
    gcloud sql users set-password postgres no-host --instance [INSTANCE_NAME] --password [PASSWORD]
    
  3. Se não quiser usar o usuário padrão para se conectar, crie um usuário.
  4. Registre o nome da conexão da instância:
    gcloud sql instances describe [INSTANCE_NAME]
    

    Exemplo:

    connectionName: project1:us-central1:instance1
    

    Você também encontra esse valor na página de Detalhes da instância no Console do Google Cloud Platform.

  5. Crie um banco de dados na instância do Cloud SQL.
    gcloud sql databases create [DATABASE_NAME] --instance=[INSTANCE_NAME]
    
    Para mais informações sobre como criar e gerenciar bancos de dados, consulte a documentação do Cloud SQL.

Como configurar o ambiente local

Depois de implantado, seu aplicativo usa o Cloud SQL Proxy incorporado ao ambiente de execução do App Engine para se comunicar com a instância do Cloud SQL. No entanto, para testar o aplicativo no local, é necessário instalar e usar uma cópia local do Cloud SQL Proxy no ambiente de desenvolvimento.

Para executar tarefas administrativas básicas na instância do Cloud SQL, use o cliente de administração do banco de dados ou o Console do GCP.

  1. Autentique a ferramenta gcloud para usar o proxy para se conectar a partir da máquina local:

    gcloud auth application-default login
    
  2. Instale o Cloud SQL Proxy:

    Linux de 64 bits

    1. Faça o download do proxy:
      wget https://dl.google.com/cloudsql/cloud_sql_proxy.linux.amd64 -O cloud_sql_proxy
      
    2. Torne o proxy executável:
      chmod +x cloud_sql_proxy
      

    Linux de 32 bits

    1. Faça o download do proxy:
      wget https://dl.google.com/cloudsql/cloud_sql_proxy.linux.386 -O cloud_sql_proxy
      
    2. Torne o proxy executável:
      chmod +x cloud_sql_proxy
      

    macOS de 64 bits

    1. Faça o download do proxy:
      curl -o cloud_sql_proxy https://dl.google.com/cloudsql/cloud_sql_proxy.darwin.amd64
      
    2. Torne o proxy executável:
      chmod +x cloud_sql_proxy
      

    macOS de 32 bits

    1. Faça o download do proxy:
      curl -o cloud_sql_proxy https://dl.google.com/cloudsql/cloud_sql_proxy.darwin.386
      
    2. Torne o proxy executável:
      chmod +x cloud_sql_proxy
      

    Windows de 64 bits

    Clique com o botão direito do mouse em https://dl.google.com/cloudsql/cloud_sql_proxy_x64.exe e selecione "Salvar link como…" para fazer o download do proxy. Altere o nome dele para cloud_sql_proxy.exe.

    Windows de 32 bits

    Clique com o botão direito do mouse em https://dl.google.com/cloudsql/cloud_sql_proxy_x86.exe e selecione "Salvar link como…" para fazer o download do proxy. Altere o nome dele para cloud_sql_proxy.exe.
    Caso seu sistema operacional não esteja incluído aqui, compile o proxy a partir do código-fonte.
  3. Execute o proxy:

    Dependendo da linguagem e do ambiente, é possível iniciar o proxy usando os soquetes TCP ou Unix.

    Soquetes TCP

    1. Copie o nome de conexão da instância da página Detalhes da instância.

      Por exemplo: myinstance:us-central1:myproject.

    2. Se você estiver usando uma conta de serviço para autenticar o proxy, anote o local em que o arquivo de chave privada foi salvo na máquina cliente durante a criação da conta.
    3. Inicie o proxy.

      Algumas strings possíveis de chamada do proxy:

      • Usando autenticação do SDK do Cloud:
        ./cloud_sql_proxy -instances=<INSTANCE_CONNECTION_NAME>=tcp:5432
        
        A porta especificada não pode estar em uso, por exemplo, por um servidor de banco de dados local.
      • Usando uma conta de serviço e a especificação explícita de uma instância (recomendado para ambientes de produção):
        ./cloud_sql_proxy -instances=<INSTANCE_CONNECTION_NAME>=tcp:5432 \
                          -credential_file=<PATH_TO_KEY_FILE> &
        

      Para mais informações sobre as opções de proxy, consulte Opções para autenticar o proxy e Opções para especificar instâncias.

    Soquetes Unix

    1. Se estiver usando a especificação explícita de instâncias, copie o nome de conexão da instância da página Detalhes da instância.
    2. Crie o diretório em que os soquetes do proxy ficarão:
      sudo mkdir /cloudsql; sudo chmod 777 /cloudsql
    3. Se você estiver usando uma conta de serviço para autenticar o proxy, anote o local em que o arquivo de chave privada foi salvo na máquina cliente durante a criação da conta.
    4. Abra uma nova janela de terminal e inicie o proxy.

      Algumas strings possíveis de chamada do proxy:

      • Usando uma conta de serviço e a especificação explícita de uma instância (recomendado para ambientes de produção):
        ./cloud_sql_proxy -dir=/cloudsql -instances=<INSTANCE_CONNECTION_NAME> \
                          -credential_file=<PATH_TO_KEY_FILE> &
      • Usando a autenticação do SDK do Cloud e a descoberta automática de instâncias:
        ./cloud_sql_proxy -dir=/cloudsql &

      É melhor iniciar o proxy em seu próprio terminal, assim você pode monitorar as respostas dele sem misturá-las com as respostas de outros programas.

      Para mais informações sobre as opções de proxy, consulte Opções para autenticar o proxy e Opções para especificar instâncias.

  4. Para usar o cliente de administração, instale uma cópia local e conecte-se usando o proxy ou endereços IP.

    Para mais informações, consulte Como conectar o cliente psql usando o Cloud SQL Proxy e Como conectar o cliente psql usando endereços IP.

Como configurar strings de conexão e adicionar uma biblioteca

  1. Configure o ambiente local para oferecer suporte a conexões de testes locais.

    Por exemplo, na amostra de código abaixo:

    export POSTGRES_DSN="pgsql:host=127.0.0.1;port=5432;dbname=DATABASE;"
    export POSTGRES_USER=USER
    export POSTGRES_PASSWORD=PASSWORD
    
  2. Para permitir que o aplicativo se conecte à instância do Cloud SQL no momento da implantação, adicione as variáveis de usuário, senha, banco de dados e nome de conexão da instância do Cloud SQL às variáveis de ambiente relacionadas no arquivo app.yaml:

    env_variables:
        # Replace USER, PASSWORD, DATABASE, and CONNECTION_NAME with the
        # values obtained when configuring your Cloud SQL instance.
        POSTGRES_USER: USER
        POSTGRES_PASSWORD: PASSWORD
        POSTGRES_DSN: pgsql:dbname=DATABASE;host=/cloudsql/CONNECTION_NAME

  3. Adicione a seção beta_settings ao app.yaml usando o nome de conexão da instância do Cloud SQL.

    # Use the connection name obtained when configuring your Cloud SQL instance.
    beta_settings:
        cloud_sql_instances: "CONNECTION_NAME"
  4. Para instalar dependências, instale o Composer e execute:

    composer install
    

Como executar o código de amostra

A amostra abaixo grava as informações de visita no Cloud SQL. Em seguida, ela as lê e retorna as últimas dez visitas:
use Silex\Application;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;

// create the Silex application
$app = new Application();

// Create the PDO object for CloudSQL Postgres.
$dsn = getenv('POSTGRES_DSN');
$user = getenv('POSTGRES_USER');
$password = getenv('POSTGRES_PASSWORD');
$pdo = new PDO($dsn, $user, $password);

// Create the database if it doesn't exist
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$pdo->query('CREATE TABLE IF NOT EXISTS visits ' .
    '(time_stamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP, user_ip CHAR(64))');

// Add the PDO object to our Silex application.
$app['pdo'] = $pdo;

$app->get('/', function (Application $app, Request $request) {
    $ip = $request->GetClientIp();
    // Keep only the first two octets of the IP address.
    $octets = explode($separator = ':', $ip);
    if (count($octets) < 2) {  // Must be ip4 address
        $octets = explode($separator = '.', $ip);
    }
    if (count($octets) < 2) {
        $octets = ['bad', 'ip'];  // IP address will be recorded as bad.ip.
    }
    // Replace empty chunks with zeros.
    $octets = array_map(function ($x) {
        return $x == '' ? '0' : $x;
    }, $octets);
    $user_ip = $octets[0] . $separator . $octets[1];

    // Insert a visit into the database.
    /** @var PDO $pdo */
    $pdo = $app['pdo'];
    $insert = $pdo->prepare('INSERT INTO visits (user_ip) values (:user_ip)');
    $insert->execute(['user_ip' => $user_ip]);

    // Look up the last 10 visits
    $select = $pdo->prepare(
        'SELECT * FROM visits ORDER BY time_stamp DESC LIMIT 10');
    $select->execute();
    $visits = ["Last 10 visits:"];
    while ($row = $select->fetch(PDO::FETCH_ASSOC)) {
        array_push($visits, sprintf('Time: %s Addr: %s', $row['time_stamp'],
            $row['user_ip']));
    }
    return new Response(implode("\n", $visits), 200,
        ['Content-Type' => 'text/plain']);
});

Como testar e implantar

  1. Para testar o aplicativo no local:

    php -S localhost:8080
    
  2. Após os testes locais, implante o aplicativo no App Engine:

    gcloud app deploy
    

  3. Para iniciar o navegador e ver o aplicativo em http://[YOUR_PROJECT_ID].appspot.com, execute o seguinte comando:

    gcloud app browse
    

Como executar o Cloud SQL e o App Engine em projetos separados

Use uma conta de serviço para permitir o acesso do aplicativo do App Engine ao Cloud SQL caso ele e a instância do Cloud SQL estejam em projetos diferentes do Google Cloud Platform.

Essa conta de serviço representa o aplicativo do App Engine. Ela é gerada por padrão quando você cria um projeto do Google Cloud Platform.

  1. Se o aplicativo do App Engine estiver no mesmo projeto que a instância do Cloud SQL, ignore esta seção e vá para Como configurar o ambiente local. Caso contrário, prossiga para a próxima etapa.
  2. Identifique a conta de serviço associada ao aplicativo do App Engine. A conta padrão é denominada [PROJECT-ID]@appspot.gserviceaccount.com.

    É possível verificar a conta de serviço do App Engine na página Permissões de IAM. Lembre-se de selecionar o projeto do aplicativo do App Engine, e não a instância do Cloud SQL.

    Acessar a página "Permissões de IAM"

  3. Acesse a página Projetos do IAM e do administrador no Console do Google Cloud Platform.

    Acessar a página "Projetos do IAM e do administrador"

  4. Selecione o projeto que contém a instância do Cloud SQL.
  5. Procure o nome da conta de serviço.
  6. Se já houver uma conta de serviço, e você tiver um papel que inclua a permissão cloudsql.instances.connect, prossiga para a seção Como configurar o ambiente local.

    Os papéis Cloud SQL Client, Cloud SQL Editor e Cloud SQL Admin fornecem a permissão necessária, assim como os papéis legados Editor e Owner do projeto.

  7. Caso contrário, clique em Adicionar para incluir a conta.
  8. Na caixa de diálogo Adicionar membros, insira o nome da conta de serviço e selecione um papel que inclua a permissão cloudsql.instances.connect. Qualquer papel predefinido do Cloud SQL funcionará, exceto o de Leitor.

    Também é possível usar o papel primitivo Editor ao selecionar Projeto > Editor. No entanto, ele inclui permissões em todo o Google Cloud Platform.

    Se esses papéis não estiverem sendo exibidos, é provável que seu usuário do Google Cloud Platform não tenha a permissão resourcemanager.projects.setIamPolicy. Para verificar suas permissões, acesse a página "IAM" no Console do Google Cloud Platform e procure seu código de usuário.

  9. Clique em Adicionar.

    Você verá a conta de serviço listada com o papel especificado.

Esta página foi útil? Conte sua opinião sobre:

Enviar comentários sobre…

Ambiente flexível do App Engine para documentos em PHP