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.
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 _bulkmovies
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
-
Buka prompt perintah dan membuat direktori proyek
my-opensearch-function
. Misalnya, di macOS:mkdir my-opensearch-function
-
Arahkan ke direktori proyek
my-sourcecode-function
.cd my-opensearch-function
-
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 -
Instal pustaka eksternal ke
package
direktori baru.pip3 install --target ./package boto3 pip3 install --target ./package requests pip3 install --target ./package requests_aws4auth
-
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 .
-
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
-
Arahkan ke konsol Lambda di https://console.aws.amazon.com/lambda/home.
Di panel navigasi kiri, pilih Fungsi. -
Pilih Buat fungsi.
-
Konfigurasi bidang berikut:
-
Nama fungsi: opensearch-function
-
Runtime: Python 3.9
-
Arsitektur: x86_64
Simpan semua opsi default lainnya dan pilih Buat fungsi.
-
-
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. -
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 nama
opensearch-lambda.py
, ganti nama handler menjadi.
Untuk informasi lebih lanjut, lihat Handler fungsi Lambda di Python.opensearch-lambda
.lambda_handler
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
-
Arahkan ke konsol API Gateway di https://console.aws.amazon.com/apigateway/home
. Di panel navigasi kiri, pilih API. -
Cari API REST (tidak privat) dan pilih Membangun.
-
Pada halaman berikut, cari bagian Buat API baru dan pastikan API Baru dipilih.
-
Konfigurasi bidang berikut:
-
Nama API: opensearch-api
-
Deskripsi: API Publik untuk mencari domain OpenSearch Layanan Amazon
-
Tipe Titik Akhir: Regional
-
-
Pilih Buat API.
-
Pilih Actions dan Create Method.
-
Pilih GET di dropdown dan klik tanda centang untuk mengonfirmasi.
-
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.
-
Pilih Actions dan Deploy API.
-
Untuk Tahap deployment pilih Tahap Baru dan beri nama tahap
opensearch-api-test
. -
Pilih Terapkan.
-
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://
). Permintaan membutuhkan parameter tunggal (some-id
.execute-api.us-west-1
.amazonaws.com/search-es-api-testq
), 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.
-
Arahkan ke URL OpenSearch Dasbor untuk domain.
-
Dari menu utama, pilih Keamanan, Peran, dan pilih tautan ke
all_access
, peran yang Anda butuhkan untuk memetakan peran Lambda. -
Pilih Pengguna yang Dipetakan, Kelola pemetaan.
-
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
-
Pilih Peta dan konfirmasikan pengguna atau peran muncul di bawah Pengguna yang dipetakan.
Langkah 5: Menguji aplikasi web
Untuk menguji aplikasi web
-
Unduh sample-site.zip, unzip itu, dan buka
scripts/search.js
di editor teks favorit Anda. -
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.apigatewayendpoint
Variabel harus berbentukhttps://
/.some-id
.execute-api.us-west-1
.amazonaws.com/opensearch-api-test -
Buka
index.html
dan coba jalankan pencarian untuk thor, rumah, dan beberapa istilah lainnya.
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:
-
Aktifkan CORS pada sumber daya GET. Di bawah Advanced, atur Access-Control-Allow-Credentials ke.
'true'
-
Menerapkan ulang API Anda di API Gateway (Actions, Deploy API).
-
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.