Amazon Aurora PostgreSQLfunzioni definite dall'utente per Amazon Location Service - Servizio di posizione Amazon

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

Amazon Aurora PostgreSQLfunzioni definite dall'utente per Amazon Location Service

Puoi utilizzare Amazon Location Service per lavorare con coordinate e indirizzi memorizzati nelle tabelle del database per pulire e arricchire i tuoi dati geospaziali.

Per esempio:

  • Puoi utilizzare la geocodifica per convertire gli indirizzi in coordinate per normalizzare e colmare le lacune nei dati degli indirizzi memorizzati in una tabella di database.

  • È possibile geocodificare gli indirizzi per ottenerne la posizione e utilizzare le coordinate con funzioni spaziali del database, ad esempio una funzione che mostra le righe in un'area specificata.

  • È possibile utilizzare dati arricchiti per generare report automatici, ad esempio generare un rapporto automatico che illustra tutti i dispositivi in una determinata area o un rapporto automatizzato per l'apprendimento automatico che illustra le aree con tassi di errore più elevati durante l'invio di aggiornamenti sulla posizione.

Questo tutorial mostra come formattare e arricchire gli indirizzi memorizzati in una tabella di Amazon Aurora PostgreSQL database utilizzando Amazon Location Service.

  • Amazon Aurora PostgreSQL— Un motore di database relazionale completamente gestito, compatibile con MySQL e PostgreSQL, che produce fino a cinque volte il throughput di MySQL e fino a tre volte il throughput di PostgreSQL senza modificare la maggior parte dell'applicazione esistente. Per ulteriori informazioni, consulta Cos'è Amazon Aurora? nella Guida per l'utente di Amazon Aurora.

Importante

L'applicazione risultante in questo tutorial utilizza un indice dei luoghi che memorizza i risultati della geocodifica. Per informazioni sui costi applicabili per l'archiviazione dei risultati di geocodifica, consulta i prezzi di Amazon Location Service.

Il codice di esempio è disponibile nell'archivio di esempi di Amazon Location Service su GitHub, che include un AWS CloudFormation modello.

Panoramica

Cloud AWS diagram showing Amazon Aurora, AWS Lambda, and Servizio di posizione Amazon interconnected.

L'architettura prevede le seguenti integrazioni:

  • Questa soluzione utilizza una risorsa Amazon Location Place Index per supportare le query di geocodifica utilizzando l'operazione. SearchPlaceIndexForText

  • AWS Lambdautilizza un Python Lambda che geocodifica gli indirizzi quando una policy IAM dà il permesso di consentire di AWS Lambda chiamare l'operazione di geocodifica di Amazon Location,. SearchPlaceIndexForText

  • Concedi l'autorizzazione Amazon Aurora PostgreSQL a richiamare la funzione Lambda di geocodifica utilizzando una funzione SQL definita dall'utente.

Prerequisiti

Prima di iniziare, sono necessari i seguenti prerequisiti:

  • Un Amazon Aurora PostgreSQL cluster. Per ulteriori informazioni sulla creazione di un cluster Amazon Aurora DB, consulta la Amazon Aurora User Guide.

    Nota

    Se il tuo cluster Amazon Aurora non è disponibile pubblicamente, devi anche configurare Amazon Aurora per la connessione in un cloud AWS Lambda privato virtuale (VPC) nel tuo account. AWS Per ulteriori informazioni, consulta Concedi Amazon Aurora PostgreSQL l'accesso a AWS Lambda.

  • Uno strumento di sviluppo SQL per connettersi al cluster. Amazon Aurora PostgreSQL

Avvio rapido

In alternativa ai passaggi descritti in questo tutorial, puoi avviare uno stack rapido per implementare una AWS Lambda funzione che supporti il funzionamento di Amazon Location. SearchPlaceIndexForText Questo configura automaticamente il tuo AWS account per consentire ad Amazon Aurora di effettuare chiamate. AWS Lambda

Una volta configurato il tuo AWS account, dovrai:

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

