Binary Coffee

Como conectarte a Amazon Aurora Serverless con .net y Entity Framework

c# .net
Si estĂĄs aca asumirĂ© que sabes quĂ© es Amazon Aurora Serverless, si no lo sabes puedes mirar [aquĂ­](https://aws.amazon.com/es/rds/aurora/serverless/). 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). ![Image](https://api.binary-coffee.dev/uploads/Captura_de_pantalla_de_2020_07_17_22_36_21_7f87f491c7.png) Agregamos el archivo `.pem` para conectarnos vĂ­a SSH. ![Image](https://api.binary-coffee.dev/uploads/Captura_de_pantalla_de_2020_07_17_22_37_14_3c01eea5ca.png) Nos debe quedar algo como esto: ![Image](https://api.binary-coffee.dev/uploads/Captura_de_pantalla_de_2020_07_17_22_34_58_2937c2811a.png) 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`.
Opiniones