Añadir una instancia de base de datos de Amazon RDS a un entorno de aplicaciones Java - AWS Elastic Beanstalk

Añadir una instancia de base de datos de Amazon RDS a un entorno de aplicaciones Java

Puede usar una instancia de base de datos de Amazon Relational Database Service (Amazon RDS) para almacenar los datos recopilados y modificados por la aplicación. La base de datos se puede adjuntar al entorno y administrarse con Elastic Beanstalk, o bien, crearse y administrarse de forma externa.

Si es la primera vez que utiliza Amazon RDS, añada una instancia de base de datos a un entorno de prueba con la consola de Elastic Beanstalk y verifique que su aplicación puede conectarse a ella.

Para agregar una instancia de base de datos al entorno

  1. Abra la consola de Elastic Beanstalk y, en la lista Regiones, seleccione su región de AWS.

  2. En el panel de navegación, elija Environments (Entornos) y, a continuación, elija el nombre del entorno en la lista.

    nota

    Si tiene muchos entornos, utilice la barra de búsqueda para filtrar la lista de entornos.

  3. En el panel de navegación, elija Configuration (Configuración).

  4. En la categoría de configuración Database (Base de datos), seleccione Edit (Editar).

  5. Seleccione un motor de base de datos y escriba el nombre de usuario y la contraseña.

  6. Seleccione Aplicar.

Se tarda alrededor de 10 minutos en añadir una instancia de base de datos. Cuando se haya completado la actualización del entorno, el nombre de host de la instancia de base de datos y otra información de conexión estarán disponibles para su aplicación mediante las siguientes propiedades de entorno

Nombre de la propiedad Descripción Valor de la propiedad

RDS_HOSTNAME

El nombre de host de la instancia de base de datos.

En la pestaña Connectivity & security (Conectividad y seguridad) de la consola de Amazon RDS: Endpoint (Punto de enlace).

RDS_PORT

El puerto en que la instancia de base de datos acepta las conexiones. El valor predeterminado varía dependiendo del motor de base de datos.

En la pestaña Connectivity & security (Conectividad y seguridad) de la consola de Amazon RDS: Port (Puerto).

RDS_DB_NAME

El nombre de la base de datos, ebdb

En la pestaña Configuration (Configuración) de la consola de Amazon RDS: DB Name (Nombre de la base de datos).

RDS_USERNAME

El nombre de usuario que ha configurado para la base de datos.

En la pestaña Configuration (Configuración) de la consola de Amazon RDS: Master username (Nombre de usuario maestro).

RDS_PASSWORD

La contraseña que ha configurado para la base de datos.

No está disponible para referencia en la consola de Amazon RDS.

Para obtener más información sobre cómo configurar una instancia de base de datos interna, consulte Añadir una base de datos al entorno de Elastic Beanstalk. Para obtener instrucciones sobre cómo configurar una base de datos externa para usarla con Elastic Beanstalk, consulte Uso de Elastic Beanstalk con Amazon RDS.

Para conectarse a la base de datos, añada el archivo JAR del controlador correspondiente a su aplicación, cargue la clase del controlador en el código y cree un objeto de conexión con las propiedades de entorno proporcionadas por Elastic Beanstalk.

Descargar el controlador JDBC

Necesitará el archivo JAR del controlador JDBC para el motor de base de datos que elija. Guarde el archivo JAR en su código fuente e inclúyalo en su classpath cuando compile la clase que crea las conexiones a la base de datos.

Puede encontrar el controlador más reciente para su motor de base de datos en las siguientes ubicaciones:

Para utilizar el controlador JDBC, llame a Class.forName() para cargarlo antes de crear la conexión con DriverManager.getConnection() en su código.

JDBC utiliza una cadena de conexión con el siguiente formato:

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

Puede recuperar el nombre de host, el puerto, el nombre de la base de datos, el nombre de usuario y la contraseña desde las variables de entorno que Elastic Beanstalk proporciona a la aplicación. El nombre del controlador es específico del tipo de base de datos y de la versión del controlador. A continuación se muestran algunos nombres de controlador de ejemplo:

  • 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

Conexión a una base de datos (plataformas Java SE)

En un entorno de Java SE, use System.getenv() para leer las variables de conexión del entorno. El siguiente código de ejemplo muestra una clase que crea una conexión a una base de datos 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; }

Conexión a una base de datos (plataformas Tomcat)

