Amazon Aurora PostgreSQLfungsi yang ditentukan pengguna untuk Amazon Location Service - Amazon Location Service

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

Amazon Aurora PostgreSQLfungsi yang ditentukan pengguna untuk Amazon Location Service

Anda dapat menggunakan Amazon Location Service untuk bekerja dengan koordinat dan alamat yang disimpan dalam tabel database untuk membersihkan dan memperkaya data geospasial Anda.

Sebagai contoh:

  • Anda dapat menggunakan geocoding untuk mengonversi alamat menjadi koordinat untuk menormalkan dan mengisi celah dalam data untuk alamat yang disimpan dalam tabel database.

  • Anda dapat geocode alamat untuk mendapatkan posisi mereka dan menggunakan koordinat dengan fungsi spasial database, seperti fungsi yang menunjukkan baris di area tertentu.

  • Anda dapat menggunakan data yang diperkaya untuk menghasilkan pelaporan otomatis, seperti membuat laporan otomatis yang menggambarkan semua perangkat di area tertentu, atau laporan otomatis untuk pembelajaran mesin yang menggambarkan area dengan tingkat kegagalan yang lebih tinggi saat mengirim pembaruan lokasi.

Tutorial ini menunjukkan cara memformat dan memperkaya alamat yang disimpan dalam tabel Amazon Aurora PostgreSQL database menggunakan Amazon Location Service.

  • Amazon Aurora PostgreSQL— Mesin database relasional yang dikelola sepenuhnya, kompatibel dengan MySQL dan PostgreSQL, yang menghasilkan hingga lima kali throughput MySQL dan hingga tiga kali throughput PostgreSQL tanpa mengubah sebagian besar aplikasi Anda yang ada. Untuk informasi lebih lanjut, lihat Apa itu Amazon Aurora? di Panduan Pengguna Amazon Aurora.

penting

Aplikasi yang dihasilkan dalam tutorial ini menggunakan indeks tempat yang menyimpan hasil geocoding. Untuk informasi tentang biaya yang berlaku untuk menyimpan hasil geocoding, lihat harga Amazon Location Service.

Kode sampel tersedia di repositori sampel Amazon Location Service GitHub, yang AWS CloudFormation menyertakan templat.

Ikhtisar

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

Arsitektur melibatkan integrasi berikut:

  • Solusi ini menggunakan sumber daya indeks tempat Lokasi Amazon untuk mendukung kueri geocoding menggunakan operasi. SearchPlaceIndexForText

  • AWS Lambdamenggunakan Lambda Python yang ditangani geocode saat kebijakan IAM memberikan izin untuk mengizinkan AWS Lambda memanggil operasi geocoding Lokasi Amazon,. SearchPlaceIndexForText

  • Berikan izin Amazon Aurora PostgreSQL untuk menjalankan fungsi Lambda geocoding menggunakan fungsi yang ditentukan pengguna SQL.

Prasyarat

Sebelum Anda mulai, Anda memerlukan prasyarat berikut:

  • Sebuah Amazon Aurora PostgreSQL cluster. Untuk informasi selengkapnya tentang Membuat klaster DB Amazon Aurora, lihat Panduan Pengguna Amazon Aurora.

    catatan

    Jika klaster Amazon Aurora Anda tidak tersedia untuk umum, Anda juga harus mengonfigurasi Amazon Aurora untuk terhubung di cloud pribadi virtual (VPC) AWS Lambda di akun Anda. AWS Untuk informasi selengkapnya, lihat Berikan Amazon Aurora PostgreSQL akses ke AWS Lambda.

  • Alat pengembang SQL untuk terhubung ke Amazon Aurora PostgreSQL cluster.

Quick start

Sebagai alternatif untuk melalui langkah-langkah dalam tutorial ini, Anda dapat meluncurkan tumpukan cepat untuk menyebarkan AWS Lambda fungsi yang mendukung operasi SearchPlaceIndexForText Lokasi Amazon. Ini secara otomatis mengonfigurasi AWS akun Anda untuk memungkinkan Amazon Aurora menelepon. AWS Lambda

