Tutorial: Membuat aplikasi pencarian dengan Amazon OpenSearch Service - OpenSearch Layanan Amazon

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

Tutorial: Membuat aplikasi pencarian dengan Amazon OpenSearch Service

Cara umum untuk membuat aplikasi pencarian dengan Amazon OpenSearch Service adalah dengan menggunakan formulir web untuk mengirim kueri pengguna ke server. Kemudian Anda dapat mengotorisasi server untuk memanggil OpenSearch API secara langsung dan meminta server mengirim permintaan ke OpenSearch Layanan. Namun, jika Anda ingin menulis kode sisi klien yang tidak bergantung pada server, Anda harus mengkompensasi risiko keamanan dan kinerja. Mengizinkan akses publik yang tidak ditandatangani ke OpenSearch API tidak disarankan. Pengguna mungkin mengakses titik akhir yang tidak aman atau memengaruhi performa klaster melalui kueri yang terlalu luas (atau terlalu banyak kueri).

Bab ini menyajikan solusi: gunakan Amazon API Gateway untuk membatasi pengguna ke subset OpenSearch API dan AWS Lambda untuk menandatangani permintaan dari API Gateway ke OpenSearch Layanan.


            Cari diagram alir aplikasi.
catatan

Harga Standar API Gateway dan Lambda berlaku, tetapi dalam penggunaan terbatas dari tutorial ini, biaya harus diabaikan.

Prasyarat

Prasyarat untuk tutorial ini adalah domain Layanan. OpenSearch Jika Anda belum memilikinya, ikuti langkah-langkah di Buat domain OpenSearch Layanan untuk membuatnya.

Langkah 1: Mengindeks data sampel

Unduh sample-movies.zip, unzip, lalu gunakan operasi _bulk API untuk menambahkan 5.000 dokumen ke indeks: movies

POST https://search-my-domain.us-west-1.es.amazonaws.com/_bulk { "index": { "_index": "movies", "_id": "tt1979320" } } {"directors":["Ron Howard"],"release_date":"2013-09-02T00:00:00Z","rating":8.3,"genres":["Action","Biography","Drama","Sport"],"image_url":"http://ia.media-imdb.com/images/M/MV5BMTQyMDE0MTY0OV5BMl5BanBnXkFtZTcwMjI2OTI0OQ@@._V1_SX400_.jpg","plot":"A re-creation of the merciless 1970s rivalry between Formula One rivals James Hunt and Niki Lauda.","title":"Rush","rank":2,"running_time_secs":7380,"actors":["Daniel Brühl","Chris Hemsworth","Olivia Wilde"],"year":2013,"id":"tt1979320","type":"add"} { "index": { "_index": "movies", "_id": "tt1951264" } } {"directors":["Francis Lawrence"],"release_date":"2013-11-11T00:00:00Z","genres":["Action","Adventure","Sci-Fi","Thriller"],"image_url":"http://ia.media-imdb.com/images/M/MV5BMTAyMjQ3OTAxMzNeQTJeQWpwZ15BbWU4MDU0NzA1MzAx._V1_SX400_.jpg","plot":"Katniss Everdeen and Peeta Mellark become targets of the Capitol after their victory in the 74th Hunger Games sparks a rebellion in the Districts of Panem.","title":"The Hunger Games: Catching Fire","rank":4,"running_time_secs":8760,"actors":["Jennifer Lawrence","Josh Hutcherson","Liam Hemsworth"],"year":2013,"id":"tt1951264","type":"add"} ...

Perhatikan bahwa di atas adalah contoh perintah dengan subset kecil dari data yang tersedia. Untuk melakukan _bulk operasi, Anda perlu menyalin dan menempelkan seluruh konten sample-movies file. Untuk instruksi lebih lanjut, lihatOpsi 2: Unggah beberapa dokumen.

Anda juga dapat menggunakan perintah curl berikut untuk mencapai hasil yang sama:

curl -XPOST -u 'master-user:master-user-password' 'domain-endpoint/_bulk' --data-binary @bulk_movies.json -H 'Content-Type: application/json'

