Écrire plusieurs enregistrements dans DynamoDB avec Lambda (Python, JavaScript)

introduction

J'ai dû écrire (mettre à jour) plusieurs enregistrements sur DynamoDB, j'ai donc publié un article parce que je voulais écrire les résultats de la mise en œuvre et les mises en garde. Je publierai également une implémentation en Python et Node.js

supposition

table

Le tableau à écrire cette fois est supposé être le suivant Nom de la table: Utilisateurs Les colonnes et les types (le schéma lui-même n'a pas de type, mais il est décidé comme type de données à enregistrer par commodité) sont les suivants.

ami assume une liste de cartes avec identifiant, nom, clés d'adresse Cette fois, même s'il s'agit d'un type compliqué (tapez comme ami de la table utilisateur), c'est l'une des choses que je veux montrer qu'elle peut être écrite, donc j'ignorerai si la conception de la table est la meilleure en premier lieu.

Préparation de Lambda

Cette fois, je publierai le code qui fonctionne sur Lambda, donc je suppose que Lambda est prêt pour lui-même

Flux d'articles

Exemple de code entier → Commentaire léger J'écrirai dans la procédure de, et à la fin je posterai des éléments supplémentaires communs

Implémentation en Python

import boto3
from boto3.dynamodb.conditions import Key

def update_users(table, users_friends):
   with table.batch_writer() as batch:
      for n in range(3):
        batch.put_item(
          Item={
				"id": n + 1,
				"name": "user" + str(n + 1),
				"address": "address" + str(n + 1),
				"friends": users_friends[n]
          }
        )

def lambda_handler(event, context):
  try:
    dynamoDB = boto3.resource("dynamodb")
    table = dynamoDB.Table("Users")
	  user1_friends = [
		{ "id": 2, "name": "user2", "address": "address2" },
		{ "id": 3, "name": "user3", "address": "address3" }
	  ]
	  user2_friends = [
		{ "id": 1, "name": "user1", "address": "address1" },
		{ "id": 3, "name": "user3", "address": "address3" }
	  ]
	  user3_friends = [
		{ "id": 1, "name": "user1", "address": "address1" },
		{ "id": 2, "name": "user2", "address": "address2" }
	  ]
	  
	  users_friends = [user1_friends, user2_friends, user3_friends]
    
    update_users(table, users_friends)
    
    return event["message"] #Ce qu'il faut retourner est approprié
  except Exception as e:
        print(e)

Commentaire léger

La manière d'écrire le code et les données à écrire ne sont pas essentielles, il est donc normal de les faire passer. L'important est que le contenu de la fonction ʻupdate_users utilise la méthode batch_writequi grandit dans l'instance de modèle DynamoDB. Autrement dit, lorsque vous voulez écrire plusieurs fois, faitesPUT` dans le bloc suivant.

with table.batch_write() as batch:
	# ...Abréviation

De plus, lorsque PUT est terminé, par exemple, batch.put_item est appelé. Décrivez le contenu de l'écriture dans l'argument nommé ʻItem de ce type Et un autre point à noter est que même s'il s'agit d'un type appelé List [Map], il peut être écrit sans problème. Fondamentalement, n'importe quel type peut être écrit correctement dans la base de données en tant que valeur de la clé spécifiée, donc en bref, il n'y a pas de problème si vous passez simplement le dictionnaire que vous souhaitez mettre à jour à ʻItem. Enfin, comme petit supplément, je tourne l'instruction for à l'intérieur du bloc batch_write, mais bien sûr, vous pouvez écrire le batch.put_item plusieurs fois en solide, donc si vous ne pouvez pas l'écrire avec l'instruction for Parfois tu dois juste le faire solidement En outre, il est dit que le nombre maximum d'éléments qui peuvent être écrits en même temps est de 25, mais il semble que s'il y a 25 éléments ou plus, ils renverront ou feront ce qu'ils veulent, il semble donc que vous pouvez écrire du code sans vous soucier du nombre d'éléments.

Implémentation dans Node.js

const AWS = require("aws-sdk");
const dynamoDB = new AWS.DynamoDB.DocumentClient({
  region: "ap-northeast-1"
});

const tableName = "Users";

exports.handler = (event, context) => {
	  const user1Friends = [
		{ id: 2, name: "user2", address: "address2" },
		{ id: 3, name: "user3", address: "address3" }
	  ];
	  const user2Friends = [
		{ id: 1, name: "user1", address: "address1" },
		{ id: 3, name: "user3", address: "address3" }
	  ];
	  const user3Friends = [
		{ id: 1, name: "user1", address: "address1" },
		{ id: 2, name: "user2", address: "address2" }
	  ];
	  const usersFriends = [user1Friends, user2Friends, user3Friends]

    const params = {
		RequestItems: {
		  [tableName]: usersFriends.map((e, i) => ({
			PutRequest: {
			  Item: {
			    id: i + 1,
			    name: `user${i + 1}`,
			    address: `address${i + 1}`,
			    friends: e
			  }
			}
		  }))
		}
	  };
    
//le rappel est approprié
    dynamoDB.batchWrite(params, (e, data) => {
		if (e) {
		  context.fail(e);
		} else {
		  context.succeed(data);
		}
    });
};

Commentaire léger

Comme mentionné dans l'explication en Python, le code et les valeurs de données eux-mêmes sont traversants. L'important ici est la propriété (fonction) appelée batchWrite dans ʻAWS.DynamoDB.DocumentClient. Cet argument est assez original, donc [Classe: AWS.DynamoDB.DocumentClient - AWS SDK for JavaScript](https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/DynamoDB/DocumentClient.html#batchWrite- propriété) Lorsque j'ai examiné plusieurs écritures dans Node.js, j'ai souvent vu batchWriteItem, mais le dernier environnement d'exécution Node.js actuellement disponible dans Lambda (à partir de septembre 2020). Il semble que je ne le ferai pas, donc ça ne bouge pas et c'est difficile La grande différence avec batchWriteItem est que l'objet de ʻItem n'a pas besoin d'être un objet typé spécifique à DynamoDB (tel que name: {" S ":" user "}). En bref, si vous ne vous souciez pas de la valeur que vous voulez écrire et convertissez-la simplement en JSON et passez-la comme valeur de ʻItem`, cela fonctionnera sans problème. Par conséquent, bien sûr, même un type compliqué appelé Map [List] peut être écrit en le passant tel quel.

Supplément global

Si vous souhaitez mettre à jour dans le traitement par lots, vous devez utiliser PUT La raison est simple et il n'y a pas de ʻUPDATE, donc il ne peut pas être aidé, il est donc nécessaire de le décrire régulièrement avec PUT. De plus, comme vous pouvez faire DELETE` dans le processus par lots, je ne me suis pas concentré cette fois, mais je dirai simplement qu'il y a ...

en conclusion

Qu'as-tu pensé Je vois souvent des articles avec du code et une ou deux lignes d'explication pour plusieurs opérations, mais je ne vois pas beaucoup d'explications spécifiquement pour l'écriture (on ne sait pas si même des types compliqués peuvent être utilisés). , En premier lieu, ce sera une erreur lors de l'exécution), je l'ai fait un peu et c'était difficile, alors je l'ai écrit sous forme de mémorandum C'est peut-être un domaine légèrement spécialisé, mais j'espère que vous le trouverez utile.

référence

Amazon DynamoDB — Boto3 Docs 1.14.56 documentation Class: AWS.DynamoDB.DocumentClient — AWS SDK for JavaScript

Recommended Posts

Écrire plusieurs enregistrements dans DynamoDB avec Lambda (Python, JavaScript)
Écrire en csv avec Python
[Python] Ecrire dans un fichier csv avec Python
Manipulation des données DynamoDB avec Lambda (Node et Python)
Connectez-vous à s3 avec AWS Lambda Python
[Python] Comment dessiner plusieurs graphiques avec Matplotlib
[Écrire sur la carte avec plotly] Visualisation dynamique avec plotly [python]
Exemple de notification Slack avec python lambda
Exporter un instantané RDS vers S3 avec Lambda (Python)
Écrire des données CSV sur AWS-S3 avec AWS-Lambda + Python
Télécharger des fichiers sur Google Drive avec Lambda (Python)
Je veux écrire dans un fichier avec Python
[Python] Mention à plusieurs personnes avec l'API de Slack
Utiliser DynamoDB avec Python
Comment écrire une concaténation de chaînes sur plusieurs lignes en Python
[Python] Un mémo pour écrire du CSV verticalement avec Pandas
Je veux AWS Lambda avec Python sur Mac!
Pour ceux qui veulent écrire Python avec vim
Connectez-vous à BigQuery avec Python
Connectez-vous à Wikipedia avec Python
Publiez sur Slack avec Python 3
Écrivez facilement if-elif avec lambda
Écrivons python avec cinema4d.
Basculer python vers 2.7 avec des alternatives
Comment utiliser Python lambda
Tenez compte du prétraitement courant lors du traitement du flux DynamoDB avec Lambda (Python)
[AWS] Essayez d'ajouter la bibliothèque Python à la couche avec SAM + Lambda (Python)
Défi problème 5 avec Python: lambda ... j'ai décidé de copier sans
[Python] Exportez régulièrement de CloudWatch Logs vers S3 avec Lambda
Comment écrire hors ligne en temps réel Résolution des problèmes E05 avec Python
[Présentation de l'application Udemy Python3 +] 58. Lambda
Python: comment utiliser async avec
N'écrivez pas Python si vous voulez l'accélérer avec Python
Connectez-vous à plusieurs bases de données avec SQL Alchemy
Ravi de vous rencontrer avec python
Essayez d'exploiter Facebook avec Python
Détection de visage avec Lambda (Python) + Rekognition
[Python 3.8 ~] Comment définir intelligemment des fonctions récursives avec des expressions lambda
Sortie vers un fichier csv avec Python
[Lambda] [Python] Publier sur Twitter depuis Lambda!
Charger plusieurs fichiers JavaScript avec PyWebView
Convertir la liste en DataFrame avec python
Conversion MP3 → WAV avec Python
Pour faire une récursion avec Python2
Comment démarrer avec Python
Écrivez FW sur TWE-Lite avec TWE-Lite R.
Publiez plusieurs images Twitter avec python
Que faire avec la sortie de PYTHON?
Animez plusieurs images fixes avec Python
Comment calculer la date avec python
Notifier HipChat avec AWS Lambda (Python)
Intégration multiple avec Python et Sympy
Publiez facilement sur Twitter avec Python 3
Je veux déboguer avec Python
Utiliser PostgreSQL avec Lambda (Python + psycopg2)