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

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

Agregamos el archivo .pem para conectarnos vía SSH.

Image

Nos debe quedar algo como esto:

Image

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