Langkah 2: Buat dan gunakan fungsi Lambda

Sebelum Anda membuat API di API Gateway, buat fungsi Lambda yang diteruskan permintaannya.

Buat fungsi Lambda

Dalam solusi ini, API Gateway meneruskan permintaan ke fungsi Lambda, yang menanyakan OpenSearch Layanan dan mengembalikan hasil. Karena fungsi sampel ini menggunakan pustaka eksternal, Anda perlu membuat paket penyebaran dan mengunggahnya ke Lambda.

Untuk membuat paket deployment
  1. Buka prompt perintah dan membuat direktori proyek my-opensearch-function. Misalnya, di macOS:

    mkdir my-opensearch-function
  2. Arahkan ke direktori proyek my-sourcecode-function.

    cd my-opensearch-function
  3. Salin isi contoh kode Python berikut dan simpan dalam file baru bernama. opensearch-lambda.py Tambahkan Wilayah Anda dan host endpoint ke file.

    import boto3 import json import requests from requests_aws4auth import AWS4Auth region = '' # For example, us-west-1 service = 'es' credentials = boto3.Session().get_credentials() awsauth = AWS4Auth(credentials.access_key, credentials.secret_key, region, service, session_token=credentials.token) host = '' # The OpenSearch domain endpoint with https:// and without a trailing slash index = 'movies' url = host + '/' + index + '/_search' # Lambda execution starts here def lambda_handler(event, context): # Put the user query into the query DSL for more accurate search results. # Note that certain fields are boosted (^). query = { "size": 25, "query": { "multi_match": { "query": event['queryStringParameters']['q'], "fields": ["title^4", "plot^2", "actors", "directors"] } } } # Elasticsearch 6.x requires an explicit Content-Type header headers = { "Content-Type": "application/json" } # Make the signed HTTP request r = requests.get(url, auth=awsauth, headers=headers, data=json.dumps(query)) # Create the response and add some extra content to support CORS response = { "statusCode": 200, "headers": { "Access-Control-Allow-Origin": '*' }, "isBase64Encoded": False } # Add the search results to the response response['body'] = r.text return response
  4. Instal pustaka eksternal ke package direktori baru.

    pip3 install --target ./package boto3 pip3 install --target ./package requests pip3 install --target ./package requests_aws4auth
  5. Buat paket deployment dengan pustaka terinstal di akar. Perintah berikut menghasilkan my-deployment-package.zip file di direktori proyek Anda.

    cd package zip -r ../my-deployment-package.zip .
  6. Tambahkan file opensearch-lambda.py ke akar dari file zip.

    cd .. zip my-deployment-package.zip opensearch-lambda.py

Untuk informasi selengkapnya tentang membuat fungsi Lambda dan paket penyebaran, lihat Menerapkan fungsi Lambda Python dengan arsip file.zip di Panduan Pengembang dan dalam panduan ini. AWS Lambda Membuat paket deployment Lambda

Untuk membuat fungsi Anda menggunakan konsol Lambda

  1. Arahkan ke konsol Lambda di https://console.aws.amazon.com/lambda/home. Di panel navigasi kiri, pilih Fungsi.

  2. Pilih Buat fungsi.

  3. Konfigurasi bidang berikut:

    • Nama fungsi: opensearch-function

    • Runtime: Python 3.9

    • Arsitektur: x86_64

    Simpan semua opsi default lainnya dan pilih Buat fungsi.

  4. Di bagian Sumber kode dari halaman ringkasan fungsi, pilih Unggah dari tarik-turun dan pilih file.zip. Temukan my-deployment-package.zip file yang Anda buat dan pilih Simpan.

  5. Handler adalah metode dalam fungsi kode Anda yang memproses peristiwa. Di bawah pengaturan Runtime, pilih Edit dan ubah nama handler sesuai dengan nama file dalam paket penyebaran Anda di mana fungsi Lambda berada. Karena file Anda diberi namaopensearch-lambda.py, ganti nama handler menjadi. opensearch-lambda.lambda_handler Untuk informasi lebih lanjut, lihat Handler fungsi Lambda di Python.

