Connessione ad Amazon DocumentDB dall'esterno di un VPC AWS

pubblicato da il 07/05/2020 alle 7:32

AWS  Data Access  NoSQL 

Introduzione

Per qualunque app o servizio ospitato su AWS connettersi ad un cluster Amazon DocumentDB nel medesimo Virtual Private Cloud (VPC) è assolutamente agevole: accedendo alla console di gestione del cluster, infatti, potremo facilmente visionare le informazioni utili a tale scopo tra le quali, nella sezione Connect:

  • Il comando che permette la connessione al cluster usando la Mongo shell
  • La stringa di connessione utile per connettersi al cluster da una applicazione client: tale applicazione potrà essere sia un nostro progetto che un generico client Mongo

E' opportuno però specificare subito che, malgrado gli endpoint DocumentDB siano pubblici, per ragioni di sicurezza non è possibile stabilire una connessione diretta da parte di un client che non risieda nel medesimo VPC: per connetterci, ad esempio, dal nostro PC o da un VPC differente è quindi necessario stabilire un tunnel SSH creando una istanza EC2 posizionata nello stesso security group del cluster e successivamente seguendo le modalità che ci mostreranno come effettuare il tunneling.

Creare l'istanza EC2

Ai fini di questo articolo, avvieremo una istanza EC2 selezionando la dimensione t2.micro, in caso il free tier sia ancora ttivo, oppure t2.nano e scegliendo Amazon Linux (x86) quale sistema operativo, creando un nuovo key pair chiamato sshtunnel del quale provvederemo ad effettuare il download. Dopo aver fatto accesso alla console di EC2, premiamo Launch instance e selezioniamo la distro e dimensione desiderate, premendo poi Review and lauch.

Giunti allo step di revizione della configurazione, premiamo Edit security groups e, quindi, selezioniamo per la nostra istanza il medesimo security group al quale è associato il nostro cluster DocumentDB. Fatto ciò, potremo premere Review and launch e, infine, Launch per confermare l'operazione ed attendere che l'istanza EC2 venga avviata.
In questa fase dovremo anche procedere alla creazione e download del key pair che, nel nostro caso, sarà un file chiamato sshtunnel.pem.

Poichè ci connetteremo mediante SSH (porta TCP 22) alla istanza EC2 e, da essa, a MongoDB (porta TCP 27017) dovremo, ove già non ne disponessimo, creare due regole inbound ad hoc nel security group:

Regole inbound per SSH e MongoDB

Creazione del tunnel

Effettuato ciò, potremo quindi creare il tunnel SSH impartendo dal prompt:

C:\> ssh -i "C:\Users\andys\OneDrive\Documenti\.aws\sshtunnel.pem" ec2-user@ec2-34-244-141-235.eu-west-1.compute.amazonaws.com

Essendo ora posizionati sulla shell della nostra istanza EC2, possiamo procedere alla installazione della Mongo shell seguendo le istruzioni riportate dalla documentazione. In sintesi, si tratta di:

  1. Configurare yum, il package manager di questa distro Linux, creando il file di definizione del package di MongoDB

    [ec2-user@ip-172-31-24-96 ~]$ sudo vi /etc/yum.repos.d/mongodb-org-3.6.repo

  2. Scrivere, all'interno del file, i dati del package:

    [mongodb-org-3.6]
    name=MongoDB Repository
    baseurl=https://repo.mongodb.org/yum/amazon/2013.03/mongodb-org/3.6/x86_64/
    gpgcheck=1
    enabled=1
    gpgkey=https://www.mongodb.org/static/pgp/server-3.6.asc

  3. Installare il package:

    [ec2-user@ip-172-31-24-96 ~]$ sudo yum install -y mongodb-org-3.6.18 mongodb-org-server-3.6.18 mongodb-org-shell-3.6.18 mongodb-org-mongos-3.6.18 mongodb-org-tools-3.6.18

Effettuato ciò, scarichiamo il certificato digitale che ci occorrerà per stabilire una connessione:

[ec2-user@ip-172-31-24-96 ~]$ wget https://s3.amazonaws.com/rds-downloads/rds-combined-ca-bundle.pem

A questo punto, potremo stabilire una connessione alla nostra istanza DocumentDB per verificarne il corretto funzionamento mediante la Mongo shell:

[ec2-user@ip-172-31-24-96 ~]$ mongo --ssl --host merp-eventstore.cluster-ctu4dtfm6tdo.eu-west-1.docdb.amazonaws.com:27017 --sslCAFile rds-combined-ca-bundle.pem --username eventstoreadmin --password [ThePassword]
MongoDB shell version v3.6.18
connecting to: mongodb://merp-eventstore.cluster-ctu4dtfm6tdo.eu-west-1.docdb.amazonaws.com:27017/?gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("c90c9493-70d8-4955-b91a-5306b151ca63") }
MongoDB server version: 3.6.0
 
rs0:PRIMARY> db.version()
3.6.0
rs0:PRIMARY> db.stats()
{
    "db" : "test",
    "collections" : 0,
    "objects" : 0,
    "storageSize" : 0,
    "indexes" : 0,
    "indexSize" : 0,
    "fileSize" : 0,
    "ok" : 1
}
rs0:PRIMARY> exit
bye
[ec2-user@ip-172-31-24-96 ~]$