Setelah Anda mengkonfigurasi AWS akun Anda, Anda perlu:

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

Buat sumber daya indeks tempat

Mulailah dengan membuat sumber daya indeks tempat untuk mendukung kueri geocoding.

  1. Buka konsol Amazon Location Service di https://console.aws.amazon.com/location/.

  2. Di panel navigasi kiri, pilih Tempatkan indeks.

  3. Isi kotak-kotak berikut:

    • Nama — Masukkan nama untuk sumber daya indeks tempat. Misalnya, AuroraPlaceIndex. Maksimal 100 karakter. Entri yang valid termasuk karakter alfanumerik, tanda hubung, titik, dan garis bawah.

    • Deskripsi - Masukkan deskripsi opsional. Misalnya, Tempatkan indeks untuk Amazon Aurora.

  4. Di bawah Penyedia data, pilih penyedia data yang tersedia untuk digunakan dengan sumber daya indeks tempat Anda. Jika Anda tidak memiliki preferensi, kami sarankan memulai dengan Esri.

  5. Di bawah Opsi penyimpanan data, tentukan Ya, hasil akan disimpan. Ini menunjukkan bahwa Anda berniat untuk menyimpan hasil geocoding dalam database.

  6. (Opsional) Di bawah Tag, masukkan tag Kunci dan Nilai. Ini menambahkan tag sumber daya indeks tempat baru Anda. Untuk informasi selengkapnya, lihat Menandai sumber daya Anda.

  7. Pilih Buat indeks tempat.

Buat AWS Lambda fungsi untuk geocoding

Untuk membuat koneksi antara Amazon Aurora PostgreSQL dan Amazon Location Service, Anda memerlukan AWS Lambda fungsi untuk menangani permintaan dari mesin database. Fungsi ini menerjemahkan peristiwa fungsi yang ditentukan pengguna Lambda dan memanggil operasi Lokasi Amazon. SearchPlaceIndexForText

Anda dapat membuat fungsi menggunakan AWS Lambda konsol, theAWS Command Line Interface, atau AWS Lambda API.

Untuk membuat fungsi yang ditentukan pengguna Lambda menggunakan konsol

  1. Buka konsol AWS Lambda di https://console.aws.amazon.com/lambda/.

  2. Dari navigasi kiri, pilih Fungsi.

  3. Pilih Create Function, dan pastikan bahwa Author dari awal dipilih.

  4. Isi kotak-kotak berikut:

    • Nama fungsi - Masukkan nama unik untuk fungsi Anda. Entri yang valid termasuk karakter alfanumerik, tanda hubung, dan garis bawah tanpa spasi. Misalnya, AuroraGeocoder.

    • Runtime - Pilih Python 3.8.

  5. Pilih Buat fungsi.

  6. Pilih tab Kode untuk membuka editor.

  7. Timpa kode placeholder lambda_function.py dengan yang berikut ini:

    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. Jika Anda telah menamai indeks tempat Anda selain AuroraPlaceIndex, buat variabel lingkungan bernama PLACE_INDEX_NAME untuk menetapkan nama sumber daya ke:

    • Dari tab Konfigurasi, pilih Variabel Lingkungan.

    • Pilih Edit, lalu pilih Tambahkan variabel lingkungan.

    • Untuk Kunci: EnterPLACE_INDEX_NAME.

    • Untuk Nilai: Masukkan nama sumber daya indeks tempat Anda.

  9. Pilih Deploy untuk menyimpan fungsi yang diperbarui.

  10. Dari menu drop-down Test, pilih Configure test Event.

  11. Pilih Buat peristiwa pengujian baru.

  12. Masukkan acara pengujian berikut:

    { "text": "Baker Beach", "biasPosition": [-122.483, 37.790], "filterCountries": ["USA"] }
  13. Pilih Uji untuk menguji fungsi Lambda.

  14. Pilih tab Konfigurasi.

  15. Di bawah Konfigurasi umum: Pilih Izin.

  16. Di bawah Peran eksekusi: Pilih nama Peran yang ditautkan hiper untuk memberikan izin Amazon Location Service ke fungsi Lambda Anda.

  17. Di bawah tab Izin: Pilih drop-down Tambahkan izin, lalu pilih Buat kebijakan sebaris.

  18. Pilih tab JSON.

  19. Tambahkan kebijakan IAM berikut:

    • Kebijakan berikut memberikan izin untuk mengirim SearchPlaceIndexForText ke sumber daya indeks tempat AuroraPlaceIndex.

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

  21. Masukkan nama kebijakan. Misalnya, AuroraPlaceIndexReadOnly.

  22. Pilih Buat kebijakan.

