AWS Elastic Beanstalk
Guia do desenvolvedor

Adicionar uma instância de banco de dados do Amazon RDS ao seu ambiente de aplicativos Java

Você pode usar uma instância de banco de dados do Amazon Relational Database Service (Amazon RDS) para armazenar dados que seu aplicativo coleta e modifica. O banco de dados pode ser anexado ao seu ambiente e gerenciado pelo Elastic Beanstalk ou criado e gerenciado externamente.

Se você estiver usando o Amazon RDS pela primeira vez, adicione uma instância de banco de dados a um ambiente de teste utilizando o Console do Elastic Beanstalk e verifique se o aplicativo pode se conectar a ele.

Para adicionar uma instância de banco de dados ao ambiente

  1. Abra o Console do Elastic Beanstalk.

  2. Navegue até a página de gerenciamento do ambiente.

  3. Escolher configuração.

  4. Na categoria de configuração Database (Banco de dados), selecione Modify (Modificar).

  5. Escolha um mecanismo de banco de dados e insira um nome de usuário e senha.

  6. Escolha Aplicar.

A adição de uma instância de banco de dados leva cerca de 10 minutos. Quando a atualização do ambiente for concluída, o nome de host da instância de banco de dados e outras informações de conexão estarão disponíveis para o seu aplicativo por meio das seguintes propriedades de ambiente:

  • RDS_HOSTNAME – O nome de host da instância de banco de dados.

    Rótulo do console do Amazon RDS – Endpoint (este é o nome do host)

  • RDS_PORT – A porta na qual a instância de banco de dados aceita conexões. O valor padrão varia entre os mecanismos de banco de dados.

    Rótulo do console do Amazon RDS – Porta

  • RDS_DB_NAME – O nome do banco de dados, ebdb.

    Rótulo do console do Amazon RDS – Nome do banco de dados

  • RDS_USERNAME – O nome de usuário que você configurou para seu banco de dados.

    Rótulo do console do Amazon RDS – Username

  • RDS_PASSWORD – A senha que você configurou para seu banco de dados.

Para obter mais informações sobre como configurar uma instância de banco de dados interna, consulte Adição de um banco de dados ao seu ambiente Elastic Beanstalk. Para obter instruções sobre como configurar um banco de dados externo para uso com o Elastic Beanstalk, consulte Uso do Elastic Beanstalk com o Amazon Relational Database Service.

Para se conectar ao banco de dados, adicione o arquivo JAR do driver adequado ao seu aplicativo, carregue a classe do driver no seu código e crie um objeto de conexão com as propriedades de ambiente fornecidas pelo Elastic Beanstalk.

Fazer download do driver do JDBC

Você precisará do arquivo JAR do driver JDBC para o mecanismo de banco de dados escolhido. Salve o arquivo JAR em seu código-fonte e o inclua em seu classpath quando você compilar a classe que cria conexões com o banco de dados.

Você pode encontrar o driver mais recente para o seu mecanismo de banco de dados nos seguintes locais:

Para usar o driver JDBC, chame Class.forName() para carregá-lo antes de criar a conexão com DriverManager.getConnection() em seu código.

O JDBC usa uma string de conexão no seguinte formato:

jdbc:driver://hostname:port/dbName?user=userName&password=password

Você pode recuperar o nome do host, a porta, o nome do banco de dados, o nome de usuário e a senha das variáveis de ambiente que o Elastic Beanstalk fornece ao aplicativo. O nome do driver é específico do tipo de banco de dados e da versão do driver. Os exemplos a seguir são de nomes de driver:

  • mysql para MySQL

  • postgresql para PostgreSQL

  • oracle:thin para Oracle Thin

  • oracle:oci para Oracle OCI

  • oracle:oci8 para Oracle OCI 8

  • oracle:kprb para Oracle KPRB

  • sqlserver para SQL Server

Conectar a um banco de dados (plataformas Java SE)

Em um ambiente Java SE, use System.getenv() para ler as variáveis de conexão do ambiente. O exemplo de código a seguir mostra uma classe que cria uma conexão com um banco de dados PostgreSQL.

