Pubblicato il 18/06/2022 da alnao nella categoria AWS

Per completare il CRUD iniziato nel precedente articolo bisogna aggiungere il metodo di aggiornamento e di cancellazione dei dati nel Dynamo, in questo caso basta aggingere i due metodi alla ApiGateway

ES12ApiGateway:
Type: AWS::Serverless::Api
Properties:
StageName: !Ref Stage
OpenApiVersion: 3.0.2
CacheClusterEnabled: false
CacheClusterSize: '0.5'
Cors:
AllowMethods: "'POST, GET'"
AllowOrigin: "'*'"
MaxAge: "'600'"
MethodSettings:
- ResourcePath: /
HttpMethod: GET
CachingEnabled: false
CacheTtlInSeconds: 300
- ResourcePath: /
HttpMethod: POST
CachingEnabled: false
CacheTtlInSeconds: 300
- ResourcePath: /
HttpMethod: DELETE
CachingEnabled: false
CacheTtlInSeconds: 300

Il metodo di aggiornamento con il metodo POST è un po’ più complicato della GET perchè i dati devono essere serializzati secondo una libreria Dynamo disponibile, un esempio semplice è:

import boto3
import os
import json
import datetime
from boto3.dynamodb.types import TypeSerializer, TypeDeserializer
TABLE_NAME = os.environ['DynamoName']
def handler(event, context):
print("Esecuzione" + json.dumps(event) )
post_str = event['body']
post = json.loads(post_str)
current_timestamp = datetime.datetime.now().isoformat()
post['updatedAt'] = current_timestamp
#print("Esecuzione post" + json.dumps(post) )
ts= TypeSerializer()
serialized_post= ts.serialize(post)["M"]
#print("Esecuzione serialized_post" + json.dumps(serialized_post) )
client = boto3.client('dynamodb')
res = client.put_item(TableName=TABLE_NAME,Item=serialized_post)
return {'body': json.dumps(res), 'statusCode': 201}

Da notare che è presente la gestione del cors nell’header di output altrimenti si genererebbe errore in fase di chiamata esterna. Per il metodo di cancellazione è possibile sempre usare la libreria boto3 e il cliente Dynamo con il metodo delete_item al quale bisogna passare la chiave da eliminare, nell’esempio si usa solo il campo id:

import boto3
import os
import json
import datetime
from boto3.dynamodb.types import TypeSerializer, TypeDeserializer
TABLE_NAME = os.environ['DynamoName']
def handler(event, context):
print("Esecuzione" + json.dumps(event) )
post_str = event['body']
post = json.loads(post_str)
idValue = post['id']
client = boto3.client('dynamodb')
res = client.delete_item(TableName=TABLE_NAME,Key={ 'id' : { 'S' : idValue } } )
return {'body': json.dumps(res), 'statusCode': 201}

Per ottenrere l’url delle API create, si può indicare nel template un output dove visualizzare l’informazione richiesta

UrlGet:
Description: Endpoint URL API REST
Value:!Sub https://${ES12ApiGateway}.execute-api.${AWS::Region}.amazonaws.com/${Stage}

Nell’esempio disponibile su GIT è stata aggiunta anche una funzione Lambda per il caricamento da file CSV in modo da rendere l’esempio più completo possibile.

https://github.com/alnao/AWSCloudFormationExamples/tree/master/Esempio12dynamoApiCrud