Crea una risorsa per l'indice dei luoghi

Inizia creando una risorsa per l'indice dei luoghi per supportare le query di geocodifica.

  1. Apri la console Amazon Location Service all'indirizzo https://console.aws.amazon.com/location/.

  2. Nel riquadro di navigazione a sinistra, scegli Posiziona indici.

  3. Compila le seguenti caselle:

    • Nome: inserisci un nome per la risorsa dell'indice dei luoghi. Ad esempio, AuroraPlaceIndex. Massimo 100 caratteri. Le voci valide includono caratteri alfanumerici, trattini, punti e caratteri di sottolineatura.

    • Descrizione: immettere una descrizione facoltativa. Ad esempio, Place index per Amazon Aurora.

  4. In Fornitori di dati, scegli un fornitore di dati disponibile da utilizzare con la tua risorsa place index. Se non hai preferenze, ti consigliamo di iniziare con Esri.

  5. In Opzioni di archiviazione dei dati, specificare Sì, i risultati verranno archiviati. Ciò indica che intendi salvare i risultati della geocodifica in un database.

  6. (Facoltativo) In Tag, immettere Key (Chiave) e Value (Valore) di un tag. Questo aggiunge un tag alla nuova risorsa dell'indice dei luoghi. Per ulteriori informazioni, consulta Tagging delle risorse.

  7. Scegli Crea indice dei luoghi.

Crea una AWS Lambda funzione per la geocodifica

Per creare una connessione tra Amazon Location Service Amazon Aurora PostgreSQL e Amazon, è necessaria una AWS Lambda funzione per gestire le richieste dal motore di database. Questa funzione traduce l'evento della funzione Lambda definita dall'utente e chiama l'operazione Amazon Location. SearchPlaceIndexForText

Puoi creare la funzione utilizzando la AWS Lambda console, le o le AWS Command Line Interface API. AWS Lambda

Per creare una funzione Lambda definita dall'utente utilizzando la console

  1. Apri la console AWS Lambda all'indirizzo https://console.aws.amazon.com/lambda/.

  2. Dalla barra di navigazione a sinistra, scegli Funzioni.

  3. Scegli Crea funzione e assicurati che sia selezionato Author from zero.

  4. Compila le seguenti caselle:

    • Nome della funzione: immettere un nome univoco per la funzione. Le voci valide includono caratteri alfanumerici, trattini e caratteri di sottolineatura senza spazi. AuroraGeocoderAd esempio,.

    • Runtime — Scegliete Python 3.8.

  5. Scegli Crea funzione.

  6. Scegli la scheda Codice per aprire l'editor.

  7. Sovrascrivi il codice segnaposto lambda_function.py con quanto segue:

    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. Se hai assegnato al tuo indice dei luoghi un nome diverso da quello AuroraPlaceIndex, crea una variabile di ambiente denominata PLACE_INDEX_NAME per assegnare il nome della risorsa a:

    • Dalla scheda Configurazione, scegli Variabili d'ambiente.

    • Scegli Modifica, quindi scegli Aggiungi variabile di ambiente.

    • Per chiave: InvioPLACE_INDEX_NAME.

    • Per Valore: inserisci il nome della risorsa dell'indice dei luoghi.

  9. Scegli Deploy per salvare la funzione aggiornata.

  10. Dal menu a discesa Test, scegli Configura evento di test.

  11. Scegliere Create new test event (Creare nuovo evento di test).

  12. Inserisci il seguente evento di test:

    { "text": "Baker Beach", "biasPosition": [-122.483, 37.790], "filterCountries": ["USA"] }
  13. Scegli Test per testare la funzione Lambda.

  14. Scegli la scheda Configurazione.

  15. In Configurazione generale: scegli Autorizzazioni.

  16. In Ruolo di esecuzione: scegli il nome del ruolo con collegamento ipertestuale per concedere ad Amazon Location Service le autorizzazioni per la tua funzione Lambda.

  17. Nella scheda Autorizzazioni: seleziona il menu a discesa Aggiungi autorizzazioni, quindi scegli Crea policy in linea.

  18. Seleziona la scheda JSON.

  19. Aggiungi la seguente politica IAM:

    • La seguente politica autorizza l'invio della risorsa SearchPlaceIndexForText all'indice dei luoghi AuroraPlaceIndex.

      { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "geo:SearchPlaceIndexForText", "Resource": "arn:aws:geo:<Region>:<AccountId>:place-index/AuroraPlaceIndex" } ] }
  20. Scegli Esamina la policy.

  21. Inserire un nome per la policy. Ad esempio, AuroraPlaceIndexReadOnly.

  22. Scegli Crea policy.