private static Connection getRemoteConnection() { if (System.getenv("RDS_HOSTNAME") != null) { try { Class.forName("org.postgresql.Driver"); String dbName = System.getenv("RDS_DB_NAME"); String userName = System.getenv("RDS_USERNAME"); String password = System.getenv("RDS_PASSWORD"); String hostname = System.getenv("RDS_HOSTNAME"); String port = System.getenv("RDS_PORT"); String jdbcUrl = "jdbc:postgresql://" + hostname + ":" + port + "/" + dbName + "?user=" + userName + "&password=" + password; logger.trace("Getting remote connection with connection string from environment variables."); Connection con = DriverManager.getConnection(jdbcUrl); logger.info("Remote connection successful."); return con; } catch (ClassNotFoundException e) { logger.warn(e.toString());} catch (SQLException e) { logger.warn(e.toString());} } return null; }

Conectar a um banco de dados (plataformas Tomcat)

Em um ambiente Tomcat, as propriedades do ambiente são fornecidas como propriedades do sistema que podem ser acessadas com System.getProperty().

O exemplo de código a seguir mostra uma classe que cria uma conexão com um banco de dados PostgreSQL.

private static Connection getRemoteConnection() { if (System.getProperty("RDS_HOSTNAME") != null) { try { Class.forName("org.postgresql.Driver"); String dbName = System.getProperty("RDS_DB_NAME"); String userName = System.getProperty("RDS_USERNAME"); String password = System.getProperty("RDS_PASSWORD"); String hostname = System.getProperty("RDS_HOSTNAME"); String port = System.getProperty("RDS_PORT"); String jdbcUrl = "jdbc:postgresql://" + hostname + ":" + port + "/" + dbName + "?user=" + userName + "&password=" + password; logger.trace("Getting remote connection with connection string from environment variables."); Connection con = DriverManager.getConnection(jdbcUrl); logger.info("Remote connection successful."); return con; } catch (ClassNotFoundException e) { logger.warn(e.toString());} catch (SQLException e) { logger.warn(e.toString());} } return null; }

Se você tiver problemas para obter uma conexão ou executar instruções SQL, coloque o código a seguir em um arquivo JSP. Esse código conecta a uma instância de banco de dados, cria uma tabela e grava nela.

<%@ page import="java.sql.*" %> <% // Read RDS connection information from the environment String dbName = System.getProperty("RDS_DB_NAME"); String userName = System.getProperty("RDS_USERNAME"); String password = System.getProperty("RDS_PASSWORD"); String hostname = System.getProperty("RDS_HOSTNAME"); String port = System.getProperty("RDS_PORT"); String jdbcUrl = "jdbc:mysql://" + hostname + ":" + port + "/" + dbName + "?user=" + userName + "&password=" + password; // Load the JDBC driver try { System.out.println("Loading driver..."); Class.forName("com.mysql.jdbc.Driver"); System.out.println("Driver loaded!"); } catch (ClassNotFoundException e) { throw new RuntimeException("Cannot find the driver in the classpath!", e); } Connection conn = null; Statement setupStatement = null; Statement readStatement = null; ResultSet resultSet = null; String results = ""; int numresults = 0; String statement = null; try { // Create connection to RDS DB instance conn = DriverManager.getConnection(jdbcUrl); // Create a table and write two rows setupStatement = conn.createStatement(); String createTable = "CREATE TABLE Beanstalk (Resource char(50));"; String insertRow1 = "INSERT INTO Beanstalk (Resource) VALUES ('EC2 Instance');"; String insertRow2 = "INSERT INTO Beanstalk (Resource) VALUES ('RDS Instance');"; setupStatement.addBatch(createTable); setupStatement.addBatch(insertRow1); setupStatement.addBatch(insertRow2); setupStatement.executeBatch(); setupStatement.close(); } catch (SQLException ex) { // Handle any errors System.out.println("SQLException: " + ex.getMessage()); System.out.println("SQLState: " + ex.getSQLState()); System.out.println("VendorError: " + ex.getErrorCode()); } finally { System.out.println("Closing the connection."); if (conn != null) try { conn.close(); } catch (SQLException ignore) {} } try { conn = DriverManager.getConnection(jdbcUrl); readStatement = conn.createStatement(); resultSet = readStatement.executeQuery("SELECT Resource FROM Beanstalk;"); resultSet.first(); results = resultSet.getString("Resource"); resultSet.next(); results += ", " + resultSet.getString("Resource"); resultSet.close(); readStatement.close(); conn.close(); } catch (SQLException ex) { // Handle any errors System.out.println("SQLException: " + ex.getMessage()); System.out.println("SQLState: " + ex.getSQLState()); System.out.println("VendorError: " + ex.getErrorCode()); } finally { System.out.println("Closing the connection."); if (conn != null) try { conn.close(); } catch (SQLException ignore) {} } %>

