Pubblicato il 23/12/2023 da alnao nella categoria AWS

AWS ha studiato un servizio di base dati specifica per essere usata nelle applicazioni distrubuite e/o ServerLess chiamato Aurora, una database può essere impostato in modalità compatibilità con i DBMS più comuni come MySql oppure PostgreSQL. E’ stato studiato per integrarsi maggiormente con gli altri servizi come le Lambda Function e ha dei costi molto più bassi rispetto alle basi dati create con RDS o altre servizi.
La documentazione ufficiale descrive il suo funzionamento principale:

Da notare che il servizio prevede due versioni di Aurora, si rimanda alla documentazione ufficiale, è possibile gestire anche la migrazione dalla prima alla seconda versione.


La architettura di AWS mette a disposizione i comandi RDS per la gestione dei database già introdotti nell’articolo dedicato ad RDS e un comando specifico della CLI rds-data studiato appositamente per l’esecuzione di query scritte in linguaggio SQL che funziona con i database RDS di tipo Aurora solo alla prima versione, questo comando non funziona con i database RDS non Aurora o la seconda versione dei DB.

La sintassi di esecuzione non è delle più semplici in quanto il comando necessita diversi parametri, per esempio:

aws rds-data execute-sql 
--db-cluster-or-instance-arn "arn:aws:rds:us-east-1:xx:cluster:my-cluster" 
--schema "" 
--database "MarketPlace" 
--aws-secret-store-arn "arn:aws:secretsmanager:us-east-1:xx:secret:xx-xx"
--endpoint-url https://rds-data.us-east-1.amazonaws.com 
--sql-statements "select * from Table"

Da notare che questo comando, oltre ha bisogno di una secret di collegamento configurata nel servizio SSM, senza questa non è possibile collegarsi al servizio. Esistono comandi più evoluti come begin-transaction e execute-statement che permettono di eseguire gruppi di istruzioni.


Per creare e gestire le risorse con la libreria SDK è possibile usare il client già introdotto nell’articolo sul servizio RDS. Per poter eseguire una query è disponibile un client specifico rds-data simile alla riga di comando, infatti i parametri necessari sono gli stessi: il cluster, il secret, il nome del database e la query sql:

import boto3
rdsData = boto3.client('rds-data')
cluster_arn = 'arn:aws:rds:us-east-1:xxxx:cluster:xxxx'
secret_arn = 'arn:aws:secretsmanager:us-east-1:xxxx:secret:xxxxx'
response1 = rdsData.execute_statement(
  resourceArn = cluster_arn,
  secretArn = secret_arn,
  database = 'mydb',
  sql = 'select * from employees limit 3'
)

Questo metodo funziona solo con la prima versione di Aurora ma per gli altri database di RDS e la seconda versione di Aurora è necessario usare altri sistemi per la connessione ai DB. Una possibilità di connessione programmatica ad un database RDS è usare una libreria esterna come pymysql per python in una funzione lambda:

import pymysql
try:
  conn = pymysql.connect(host=C_rds_host, user=C_user_name, passwd=C_password, db=C_db_name, connect_timeout=5)
except pymysql.MySQLError as e:
  print("ERROR: Unexpected error: Could not connect to MySQL instance. GENERIC")
  print(e)
  return {'statusCode': 500 }
cursor1 = conn.cursor()
cursor2.execute(sql )
conn.commit()
cursor2.close()

da ricordare che la lambda deve essere posizionata nella stessa VPC, per esempio con CloudFormation è possibile definire la funzione con la proprietà dedicata alla configurazione di rete:

Lambda:
  Type: AWS::Serverless::Function
  Properties:
    CodeUri: lambda
    Handler: execute_sql.entrypoint
    Runtime: python3.11
    MemorySize: 10240
    Timeout: 900
    Environment: 
      Variables:
        DbUserName: !Ref DbUserName
        DbPassword: !Ref DbPassword
        RdsHost: !Ref RdsHost
        DbName: !Ref DbName
    Role: !GetAtt LambdaExecutionRole.Arn
    VpcConfig:
      SubnetIds: #devono essere le private?
        - !Ref Subnet1
        - !Ref Subnet2
      SecurityGroupIds:
        - !Ref SecurityGroupIds

Come si può vedere dall’esempio, oltre la configurazione della VPC e delle Subnet, è presente anche la configurazione di un security group, questo è necessario per permettere la connessione dalle lambda al database RDS, per maggiori dettagli in una pagina nel sito ufficiale.

MENU