Si estás aca asumiré que sabes qué es Amazon Aurora Serverless, si no lo sabes puedes mirar aquí.
En Aurora Serverless, AWS no permite ningún tráfico que no sea de AWS. Eso significa que la única forma de conectarse a la base de datos es a través de uno de sus servicios de AWS, una máquina virtual EC2 o tener una VPN alojada en su servicio. Esto trae consigo tener que gastar dinero en una instancia de EC2 o montar una VPN en ese propio servicio de amazon cuando este servicio viene creado precisamente para ahorrarnos dinero. Afortunadamente hay una forma de evitar eso. Podemos usar una instancia micro EC2 que tiene un "free tier" y usar un túnel SSH a nuestros comandos MySQL a través de esta instancia en nuestra base de datos.
Creamos la instancia de EC2 (utilizando la de Ubuntu estamos bien).
Agregamos el archivo .pem
para conectarnos vía SSH.
Nos debe quedar algo como esto:
Y vamos con el código:
private SshClient _client;
private ForwardedPortLocal _local;
private MySqlConnection _connection;
public MyDbContext(bool isDebug = false)
{
var builder = new MySqlConnectionStringBuilder();
builder.UserID = Settings.RdsUser;
builder.Password = Settings.RdsPassword;
builder.Database = Settings.RdsDatabase;
builder.PersistSecurityInfo = true;
builder.Port = uint.Parse(Settings.RdsPort);
if (isDebug)
{
var dir = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location);
PrivateKeyFile pkfile = new PrivateKeyFile($@"{dir}/{Settings.KeyFileName}");
_client = new SshClient(Settings.SshTunnelAddress, 22, Settings.SshUserName, pkfile);
_client.Connect();
if (_client.IsConnected)
{
_local = new ForwardedPortLocal("127.0.0.1", 3306, Settings.RdsServer, 3306);
_client.AddForwardedPort(_local);
_local.Start();
}
builder.Port = _local.BoundPort;
builder.Server = "127.0.0.1";
}
else
{
builder.Server = System.Net.Dns.GetHostEntry(Settings.RdsServer)
.AddressList[0]
.MapToIPv4()
.ToString();
}
_connection = new MySqlConnection(builder.ConnectionString);
}
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseMySql(_connection);
}
Acá vemos que cuando estamos en "debug environment" nos conectamos a la instancia de EC2 vía SSH utilizando el key-file previamente generado y redirigimos la petición a Aurora, en cualquier otro caso no es necesario pues nuestro código correría sobre AWS.
Para conectarme vía SSH utilicé el nuget SSH.NET
, no olvides agregarlo en tu .csproj
.