Amazon Aurora PostgreSQLfonctions définies par l'utilisateur pour Amazon Location Service - Amazon Location Service

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

Amazon Aurora PostgreSQLfonctions définies par l'utilisateur pour Amazon Location Service

Vous pouvez utiliser Amazon Location Service pour utiliser les coordonnées et les adresses stockées dans les tables de base de données afin de nettoyer et d'enrichir vos données géospatiales.

Par exemple :

  • Vous pouvez utiliser le géocodage pour convertir les adresses en coordonnées afin de normaliser et de combler les lacunes des données relatives aux adresses stockées dans une table de base de données.

  • Vous pouvez géocoder des adresses pour obtenir leur position et utiliser les coordonnées avec des fonctions spatiales de base de données, telles qu'une fonction qui affiche des lignes dans une zone spécifiée.

  • Vous pouvez utiliser des données enrichies pour générer des rapports automatisés, tels que la génération d'un rapport automatique illustrant tous les appareils d'une zone donnée, ou un rapport automatisé pour l'apprentissage automatique qui illustre les zones présentant des taux d'échec plus élevés lors de l'envoi de mises à jour de localisation.

Ce didacticiel explique comment formater et enrichir les adresses stockées dans une table de Amazon Aurora PostgreSQL base de données à l'aide d'Amazon Location Service.

  • Amazon Aurora PostgreSQL— Un moteur de base de données relationnelle entièrement géré, compatible avec MySQL et PostgreSQL, qui produit un débit jusqu'à cinq fois supérieur à celui de MySQL et jusqu'à trois fois supérieur à celui de PostgreSQL sans modifier la plupart de vos applications existantes. Pour plus d'informations, consultez Qu'est-ce qu'Amazon Aurora ? dans le guide de l'utilisateur Amazon Aurora.

Important

L'application qui en résulte dans ce didacticiel utilise un index de localisation qui stocke les résultats du géocodage. Pour plus d'informations sur les frais applicables au stockage des résultats de géocodage, consultez la tarification d'Amazon Location Service.

Un exemple de code est disponible dans le référentiel d'exemples d'Amazon Location Service sur GitHub, qui inclut un AWS CloudFormation modèle.

Présentation

AWS Cloud diagram showing Amazon Aurora, AWS Lambda, and Amazon Location Service interconnected.

L'architecture implique les intégrations suivantes :

  • Cette solution utilise une ressource d'index de localisation Amazon Location pour prendre en charge les requêtes de géocodage à l'aide de l'opérationSearchPlaceIndexForText.

  • AWS Lambdautilise un Lambda Python qui géocode les adresses lorsqu'une politique IAM autorise l'AWS Lambdaappel de l'opération de géocodage Amazon Location,. SearchPlaceIndexForText

  • Accordez l'autorisation d'Amazon Aurora PostgreSQLinvoquer la fonction Lambda de géocodage à l'aide d'une fonction SQL définie par l'utilisateur.

Prérequis

Avant de commencer, vous devez remplir les conditions préalables suivantes :

  • Un Amazon Aurora PostgreSQL cluster. Pour plus d'informations sur la création d'un cluster de base de données Amazon Aurora, consultez le guide de l'utilisateur Amazon Aurora.

    Note

    Si votre cluster Amazon Aurora n'est pas accessible au public, vous devez également configurer Amazon Aurora pour qu'il se connecte AWS Lambda à un cloud privé virtuel (VPC) sur votre AWS compte. Pour plus d’informations, consultez Accorder Amazon Aurora PostgreSQL l'accès à AWS Lambda.

  • Un outil de développement SQL pour se connecter au Amazon Aurora PostgreSQL cluster.

Démarrage rapide

Au lieu de suivre les étapes décrites dans ce didacticiel, vous pouvez lancer une pile rapide pour déployer une AWS Lambda fonction prenant en charge le fonctionnement d'Amazon LocationSearchPlaceIndexForText. Cela configure automatiquement votre AWS compte pour autoriser Amazon Aurora à appelerAWS Lambda.

Une fois que vous aurez configuré votre AWS compte, vous devrez :

Blue button labeled "Launch Stack" with an arrow icon indicating an action to start.

Création d'une ressource d'index des lieux

