2016-02-08 9 views
5

Sono nuovo con AWS e sto lavorando alla creazione di una funzione lambda su Python. La funzione otterrà lo stream della tabella dynamodb e scriverà su un file in s3. Qui il nome del file dovrebbe essere il nome della tabella. Qualcuno può dirmi come ottenere il nome della tabella se il trigger che sta invocando la funzione lambda?Come ottenere il nome della tabella nella funzione di trigger dynamodb di AWS?

Grazie per l'aiuto.

risposta

11

Dato che hai menzionato che sei nuovo in AWS, risponderò in modo descrittivo.

Suppongo che tu abbia impostato l'impostazione "Stream abilitato" per la tua tabella DynamoDB su "Sì", e l'hai configurata come sorgente di eventi per la tua funzione lambda.

Questo è come ho ottenuto il nome della tabella dal torrente che ha invocato la mia funzione lambda -

def lambda_handler(event, context): 
    print(json.dumps(event, indent=2)) # Shows what's in the event object 
    for record in event['Records']: 
     ddbARN = record['eventSourceARN'] 
     ddbTable = ddbARN.split(':')[5].split('/')[1] 
     print("DynamoDB table name: " + ddbTable) 
    return 'Successfully processed records.' 

In sostanza, l'oggetto event che contiene tutte le informazioni su un particolare flusso DynamoDB che è stato responsabile per quel particolare lambda funzione invoke, contiene un parametro eventSourceARN. Questo eventSourceARN è l'ARN (Amazon Resource Number) che identifica in modo univoco la tabella DynamoDB da cui si è verificato lo event.

questo è un valore di esempio per eventSourceARN -

ARN: AWS: DynamoDB: noi-est-1: 111.111.111.111: tavolo/prova /stream/2020-10-10T08:18:22.385

Si noti il ​​testo in grassetto sopra - test; questo è il nome della tabella che stai cercando.

Nella riga ddbTable = ddbARN.split(':')[5].split('/')[1] sopra, ho cercato di suddividere l'intero ARN da ':' prima, e poi da '/' per ottenere il valore prova. Una volta ottenuto questo valore, è possibile chiamare le API S3 per scrivere su un file in S3 con lo stesso nome.

Spero che questo aiuti.

+0

Aiuta. Grazie. – AIR

+1

@AIR Cool! Se ritieni di aver risolto il tuo problema, puoi contrassegnarlo come risposta? Grazie. – rk2

+0

record.eventSourceARN.split ('/') [1] –

0

Un modo per farlo sarà tramite pattern matching a Scala usando espressioni regolari:

val ddbArnRegex: Regex = """arn:aws:dynamodb:(.+):(.+):table/(.+)/stream/(.+)""".r 

def parseTableName(ddbARN: String): Option[String] = { 
    if (null == ddbARN) None 
    ddbARN match { 
    case ddbArnRegex(_, _, table, _) => Some(table) 
    case _ => None 
    } 
}