En un entorno Tomcat, las propiedades de entorno se proporcionan como propiedades del sistema accesibles con System.getProperty().

El siguiente código de ejemplo muestra una clase que crea una conexión a una base de datos 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; }

Si tiene problemas para obtener una conexión o ejecutar instrucciones SQL, pruebe a colocar el siguiente código en un archivo JSP. Este código establece una conexión con una instancia de base de datos, crea una tabla y escribe en ella.

<%@ 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 mostrar los resultados, coloque el siguiente código en el cuerpo de la parte HTML del archivo JSP.

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

Resolución de problemas de conexión a la base de datos

Si surgen problemas al conectarse a una base de datos desde la aplicación, examine el archivo log del contenedor web y la base de datos.

Consulta de logs

Puede ver todos los logs de su entorno de Elastic Beanstalk desde Eclipse. Si no tiene abierta la vista de AWS Explorer, elija la flecha situada junto al icono de AWS naranja en la barra de herramientas y, a continuación, elija Show AWS Explorer View. Expanda AWS Elastic Beanstalk y el nombre de su entorno y, a continuación, abra el menú contextual (haga clic con el botón derecho) del servidor. Elija Open in WTP Server Editor.

Elija la pestaña Log de la vista Server para ver los registros acumulados de su entorno. Para abrir los últimos registros, seleccione el botón Refresh en la esquina superior derecha de la página.

Desplácese hacia abajo para localizar los logs de Tomcat en /var/log/tomcat7/catalina.out. Si ha cargado la página web desde nuestro ejemplo anterior varias veces, es posible que vea lo siguiente.

------------------------------------- /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.

Toda la información que la aplicación web envía a la salida estándar aparece en el log del contenedor web. En el ejemplo anterior, la aplicación intenta crear la tabla cada vez que se carga la página. Esto produce una excepción SQL en cada carga de página después de la primera.

Esto es aceptable porque se trata de un ejemplo. Pero en las aplicaciones reales mantenga las definiciones de base de datos en objetos del esquema, realice las transacciones desde las clases del modelo y coordine las solicitudes con servlets de controlador.

Conexión a una instancia de base de datos de RDS

Puede conectarse directamente a la instancia de base de datos de RDS en su entorno de Elastic Beanstalk usando la aplicación cliente MySQL.

En primer lugar, abra el grupo de seguridad en su instancia de base de datos de RDS para permitir el tráfico desde su equipo.

  1. Abra la consola de Elastic Beanstalk y, en la lista Regiones, seleccione su región de AWS.

  2. En el panel de navegación, elija Environments (Entornos) y, a continuación, elija el nombre del entorno en la lista.

    nota

    Si tiene muchos entornos, utilice la barra de búsqueda para filtrar la lista de entornos.

  3. En el panel de navegación, elija Configuration (Configuración).

  4. En la categoría de configuración Database (Base de datos), elija Edit (Editar).

  5. Junto a Endpoint (Punto de enlace), elija el enlace de la consola de Amazon RDS.

  6. En la página de detalles de la instancia de RDS Dashboard, bajo Security and Network, elija el grupo de seguridad que empieza por rds- situado junto a Security Groups.

    nota

    La base de datos podría tener varias entradas etiquetadas como Security Groups. Utilice la primera, que empieza por awseb, solo si tiene una cuenta antigua que no dispone de una Amazon Virtual Private Cloud (Amazon VPC) predeterminada.

  7. En Security group details, elija la pestaña Inbound y, a continuación, elija Edit.

  8. Añada una regla para MySQL (puerto 3306) que permita el tráfico procedente de la dirección IP, especificada en formato CIDR.

  9. Seleccione Save (Guardar). Los cambios surtirán efecto de inmediato.

Consulte de nuevo los datos de configuración de Elastic Beanstalk para el entorno y anote el punto de enlace. Utilizará el nombre de dominio para conectarse a la instancia de base de datos de RDS.

Instale el cliente de MySQL e inicie una conexión con la base de datos en el puerto 3306. En Windows, instale MySQL Workbench desde la página de inicio de MySQL y siga las instrucciones.

En Linux, instale el cliente de MySQL con el administrador de paquetes de su distribución. El siguiente ejemplo funciona en Ubuntu y otros 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 ...

Una vez que se haya conectado, puede ejecutar comandos SQL para ver el estado de la base de datos, si se crearon las tablas y las filas y otra información.

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