Commencez par créer une ressource d'index de lieux pour prendre en charge les requêtes de géocodage.

  1. Ouvrez la console Amazon Location Service à l'adresse https://console.aws.amazon.com/location/.

  2. Dans le volet de navigation de gauche, choisissez Placer les index.

  3. Remplissez les cases suivantes :

    • Nom — Entrez le nom de la ressource d'index des lieux. Par exemple, AuroraPlaceIndex. 100 caractères maximum. Les entrées valides incluent les caractères alphanumériques, les traits d'union, les points et les traits de soulignement.

    • Description — Entrez une description facultative. Par exemple, index Place pour Amazon Aurora.

  4. Sous Fournisseurs de données, choisissez un fournisseur de données disponible à utiliser avec votre ressource d'index des lieux. Si vous n'avez aucune préférence, nous vous recommandons de commencer par Esri.

  5. Sous Options de stockage des données, spécifiez Oui, les résultats seront stockés. Cela indique que vous avez l'intention d'enregistrer les résultats du géocodage dans une base de données.

  6. (Facultatif) Sous Tags (Balises), entrez des paramètres Key (Clé) et Value (Valeur) de balise. Cela ajoute une balise à votre nouvelle ressource d'index des lieux. Pour plus d'informations, veuillez consulter la rubrique Balisage de vos ressources.

  7. Choisissez Créer un index des lieux.

Création d'une AWS Lambda fonction pour le géocodage

Pour créer une connexion entre Amazon Location Service Amazon Aurora PostgreSQL et Amazon, vous avez besoin d'une AWS Lambda fonction permettant de gérer les demandes provenant du moteur de base de données. Cette fonction traduit l'événement de fonction Lambda défini par l'utilisateur et appelle l'opération Amazon Location. SearchPlaceIndexForText

Vous pouvez créer la fonction à l'aide de la AWS Lambda consoleAWS Command Line Interface, des API ou des AWS Lambda API.

Pour créer une fonction Lambda définie par l'utilisateur à l'aide de la console

  1. Ouvrez la console AWS Lambda à l’adresse https://console.aws.amazon.com/lambda/.

  2. Dans le menu de navigation de gauche, sélectionnez Fonctions.

  3. Choisissez Créer une fonction et assurez-vous que l'option Auteur à partir de zéro est sélectionnée.

  4. Remplissez les cases suivantes :

    • Nom de la fonction — Entrez un nom unique pour votre fonction. Les entrées valides incluent les caractères alphanumériques, les traits d'union et les traits de soulignement sans espaces. Par exemple, AuroraGeocoder.

    • Runtime — Choisissez Python 3.8.

  5. Choisissez Créer une fonction.

  6. Cliquez sur l'onglet Code pour ouvrir l'éditeur.

  7. Remplacez le code de l'espace réservé lambda_function.py par le code suivant :

    from os import environ import boto3 from botocore.config import Config # load the place index name from the environment, falling back to a default PLACE_INDEX_NAME = environ.get("PLACE_INDEX_NAME", "AuroraPlaceIndex") location = boto3.client("location", config=Config(user_agent="Amazon Aurora PostgreSQL")) """ This Lambda function receives a payload from Amazon Aurora and translates it to an Amazon Location `SearchPlaceIndex` call and returns the results as-is, to be post-processed by a PL/pgSQL function. """ def lambda_handler(event, context): kwargs = {} if event.get("biasPosition") is not None: kwargs["BiasPosition"] = event["biasPosition"] if event.get("filterBBox") is not None: kwargs["FilterBBox"] = event["filterBBox"] if event.get("filterCountries") is not None: kwargs["FilterCountries"] = event["filterCountries"] if event.get("maxResults") is not None: kwargs["MaxResults"] = event["maxResults"] return location.search_place_index_for_text( IndexName=PLACE_INDEX_NAME, Text=event["text"], **kwargs)["Results"]
  8. Si vous avez donné à votre index de localisation un autre nom que AuroraPlaceIndex, créez une variable d'environnement nommée PLACE_INDEX_NAME pour attribuer le nom de la ressource à :

    • Dans l'onglet Configuration, sélectionnez Variables d'environnement.

    • Choisissez Modifier, puis Ajouter une variable d'environnement.

    • Pour Key : EnterPLACE_INDEX_NAME.

    • Pour la valeur : entrez le nom de votre ressource d'index géographique.

  9. Choisissez Déployer pour enregistrer la fonction mise à jour.

  10. Dans le menu déroulant Test, choisissez Configurer l'événement de test.

  11. Choisissez Create new test event.

  12. Entrez l'événement de test suivant :

    { "text": "Baker Beach", "biasPosition": [-122.483, 37.790], "filterCountries": ["USA"] }
  13. Choisissez Test pour tester la fonction Lambda.

  14. Cliquez sur l'onglet Configuration.

  15. Sous Configuration générale : Choisissez Autorisations.

  16. Sous Rôle d'exécution : choisissez le nom du rôle hyperlié pour accorder à Amazon Location Service des autorisations pour votre fonction Lambda.

  17. Sous l'onglet Autorisations : sélectionnez le menu déroulant Ajouter des autorisations, puis choisissez Créer une politique intégrée.

  18. Sélectionnez l’onglet JSON.

  19. Ajoutez la politique IAM suivante :

    • La politique suivante autorise l'envoi SearchPlaceIndexForText à la ressource d'index de lieux AuroraPlaceIndex.

      { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "geo:SearchPlaceIndexForText", "Resource": "arn:aws:geo:<Region>:<AccountId>:place-index/AuroraPlaceIndex" } ] }
  20. Choisissez Examiner une politique.

  21. Entrez un nom de stratégie. Par exemple, AuroraPlaceIndexReadOnly.

  22. Choisissez Créer une politique.