Berikan Amazon Aurora PostgreSQL akses ke AWS Lambda

Sebelum Amazon Aurora PostgreSQL dapat menjalankan AWS Lambda fungsi, Anda harus memberikan izin akses.

Jika Amazon Aurora PostgreSQL klaster Anda tidak dapat diakses publik, Anda harus terlebih dahulu membuat titik akhir VPC AWS Lambda agar Amazon Aurora memanggil fungsi Lambda Anda.

Buat Endpoint VPC untuk AWS Lambda

catatan

Langkah ini hanya diperlukan jika Amazon Aurora PostgreSQL klaster Anda tidak dapat diakses publik.

  1. Buka Amazon Virtual Private Cloud Console.

  2. Di navigasi kiri, pilih Endpoints.

  3. Pilih Buat titik akhir.

  4. Di filter Nama Layanan, masukkan “lambda”, lalu pilihcom.amazonaws.<region>.lambda.

  5. Pilih VPC yang berisi cluster Aurora Anda.

  6. Pilih subnet untuk setiap zona ketersediaan.

  7. Di filter grup Keamanan, masukkan “default” atau nama grup keamanan cluster Aurora Anda adalah anggota, lalu pilih grup keamanan.

  8. Pilih Buat titik akhir.

Buat kebijakan IAM untuk memberikan izin untuk menjalankan fungsi Anda AWS Lambda

  1. Buka konsol IAM.

  2. Di navigasi kiri, perluas Manajemen Akses untuk memilih Kebijakan.

  3. Pilih Buat kebijakan.

  4. Pada tab JSON, masukkan kebijakan berikut:

    • Berikut ini adalah contoh kebijakan IAM yang memberikan Amazon Aurora PostgreSQL izin untuk menjalankan fungsi. AuroraGeocoder AWS Lambda

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "lambda:InvokeFunction", "Resource": [ "arn:aws:lambda:<Region>:<AccountId>:function:AuroraGeocoder" ] } ] }
  5. Pilih Berikutnya: Tag untuk menambahkan tag opsional.

  6. Pilih Berikutnya: Peninjauan.

  7. Tinjau kebijakan Anda dan masukkan detail berikut untuk kebijakan ini:

    • Nama - Gunakan karakter alfanumerik dan '+=, .@-_'. Maksimal 128 karakter. Misalnya, AuroraGeocoderInvoke.

    • Deskripsi - Masukkan deskripsi opsional. Gunakan karakter alfanumerik dan '+=, .@-_'. Maksimal 1000 karakter.

  8. Pilih Buat kebijakan. Perhatikan ARN untuk kebijakan ini, yang Anda gunakan untuk melampirkan kebijakan ke peran IAM.

Buat peran IAM untuk memberikan izin ke Amazon Relational Database Service (Amazon RDS)

Dengan membuat peran IAM, Amazon Aurora PostgreSQL dapat mengambil peran atas nama Anda untuk mengakses fungsi Lambda Anda. Untuk informasi selengkapnya, lihat Membuat peran untuk mendelegasikan izin ke pengguna IAM dalam Panduan Pengguna IAM.

Contoh berikut adalah AWS CLI perintah yang menciptakan peran bernama 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" } ] }'

Lampirkan kebijakan IAM Anda ke peran IAM

Bila Anda memiliki peran IAM, lampirkan kebijakan IAM yang telah Anda buat.

Contoh berikut adalah AWS CLI perintah yang melampirkan kebijakan AuroraGeocoderInvokeke peran AuroraGeocoderInvokeRole.

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