Langkah 3: Buat API di API Gateway

Menggunakan API Gateway memungkinkan Anda membuat API yang lebih terbatas dan menyederhanakan proses berinteraksi dengan API. OpenSearch _search API Gateway memungkinkan Anda mengaktifkan fitur keamanan seperti autentikasi Amazon Cognito dan throttling permintaan. Lakukan langkah-langkah berikut untuk membuat dan men-deploy API:

Buat dan konfigurasi API

Untuk membuat API Anda menggunakan konsol API Gateway

  1. Arahkan ke konsol API Gateway di https://console.aws.amazon.com/apigateway/home. Di panel navigasi kiri, pilih API.

  2. Cari API REST (tidak privat) dan pilih Membangun.

  3. Pada halaman berikut, cari bagian Buat API baru dan pastikan API Baru dipilih.

  4. Konfigurasi bidang berikut:

    • Nama API: opensearch-api

    • Deskripsi: API Publik untuk mencari domain OpenSearch Layanan Amazon

    • Tipe Titik Akhir: Regional

  5. Pilih Buat API.

  6. Pilih Actions dan Create Method.

  7. Pilih GET di dropdown dan klik tanda centang untuk mengonfirmasi.

  8. Konfigurasikan pengaturan berikut, lalu pilih Simpan:

Pengaturan Nilai
Tipe integrasi Fungsi Lambda
Gunakan integrasi proksi Lambda Ya
Wilayah Lambda kami-barat-1
Fungsi Lambda opensearch-lambda
Gunakan waktu habis default Ya

Mengkonfigurasi permintaan metode

Pilih Permintaan Metode dan konfigurasikan pengaturan berikut:

Pengaturan Nilai
Otorisasi TIDAK ADA
Validator Permintaan

Memvalidasi parameter string kueri dan header

Kunci API Diperlukan salah

Di bawah Parameter String Kueri URL, pilih Tambahkan string kueri dan konfigurasikan parameter berikut:

Pengaturan Nilai
Nama q
Diperlukan

Ya

Men-deploy API dan mengkonfigurasi tahap

Konsol API Gateway memungkinkan Anda men-deploy API dengan membuat deployment dan mengaitkannya dengan tahap baru atau yang sudah ada.

  1. Pilih Actions dan Deploy API.

  2. Untuk Tahap deployment pilih Tahap Baru dan beri nama tahap opensearch-api-test.

  3. Pilih Terapkan.

  4. Konfigurasikan pengaturan berikut di editor tahap, lalu pilih Simpan Perubahan:

Pengaturan Nilai
Aktifkan throttling Ya
Laju

1000

Burst 500

Pengaturan ini mengkonfigurasi API yang hanya memiliki satu metode: permintaan GET ke root titik akhir (https://some-id.execute-api.us-west-1.amazonaws.com/search-es-api-test). Permintaan membutuhkan parameter tunggal (q), string kueri untuk mencari. Ketika dipanggil, metode meneruskan permintaan ke Lambda, yang menjalankan fungsi opensearch-lambda. Untuk informasi selengkapnya, lihat Membuat API di Amazon API Gateway dan Menerapkan REST API di Amazon API Gateway.

Langkah 4: (Opsional) Ubah kebijakan akses domain

Domain OpenSearch Layanan Anda harus mengizinkan fungsi Lambda untuk membuat GET permintaan ke indeks. movies Jika domain Anda memiliki kebijakan akses terbuka dengan kontrol akses halus diaktifkan, Anda dapat membiarkannya apa adanya:

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "*" }, "Action": "es:*", "Resource": "arn:aws:es:us-west-1:123456789012:domain/domain-name/*" } ] }

Atau, Anda dapat memilih untuk membuat kebijakan akses domain Anda lebih terperinci. Misalnya, kebijakan minimum berikut menyediakan opensearch-lambda-role (dibuat melalui Lambda) akses baca ke indeks. movies Untuk mendapatkan nama yang tepat dari peran yang dibuat Lambda secara otomatis, pergi ke konsol AWS Identity and Access Management (IAM), pilih Peran, dan cari “lambda”.

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::123456789012:role/service-role/opensearch-lambda-role-1abcdefg" }, "Action": "es:ESHttpGet", "Resource": "arn:aws:es:us-west-1:123456789012:domain/domain-name/movies/_search" } ] }
penting