Accorder Amazon Aurora PostgreSQL l'accès à AWS Lambda

Avant de Amazon Aurora PostgreSQL pouvoir invoquer une AWS Lambda fonction, vous devez accorder une autorisation d'accès.

Si votre Amazon Aurora PostgreSQL cluster n'est pas accessible au public, vous devez d'abord créer un point de terminaison VPC pour AWS Lambda qu'Amazon Aurora puisse appeler votre fonction Lambda.

Créez un point de terminaison VPC pour AWS Lambda

Note

Cette étape n'est requise que si votre Amazon Aurora PostgreSQL cluster n'est pas accessible au public.

  1. Ouvrez la Amazon Virtual Private Cloud Console.

  2. Dans le volet de navigation de gauche, sélectionnez Endpoints.

  3. Choisissez Créer un point de terminaison.

  4. Dans le filtre Nom du service, entrez « lambda », puis choisissezcom.amazonaws.<region>.lambda.

  5. Choisissez le VPC contenant votre cluster Aurora.

  6. Choisissez un sous-réseau pour chaque zone de disponibilité.

  7. Dans le filtre Groupe de sécurité, entrez « par défaut » ou le nom du groupe de sécurité dont votre cluster Aurora est membre, puis choisissez le groupe de sécurité.

  8. Choisissez Créer un point de terminaison.

Créez une politique IAM pour autoriser l'appel de votre fonction AWS Lambda

  1. Ouvrez la console IAM.

  2. Dans le volet de navigation de gauche, développez la gestion des accès pour sélectionner Politiques.

  3. Choisissez Créer une politique.

  4. Dans l'onglet JSON, saisissez la politique suivante :

    • Voici un exemple de politique IAM qui Amazon Aurora PostgreSQL autorise l'appel de la AuroraGeocoder AWS Lambda fonction.

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "lambda:InvokeFunction", "Resource": [ "arn:aws:lambda:<Region>:<AccountId>:function:AuroraGeocoder" ] } ] }
  5. Choisissez Next : Tags pour ajouter des tags facultatifs.

  6. Choisissez Suivant : vérification.

  7. Passez en revue votre politique et entrez les informations suivantes pour celle-ci :

    • Nom — Utilisez des caractères alphanumériques et des caractères « +=, .@-_ ». 128 caractères maximum. Par exemple, AuroraGeocoderInvoke.

    • Description — Entrez une description facultative. Utilisez des caractères alphanumériques et des caractères « +=, .@-_ ». 1 000 caractères maximum.

  8. Choisissez Créer une politique. Notez l'ARN de cette stratégie, que vous utilisez pour associer la stratégie à un rôle IAM.

Créez un rôle IAM pour autoriser Amazon Relational Database Service (Amazon RDS)

En créant un rôle IAM, Amazon Aurora PostgreSQL vous pouvez assumer le rôle en votre nom pour accéder à votre fonction Lambda. Pour plus d'informations, veuillez consulter Création d'un rôle pour déléguer des autorisations à un utilisateur IAM dans le Guide de l'utilisateur IAM.