Tambahkan peran IAM ke cluster Amazon Aurora DB

Contoh berikut adalah AWS CLI perintah untuk menambahkan peran IAM ke cluster Amazon Aurora PostgreSQL DB bernama MyAuroraCluster.

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

Memanggil fungsi AWS Lambda

Setelah Anda memberikan izin Amazon Aurora PostgreSQL untuk menjalankan fungsi Lambda geocoding Anda, Anda dapat membuat fungsi yang Amazon Aurora PostgreSQL ditentukan pengguna untuk menjalankan fungsi geocoding. AWS Lambda Untuk informasi selengkapnya, lihat Memanggil AWS Lambda fungsi dari kluster Amazon Aurora PostgreSQL DB di Panduan Pengguna Amazon Aurora.

Instal ekstensi PostgreSQL yang diperlukan

Untuk menginstal ekstensi dan aws_lambda ekstensi PostgreSQL yang diperlukan, lihat aws _commons Ringkasan penggunaan fungsi Lambda di Panduan Pengguna Amazon Aurora.

CREATE EXTENSION IF NOT EXISTS aws_lambda CASCADE;

Instal ekstensi PostGIS yang diperlukan

PostGIS adalah ekstensi dari PostgreSQL untuk menyimpan dan mengelola informasi spasial. Untuk informasi selengkapnya, lihat Bekerja dengan ekstensi PostGIS di Panduan Pengguna Layanan Amazon Relational Database Service.

CREATE EXTENSION IF NOT EXISTS postgis;

Buat fungsi yang ditentukan pengguna SQL yang memanggil fungsi Lambda

Dalam editor SQL, buat fungsi baru yang ditentukan pengguna f_SearchPlaceIndexForText untuk memanggil fungsi: 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$;

Panggil fungsi SQL ke geocode dari Aurora

Menjalankan pernyataan SQL memanggil fungsi Lambda AuroraGeocoder, yang mengambil catatan alamat dari tabel database dalam Amazon Aurora PostgreSQL database dan geokode mereka menggunakan sumber daya indeks tempat.

catatan

Amazon Aurora PostgreSQLmemanggil fungsi Lambda untuk setiap panggilan ke fungsi yang ditentukan pengguna SQL.

Jika Anda melakukan geocoding 50 baris, Amazon Aurora PostgreSQL memanggil fungsi Lambda 50 kali. Satu doa untuk setiap baris.

Fungsi f_SearchPlaceIndexForText SQL berikut membuat permintaan ke Amazon Location SearchPlaceIndexForText API melalui fungsi AuroraGeocoderLambda. Fungsi mengembalikan geom kolom yang merupakan geometri PostGIS, ST_AsText(geom) yang mengkonversi ke teks.

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

Secara default, pengembalian akan berisi satu baris. Untuk meminta baris tambahan, hingga MaxResults batas, jalankan pernyataan SQL berikut sambil memberikan BiasPosition dan membatasi hasil di Kanada.

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

Untuk memfilter hasil menggunakan kotak pembatas, lalu berikan Box2D asfilter_bbox:

  • FilterBBox— Memfilter hasil dengan mengembalikan tempat di dalam kotak pembatas. Ini adalah parameter opsional.

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

Untuk informasi selengkapnya tentang jenis dan fungsi PostGIS, lihat Referensi PostGIS.

Memperkaya database yang berisi data alamat

Anda dapat membuat alamat yang diformat dan secara bersamaan menormalkan dan geocode menggunakan operasi Lokasi Amazon yang SearchPlaceIndexForText diberikan tabel database dengan data berikut dipecah menjadi kolom berikut:

  • 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;

Contoh berikut menggambarkan satu baris datatable yang dihasilkan:

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)

Perbarui tabel database dan isi kolom

Contoh berikut memperbarui tabel dan mengisi kolom dengan hasil 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;

Langkah selanjutnya

Kode sampel tersedia di repositori sampel Amazon Location Service GitHub, yang AWS CloudFormation menyertakan templat.