DynamoDB strømmer med Lambda

Dynamodb Strommer Med Lambda



DynamoDB Streams er en funksjon i Amazon DynamoDB som lar deg få en sanntidsstrøm av endringer eller dataendringer som gjøres i DynamoDB-tabellene dine. Du kan bruke denne funksjonen til å bygge applikasjonene som reagerer på dataendringer i DynamoDB-tabeller, for eksempel oppdatering av cacher og sending av varsler.

Selvfølgelig kan du også bruke DynamoDB-strømmene til å trigge nedstrømsprosessene og AWS Lambda-funksjoner. Lambda, per definisjon, er en serverløs databehandlingstjeneste som kjører koden din som svar på hendelser og automatisk administrerer dataressursene for deg.

Du kan bruke Lambda til å skrive koden i Node.js, Python, Java eller C# for å behandle strømpostene og utføre passende handlinger. Hovedfordelen med å integrere DynamoDB Streams med Lambda er at Lambda lar deg kjøre de støttede tjenestene eller applikasjonskodene uten behov for administrasjon.







Slik bruker du AWS DynamoDB-strømmer med Lambda

Selv om det er mulig å lage en Lambda-funksjon som bruker hendelsene og hendelsene fra en DynamoDB-strøm, kan prosessen være ganske krevende, spesielt på ditt første forsøk. Følgende trinn vil hjelpe:



Trinn 1: Sørg for at systemet oppfyller forutsetningene

Denne prosedyren vil bare være vellykket hvis du kjenner de grunnleggende Lambda-operasjonene og -prosessene. Derfor bør dette være din første for å sikre at din forståelse av Lambda er over gjennomsnittet.



Den andre forutsetningen som er verdt å vurdere er å bekrefte systemets AWS-versjon. Du kan bruke følgende kommando:





aws –versjon

Resultatet for den angitte kommandoen skal se slik ut:

aws-cli/ 2 .x.x Python/ 3 .x.x Linux/ 4 .x.x-xxx-std botocore/ 2 .x.x

Det gitte eksempelsvaret inneholder den installerte versjonen av AWS CLI ( aws-cli/2.x.x ), Python-versjonen ( Python/3.x.x ), og operativsystemet ( Linux/4.x.x-xxx-std ). Den siste delen av svaret definerer Botocore-bibliotekversjonen som din AWS CLI kjører på ( botocore/2.x.x ).



Du vil derfor ende opp med noe slikt:

Trinn 2: Opprett en utførelsesrolle

Det neste trinnet er å opprette en utførelsesrolle i AWS CLI. En utførelsesrolle er en AWS Identity and Access Management (IAM)-rolle påtatt av en AWS-tjeneste for å utføre oppgavene på dine vegne. Det gir deg tilgang til AWS-ressurser som du trenger underveis.

Du kan opprette en rolle ved å bruke følgende kommando:

aws iam create-rolle \

--rollenavn LambdaDynamoDBExecutionRole \

--assume-role-policy-document file://assume-role-policy.json \

--beskrivelse 'AWSLambdaDynamoDBExecutionRole' \

--tjenestenavn lambda.amazonaws.com

Den forrige kommandoen er en AWS CLI-kommando for å opprette en rolle. Du kan også bruke Amazon Management Console til å opprette en rolle. Når du er ved IAM-konsollen, åpner du Roller siden og klikk på Skap rolle knapp.

Fortsett for å angi følgende:

  • Trusted Entity: Lambda
  • Rollenavn: lambda-dynamodb-rolle
  • Tillatelser: AWSLambdaDynamoDBExecutionRole

Du kan også bruke Python ved først å installere AWS SDK for Python:

pip installer boto3

Trinn 3: Aktiver DynamoDB-strømmene på bordet ditt

Du må aktivere DynamoDB-strømmene på bordet ditt. For denne illustrasjonen bruker vi Boto3, AWS SDK for Python. Følgende kommando vil hjelpe:

importer boto3

# Koble til DynamoDB-tjenesten
dynamodb = boto3.client( 'dynamodb' )

# Aktiver DynamoDB-strømmer på 'my-table'-tabellen
respons = dynamodb.update_table(
Tabellnavn= 'mytable' ,
StreamSpecification={
'StreamEnabled' : Sant,
'StreamViewType' : 'NEW_AND_OLD_IMAGES'
}
)

# Sjekk svaret for å sikre at strømmen ble aktivert
hvis svar[ 'Strømspesifikasjon' ][ 'StreamEnabled' ]:
skrive ut( 'DynamoDB-strøm aktivert vellykket' )
ellers:
skrive ut( 'Feil ved aktivering av DynamoDB-strøm' )

Denne koden aktiverer DynamoDB-strømmen på 'mytable'-tabellen som strømmer både nye og gamle bilder av elementer så snart endringer skjer. Du kan velge å bare streame de nye bildene så snart StreamViewType til 'NEW_IMAGE'.

Spesielt kan det hende at kjøring av denne koden bare aktiverer strømmene på bordene dine etter en stund. I stedet kan prosessen ta litt tid. Du kan bruke describe_table-metoden for å sjekke statusen til strømmen.