L'exemple suivant est une AWS CLI commande qui crée un rôle nommé AuroraGeocoderInvokeRole:

aws iam create-role --role-name rds-lambda-role --assume-role-policy-document '{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "rds.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }'

Associez votre politique IAM au rôle IAM

Lorsque vous avez un rôle IAM, attachez la politique IAM que vous avez créée.

L'exemple suivant est une AWS CLI commande qui associe la politique AuroraGeocoderInvokeau rôle AuroraGeocoderInvokeRole.

aws iam attach-role-policy --policy-arn AuroraGeocoderInvoke --role-name AuroraGeocoderInvokeRole

Ajouter le rôle IAM à un cluster de base de données Amazon Aurora

L'exemple suivant est une AWS CLI commande permettant d'ajouter un rôle IAM à un Amazon Aurora PostgreSQL cluster de base de données nommé MyAuroraCluster.

aws rds add-role-to-db-cluster \ --db-cluster-identifier MyAuroraCluster \ --feature-name Lambda \ --role-arn AuroraGeocoderInvokeRole \ --region your-region

Appeler la fonction AWS Lambda

Après avoir autorisé l'appel de Amazon Aurora PostgreSQL votre fonction Lambda de géocodage, vous pouvez créer Amazon Aurora PostgreSQL une fonction définie par l'utilisateur pour appeler la fonction de géocodage. AWS Lambda Pour plus d'informations, consultez la section Invocation d'une AWS Lambda fonction depuis un Amazon Aurora PostgreSQL cluster de bases de données dans le guide de l'utilisateur Amazon Aurora.

Installez les extensions PostgreSQL requises

Pour installer les aws_lambda extensions aws _commons et extensions PostgreSQL requises, consultez la section Présentation de l'utilisation d'une fonction Lambda dans le guide de l'utilisateur Amazon Aurora.

CREATE EXTENSION IF NOT EXISTS aws_lambda CASCADE;

Installez les extensions PostGIS requises

PostGIS est une extension de PostgreSQL pour le stockage et la gestion des informations spatiales. Pour plus d'informations, consultez la section Utilisation de l'extension PostGIS dans le guide de l'utilisateur d'Amazon Relational Database Service.

CREATE EXTENSION IF NOT EXISTS postgis;

Créez une fonction SQL définie par l'utilisateur qui invoque la fonction Lambda

Dans un éditeur SQL, créez une nouvelle fonction définie par l'utilisateur f_SearchPlaceIndexForText pour appeler la fonction AuroraGeocoder:

CREATE OR REPLACE FUNCTION f_SearchPlaceIndexForText( text text, bias_position geometry(Point, 4326) DEFAULT NULL, filter_bbox box2d DEFAULT NULL, filter_countries text[] DEFAULT NULL, max_results int DEFAULT 1 ) RETURNS TABLE ( label text, address_number text, street text, municipality text, postal_code text, sub_region text, region text, country text, geom geometry(Point, 4326) ) LANGUAGE plpgsql IMMUTABLE AS $function$ begin RETURN QUERY WITH results AS ( SELECT json_array_elements(payload) rsp FROM aws_lambda.invoke( aws_commons.create_lambda_function_arn('AuroraGeocoder'), json_build_object( 'text', text, 'biasPosition', CASE WHEN bias_position IS NOT NULL THEN array_to_json(ARRAY[ST_X(bias_position), ST_Y(bias_position)]) END, 'filterBBox', CASE WHEN filter_bbox IS NOT NULL THEN array_to_json(ARRAY[ST_XMin(filter_bbox), ST_YMin(filter_bbox), ST_XMax(filter_bbox), ST_YMax(filter_bbox)]) END, 'filterCountries', filter_countries, 'maxResults', max_results ) ) ) SELECT rsp->'Place'->>'Label' AS label, rsp->'Place'->>'AddressNumber' AS address_number, rsp->'Place'->>'Street' AS street, rsp->'Place'->>'Municipality' AS municipality, rsp->'Place'->>'PostalCode' AS postal_code, rsp->'Place'->>'SubRegion' AS sub_region, rsp->'Place'->>'Region' AS region, rsp->'Place'->>'Country' AS country, ST_GeomFromGeoJSON( json_build_object( 'type', 'Point', 'coordinates', rsp->'Place'->'Geometry'->'Point' ) ) geom FROM results; end; $function$;