Concedi Amazon Aurora PostgreSQL l'accesso a AWS Lambda

Prima di Amazon Aurora PostgreSQL poter richiamare una AWS Lambda funzione, è necessario concedere l'autorizzazione di accesso.

Se il tuo Amazon Aurora PostgreSQL cluster non è accessibile pubblicamente, dovrai prima creare un endpoint VPC per Amazon Aurora per AWS Lambda chiamare la tua funzione Lambda.

Crea un endpoint VPC per AWS Lambda

Nota

Questo passaggio è necessario solo se il Amazon Aurora PostgreSQL cluster non è accessibile pubblicamente.

  1. Apri la Amazon Virtual Private Cloud Console.

  2. Nella barra di navigazione a sinistra, scegli Endpoints.

  3. Seleziona Crea endpoint.

  4. Nel filtro Service Name, inserisci «lambda», quindi scegli. com.amazonaws.<region>.lambda

  5. Scegli il VPC contenente il tuo cluster Aurora.

  6. Scegli una sottorete per ogni zona di disponibilità.

  7. Nel filtro del gruppo di sicurezza, inserisci «default» o il nome del gruppo di sicurezza di cui fa parte il cluster Aurora, quindi scegli il gruppo di sicurezza.

  8. Seleziona Crea endpoint.

Crea una policy IAM per concedere l'autorizzazione a richiamare la tua funzione AWS Lambda

  1. Apri la console IAM.

  2. Nella barra di navigazione a sinistra, espandi Gestione degli accessi per scegliere Policies.

  3. Scegli Crea policy.

  4. Nella scheda JSON, inserisci la seguente politica:

    • Di seguito è riportato un esempio di policy IAM che concede Amazon Aurora PostgreSQL il permesso di richiamare la funzione. AuroraGeocoder AWS Lambda

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "lambda:InvokeFunction", "Resource": [ "arn:aws:lambda:<Region>:<AccountId>:function:AuroraGeocoder" ] } ] }
  5. Scegli Avanti: Tag per aggiungere tag opzionali.

  6. Seleziona Successivo: Revisione.

  7. Rivedi la tua politica e inserisci i seguenti dettagli per la politica:

    • Nome: utilizza caratteri alfanumerici e '+=, .@-_'. Massimo 128 caratteri. AuroraGeocoderInvokeAd esempio,.

    • Descrizione: immettere una descrizione facoltativa. Utilizza caratteri alfanumerici e '+=, .@-_'. Massimo 1000 caratteri.

  8. Scegli Crea policy. Nota l'ARN per questa policy, che usi per associare la policy a un ruolo IAM.

Crea un ruolo IAM per concedere l'autorizzazione ad Amazon Relational Database Service (Amazon RDS)

Creando un ruolo IAM, Amazon Aurora PostgreSQL puoi assumere il ruolo per tuo conto per accedere alla tua funzione Lambda. Per ulteriori informazioni, consulta la pagina relativa alla creazione di un ruolo per delegare le autorizzazioni a un utente IAM nella Guida per l'utente IAM.

L'esempio seguente è un AWS CLI comando che crea un ruolo denominato 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" } ] }'

Collega la tua policy IAM al ruolo IAM

Se hai un ruolo IAM, collega la policy IAM che hai creato.