Trinn 4: Lag Lambda-funksjonen

Det neste trinnet er å lage en Lambda-funksjon som utløser DynamoDB-strømmen. Følgende trinn skal hjelpe:

  • Åpne AWS Lambda-konsollen og klikk på 'Opprett funksjon'-fanen. På siden 'Opprett funksjon', velg 'Forfatter fra bunnen av' og skriv inn et navn for funksjonen din. Du må også angi kjøretiden din på dette tidspunktet. Vi valgte Python for denne illustrasjonen.
  • Under 'Velg eller opprett en utførelsesrolle', velg 'Opprett en ny rolle med grunnleggende Lambda-tillatelser' for å opprette en IAM-rolle med de nødvendige tillatelsene for din Lambda-funksjon.
  • Klikk på 'Opprett funksjon'-knappen for å lage din Lambda-funksjon.
  • På «Konfigurasjon»-siden for funksjonen din, bla ned til «Designer»-delen og klikk på «Legg til trigger»-fanen.
  • I boksen 'Trigger configuration' som vises, velg 'DynamoDB' fra rullegardinmenyen 'Trigger'.
  • Velg DynamoDB-tabellen du vil bruke til å utløse funksjonen. Når du er ferdig, velger du om du vil at funksjonen skal utløses på alle oppdateringer av tabellen eller bare på spesifikke oppdateringer (som oppdateringer til bestemte kolonner).
  • Klikk på 'Legg til'-knappen for å opprette utløseren.
  • I 'Funksjonskode'-editoren skriver du Python-koden for funksjonen din. Du kan bruke hendelsesobjektet som sendes til funksjonen din for å få tilgang til dataene som utløser funksjonen.
  • Klikk på 'Lagre'-knappen for å lagre funksjonen.

Det er alt som skjer når du lager en Lambda-funksjon! Funksjonen din utløses nå hver gang det er oppdateringer til den spesifiserte DynamoDB-tabellen.

Her er et eksempel på en enkel Python-funksjon som DynamoDB-strømmen kan utløse:

def lambda_handler(hendelse, kontekst):

for rekord i hendelse[ 'Rekord' ]:

print(record[ 'dynamodb' ][ 'NewImage' ])

Denne funksjonen itererer gjennom postene i hendelsesobjektet og skriver ut det nye bildet av elementet i DynamoDB-tabellen som utløser funksjonen.

Trinn 5: Test Lambda-funksjonen

For å teste en Lambda-funksjon som en DynamoDB-strøm kan utløse, kan du bruke boto3 bibliotek for å få tilgang til DynamoDB API og påkalle metoden for Lambda klient for å utløse funksjonen.

Her er et eksempel på hvordan du gjør det:

importer boto3

# Koble til DynamoDB-tjenesten
dynamodb = boto3.client( 'dynamodb' )

# Koble til Lambda-tjenesten
lambda_client = boto3.client( «lambda» )

# Sett inn et element i 'my-table'-tabellen
respons = dynamodb.put_item(
Tabellnavn= 'mytable' ,
Vare={
'id' :{ 'N' : '123' },
'Navn' :{ 'S' : 'Joel Austin},
'
alder ':{' N ':' 3. 4 '}
}
)

# Sjekk svaret for å forsikre deg om at elementet ble satt inn
hvis svar['
ResponseMetadata '][' HTTPStatuskode '] == 200:
print('Elementet ble satt inn')
ellers:
print('Feil ved innsetting av element')

# Utløs Lambda-funksjonen som abonnerer på '
mitt-bord ' tabell
respons = lambda_client.invoke(
Function,
InvocationType='
Begivenhet ',
LogType='
Hale ',
Nyttelast='
{ 'Rekord' :[{ 'dynamodb' :{ 'Nytt bilde' :{ 'id' :{ 'N' : '123' }, 'Navn' :{ 'S' : 'Joel Austin' }, 'alder' :{ 'N' : '3. 4' }}}}]} '
)

# Sjekk svaret for å sikre at funksjonen ble utløst vellykket
hvis svar['
Statuskode '] == 202:
print('Lambda-funksjonen ble utløst')
ellers:
print ('Feil ved utløsning av Lambda-funksjon')

Denne koden setter først inn et element i mytabel tabellen og utløser deretter min funksjon Lambda-funksjonen ved å sende en prøvehendelsesnyttelast til funksjonen ved å bruke påkalle metode. Hendelsesnyttelasten simulerer en DynamoDB-strømhendelse som inkluderer det nye bildet av elementet som nettopp ble satt inn.

Du kan deretter sjekke loggene til Lambda-funksjonen for å se om den har utløst og behandlet hendelsesdataene.

Konklusjon

Det er viktig å merke seg at du kan påkalle flere ganger for den samme strømposten som en DynamoDB-strøm kan utløse en Lambda-funksjon. Den primære årsaken bak dette er at strømpostene til slutt er konsistente, og det er mulig å behandle den samme posten flere ganger med Lambda-funksjonen. Det er avgjørende å designe Lambda-funksjonen din for å håndtere denne saken riktig.