Appelez la fonction SQL pour géocoder depuis Aurora

L'exécution de l'instruction SQL appelle la AuroraGeocoderfonction Lambda, qui prend les enregistrements d'adresses de la table de base de données de la base de données et les géocode à Amazon Aurora PostgreSQL l'aide d'une ressource d'index de localisation.

Note

Amazon Aurora PostgreSQLinvoque la fonction Lambda pour chaque appel à la fonction SQL définie par l'utilisateur.

Si vous géocodez 50 lignes, Amazon Aurora PostgreSQL invoque la fonction Lambda 50 fois. Une invocation pour chaque ligne.

La fonction f_SearchPlaceIndexForText SQL suivante envoie des requêtes à l'SearchPlaceIndexForTextAPI d'Amazon Location via la fonction AuroraGeocoderLambda. La fonction renvoie une geom colonne qui est une géométrie PostGIS, qui est ST_AsText(geom) convertie en texte.

SELECT *, ST_AsText(geom) FROM f_SearchPlaceIndexForText('Vancouver, BC');

Par défaut, le retour contiendra une ligne. Pour demander des lignes supplémentaires, dans la MaxResults limite autorisée, exécutez l'instruction SQL suivante tout en fournissant un BiasPosition et en limitant les résultats au Canada.

SELECT * FROM f_SearchPlaceIndexForText('Mount Pleasant', ST_MakePoint(-123.113, 49.260), null, '{"CAN"}', 5);

Pour filtrer les résultats à l'aide d'un cadre de sélection, transmettez un Box2D comme suit : filter_bbox

  • FilterBBox— Filtre les résultats en renvoyant les places à l'intérieur d'un cadre de sélection. Ce paramètre est facultatif.

SELECT * FROM f_SearchPlaceIndexForText('Mount Pleasant', null, 'BOX(-139.06 48.30, -114.03 60.00)'::box2d, '{"CAN"}', 5);

Pour plus d'informations sur les types et les fonctions de PostGIS, consultez le manuel de référence PostGIS.

Enrichir une base de données contenant des données d'adresses

Vous pouvez créer une adresse formatée, la normaliser et le géocoder simultanément à l'aide de l'opération Amazon Location à partir d'une table de base de SearchPlaceIndexForText données contenant les données suivantes réparties dans les colonnes suivantes :

  • id

  • address

  • city

  • state

  • zip

WITH source_data AS ( SELECT id, address || ', ' || city || ', ' || state || ', ' || zip AS formatted_address FROM addresses ), geocoded_data AS ( SELECT *, (f_SearchPlaceIndexForText(formatted_address)).* FROM source_data ) SELECT id, formatted_address, label normalized_address, ST_Y(geom) latitude, ST_X(geom) longitude FROM geocoded_data -- limit the number of rows that will be geocoded; remove this to geocode the entire table LIMIT 1;

L'exemple suivant illustre une ligne de table de données résultante :

id | formatted_address | normalized_address | latitude | longitude ----+--------------------------------+--------------------------------------------+------------------+------------------- 42 | 123 Anytown Ave N, Seattle, WA | 123 Anytown Ave N, Seattle, WA, 12345, USA | 47.6223000127926 | -122.336745971039 (1 row)

Mettre à jour la table de base de données et remplir les colonnes

L'exemple suivant met à jour le tableau et remplit les colonnes avec les résultats des SearchPlaceIndexForText requêtes :

WITH source_data AS ( -- select rows that have not been geocoded and created a formatted address for each SELECT id, address || ', ' || city || ', ' || state || ', ' || zip AS formatted_address FROM addresses WHERE label IS NULL -- limit the number of rows that will be geocoded; remove this to geocode the entire table LIMIT 1 ), geocoded_data AS ( -- geocode each row and keep it linked to the source's ID SELECT id, (f_SearchPlaceIndexForText(formatted_address)).* FROM source_data ) UPDATE addresses -- populate columns SET normalized_address = geocoded_data.label, latitude = ST_Y(geocoded_data.geom), longitude = ST_X(geocoded_data.geom) FROM geocoded_data -- ensure that rows match WHERE addresses.id = geocoded_data.id;

Étapes suivantes

Un exemple de code est disponible dans le référentiel d'exemples d'Amazon Location Service sur GitHub, qui inclut un AWS CloudFormation modèle.