L'esempio seguente è un AWS CLI comando che collega la policy AuroraGeocoderInvokeal ruolo AuroraGeocoderInvokeRole.

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

Aggiungi il ruolo IAM a un cluster Amazon Aurora DB

L'esempio seguente è un AWS CLI comando per aggiungere un ruolo IAM a un cluster Amazon Aurora PostgreSQL DB denominato MyAuroraCluster.

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

Richiama la funzione AWS Lambda

Dopo aver concesso l'autorizzazione Amazon Aurora PostgreSQL a richiamare la funzione Lambda di geocodifica, puoi creare Amazon Aurora PostgreSQL una funzione definita dall'utente per richiamare la funzione di geocodifica. AWS Lambda Per ulteriori informazioni, consulta Invocare una AWS Lambda funzione da un cluster Amazon Aurora PostgreSQL DB nella Guida per l'utente di Amazon Aurora.

Installa le estensioni PostgreSQL richieste

Per installare le estensioni aws _commons e le aws_lambda estensioni PostgreSQL richieste, consulta Panoramica sull'uso di una funzione Lambda nella Guida per l'utente di Amazon Aurora.

CREATE EXTENSION IF NOT EXISTS aws_lambda CASCADE;

Installa le estensioni PostGIS richieste

PostGIS è un'estensione di PostgreSQL per l'archiviazione e la gestione delle informazioni spaziali. Per ulteriori informazioni, consulta Working with the PostGIS nella Amazon Relational Database Service User Guide.

CREATE EXTENSION IF NOT EXISTS postgis;

Creare una funzione SQL definita dall'utente che richiami la funzione Lambda

In un editor SQL, crea una nuova funzione definita dall'utente per richiamare la funzionef_SearchPlaceIndexForText: 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$;

Chiama la funzione SQL per la geocodifica da Aurora

L'esecuzione dell'istruzione SQL richiama la funzione Lambda AuroraGeocoder, che prende i record di indirizzi dalla tabella del database nel Amazon Aurora PostgreSQL database e li geocodifica utilizzando una risorsa di indice dei luoghi.

Nota

Amazon Aurora PostgreSQLrichiama la funzione Lambda per ogni chiamata alla funzione SQL definita dall'utente.

Se si esegue la geocodifica di 50 righe, Amazon Aurora PostgreSQL richiama la funzione Lambda 50 volte. Una chiamata per ogni riga.

La seguente funzione f_SearchPlaceIndexForText SQL effettua richieste all'SearchPlaceIndexForTextAPI di Amazon Location tramite la funzione AuroraGeocoderLambda. La funzione restituisce una geom colonna che è una geometria PostGIS, ST_AsText(geom) che viene convertita in testo.

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

Per impostazione predefinita, il valore restituito conterrà una riga. Per richiedere righe aggiuntive, fino al MaxResults limite, esegui la seguente istruzione SQL fornendo un elenco dei risultati (BiasPositione limitandolo ai risultati) in Canada.

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

Per filtrare i risultati utilizzando un riquadro di selezione, passa a comeBox2D: filter_bbox

  • FilterBBox— Filtra i risultati restituendo le posizioni all'interno di un riquadro di selezione. Si tratta di un parametro facoltativo.

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

Per ulteriori informazioni sui tipi e le funzioni di PostGIS, consultate PostGIS Reference.

Arricchimento di un database contenente dati di indirizzo

Puoi creare un indirizzo formattato e contemporaneamente normalizzarlo e geocodificarlo utilizzando l'operazione Amazon Location, SearchPlaceIndexForText fornita da una tabella di database con i seguenti dati suddivisi nelle seguenti colonne:

  • 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'esempio seguente illustra una riga della tabella databile risultante:

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)

Aggiorna la tabella del database e compila le colonne

L'esempio seguente aggiorna la tabella e popola le colonne con i risultati delle SearchPlaceIndexForText query:

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;

Passaggi successivi

Il codice di esempio è disponibile nell'archivio di esempi di Amazon Location Service su GitHub, che include un AWS CloudFormation modello.