Para exibir os resultados, coloque o seguinte código no corpo da parte HTML do arquivo JSP.

<p>Established connection to RDS. Read first two rows: <%= results %></p>

Solução de problemas de conexões do banco de dados

Se você tiver problemas para se conectar a um banco de dados a partir do seu aplicativo, revise o banco de dados e o log do contêiner da web.

Revisar logs

Você pode visualizar todos os logs do ambiente Elastic Beanstalk de dentro do Eclipse. Se você não tiver a visualização do AWS Explorer aberta, escolha a seta ao lado do ícone laranja da AWS na barra de ferramentas e, em seguida, escolha Show AWS Explorer View. Expanda AWS Elastic Beanstalk e o nome do seu ambiente, em seguida, abra o menu de contexto (clique com o botão direito do mouse) do servidor. Escolha Open in WTP Server Editor.

Escolha a guia Log da visualização Server para ver os logs agregados do ambiente. Para abrir os logs mais recentes, escolha o botão Refresh no canto superior direito da página.

Role para baixo para localizar os logs do Tomcat em /var/log/tomcat7/catalina.out. Se você carregou a página da web do exemplo anterior várias vezes, talvez veja o seguinte.

------------------------------------- /var/log/tomcat7/catalina.out ------------------------------------- INFO: Server startup in 9285 ms Loading driver... Driver loaded! SQLException: Table 'Beanstalk' already exists SQLState: 42S01 VendorError: 1050 Closing the connection. Closing the connection.

Todas as informações que o aplicativo web envia para a saída padrão aparecem no log do contêiner da web. No exemplo anterior, o aplicativo tenta criar a tabela sempre que a página carrega. Isso resulta na detecção de uma exceção SQL em cada carregamento de página após o primeiro.

Como exemplo, o antecedente é aceitável. Mas em aplicativos reais, mantenha suas definições de banco de dados em objetos de esquema, execute transações de dentro de classes do modelo e coordene solicitações com servlets de controlador.

Conectar a uma instância de banco de dados do RDS

Você pode se conectar diretamente à instância de banco de dados do RDS no seu ambiente Elastic Beanstalk usando o aplicativo cliente MySQL.

Primeiro, abra o security group de sua instância de banco de dados do RDS para permitir o tráfego de seu computador.

  1. Abra o Console do Elastic Beanstalk.

  2. Navegue até a página de gerenciamento do ambiente.

  3. Escolher configuração.

  4. Na categoria de configuração Database (Banco de dados), selecione Modify (Modificar).

  5. Ao lado de Endpoint, escolha o link do console do Amazon RDS.

  6. Na página de detalhes da instância RDS Dashboard, em Security and Network, escolha o security group que começa com rds- ao lado de Security Groups.

    nota

    O banco de dados pode ter várias entradas com o rótulo Security Groups. Use a primeira, que começa com awseb, somente se você tem uma conta mais antiga que não tem uma Amazon Virtual Private Cloud (Amazon VPC) padrão.

  7. Em Security group details, escolha a guia Inbound e, em seguida, Edit.

  8. Adicione uma regra para MySQL (porta 3306) que permita o tráfego de seu endereço IP, especificado no formato CIDR.

  9. Escolha Salvar. As alterações entram em vigor imediatamente.

Retorne aos detalhes de configuração do Elastic Beanstalk do seu ambiente e observe o endpoint. Você usará o nome de domínio para se conectar à instância de banco de dados do RDS.

Instale o cliente MySQL e inicie uma conexão com o banco de dados na porta 3306. No Windows, instale o MySQL Workbench a partir da página inicial do MySQL e siga as instruções.

No Linux, instale o cliente MySQL usando o gerenciador de pacote para sua distribuição. O exemplo a seguir funciona no Ubuntu e em outros derivados de Debian.

// Install MySQL client $ sudo apt-get install mysql-client-5.5 ... // Connect to database $ mysql -h aas839jo2vwhwb.cnubrrfwfka8.us-west-2.rds.amazonaws.com -u username -ppassword ebdb Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 117 Server version: 5.5.40-log Source distribution ...

Depois de conectado, execute comandos SQL para ver o status do banco de dados, verificar se suas tabelas e linhas foram criadas e outras informações.

mysql> SELECT Resource from Beanstalk; +--------------+ | Resource | +--------------+ | EC2 Instance | | RDS Instance | +--------------+ 2 rows in set (0.01 sec)