Jika Anda mengaktifkan kontrol akses berbutir halus untuk domain, Anda juga perlu memetakan peran tersebut ke pengguna di OpenSearch Dasbor, jika tidak, Anda akan melihat kesalahan izin.

Untuk informasi selengkapnya tentang kebijakan akses, lihat Mengonfigurasi kebijakan akses.

Petakan peran Lambda (jika menggunakan kontrol akses berbutir halus)

Kontrol akses berbutir halus memperkenalkan langkah tambahan sebelum Anda dapat menguji aplikasi. Bahkan jika Anda menggunakan otentikasi dasar HTTP untuk semua tujuan lain, Anda perlu memetakan peran Lambda ke pengguna, jika tidak, Anda akan melihat kesalahan izin.

  1. Arahkan ke URL OpenSearch Dasbor untuk domain.

  2. Dari menu utama, pilih Keamanan, Peran, dan pilih tautan keall_access, peran yang Anda butuhkan untuk memetakan peran Lambda.

  3. Pilih Pengguna yang Dipetakan, Kelola pemetaan.

  4. Di bawah peran Backend, tambahkan Nama Sumber Daya Amazon (ARN) peran Lambda. ARN harus berbentuk. arn:aws:iam::123456789123:role/service-role/opensearch-lambda-role-1abcdefg

  5. Pilih Peta dan konfirmasikan pengguna atau peran muncul di bawah Pengguna yang dipetakan.

Langkah 5: Menguji aplikasi web

Untuk menguji aplikasi web
  1. Unduh sample-site.zip, unzip itu, dan buka scripts/search.js di editor teks favorit Anda.

  2. Perbarui apigatewayendpoint variabel untuk menunjuk ke titik akhir API Gateway Anda dan tambahkan garis miring terbalik ke akhir jalur yang diberikan. Anda dapat dengan cepat menemukan titik akhir di API Gateway dengan memilih Tahapan dan memilih nama API. apigatewayendpointVariabel harus berbentuk https://some-id.execute-api.us-west-1.amazonaws.com/opensearch-api-test /.

  3. Buka index.html dan coba jalankan pencarian untuk thor, rumah, dan beberapa istilah lainnya.

    
                        Sampel pencarian untuk thor.

Memecahkan masalah kesalahan CORS

Meskipun fungsi Lambda menyertakan konten dalam respons untuk mendukung CORS, Anda mungkin masih melihat kesalahan berikut:

Access to XMLHttpRequest at '<api-gateway-endpoint>' from origin 'null' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present in the requested resource.

Jika ini terjadi, coba yang berikut ini:

  1. Aktifkan CORS pada sumber daya GET. Di bawah Advanced, atur Access-Control-Allow-Credentials ke. 'true'

  2. Menerapkan ulang API Anda di API Gateway (Actions, Deploy API).

  3. Hapus dan tambahkan kembali pemicu fungsi Lambda Anda. Tambahkan tambahkan kembali, pilih Tambah pemicu dan buat titik akhir HTTP yang memanggil fungsi Anda. Pemicu harus memiliki konfigurasi berikut:

    Pemicu API Tahap Deployment Keamanan
    API Gateway opensearch-api opensearch-api-test Buka

Langkah berikutnya

Bab ini hanyalah titik awal untuk mendemonstrasikan sebuah konsep. Anda mungkin mempertimbangkan modifikasi berikut:

  • Tambahkan data Anda sendiri ke domain OpenSearch Layanan.

  • Menambahkan metode ke API Anda.

  • Dalam fungsi Lambda, memodifikasi kueri pencarian atau meningkatkan bidang yang berbeda.

  • Gaya hasil secara berbeda atau memodifikasi search.js untuk menampilkan bidang yang berbeda kepada pengguna.