

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
<a name="search-example"></a>

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 secara OpenSearch APIs 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 tidak OpenSearch APIs 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 pada subset OpenSearch APIs dan AWS Lambda untuk menandatangani permintaan dari API Gateway ke OpenSearch Layanan.

![\[Cari diagram alir aplikasi.\]](http://docs.aws.amazon.com/id_id/opensearch-service/latest/developerguide/images/search-application-diagram.png)


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

## Prasyarat
<a name="search-example-prereq"></a>

Prasyarat untuk tutorial ini adalah domain Layanan. OpenSearch Jika Anda belum memilikinya, ikuti langkah-langkah di [Buat domain OpenSearch Layanan](gsgcreate-domain.md) untuk membuatnya.

## Langkah 1: Mengindeks data sampel
<a name="search-example-index"></a>

Unduh [sample-movies.zip](samples/sample-movies.zip), unzip, dan kemudian gunakan operasi [\$1bulk](https://opensearch.org/docs/latest/api-reference/document-apis/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, lihat[Opsi 2: Unggah beberapa dokumen](gsgupload-data.md#gsgmultiple-document).

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
<a name="search-example-lambda"></a>

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

### Buat fungsi Lambda
<a name="sample-lamdba-python"></a>

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
   ```

1. Arahkan ke direktori proyek `my-sourcecode-function`.

   ```
   cd my-opensearch-function
   ```

1. 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
   ```

1. Instal pustaka eksternal ke `package` direktori baru.

   ```
   pip3 install --target ./package boto3
   pip3 install --target ./package requests
   pip3 install --target ./package requests_aws4auth
   ```

1. 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 .
   ```

1. 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](https://docs.aws.amazon.com/lambda/latest/dg/lambda-python-how-to-create-deployment-package.html) Pengembang dan dalam panduan ini.AWS Lambda * [Membuat paket deployment Lambda](integrations-s3-lambda.md#integrations-s3-lambda-deployment-package)

Untuk membuat fungsi Anda menggunakan konsol Lambda

1. [Arahkan ke konsol Lambda di https://console.aws.amazon.com/lambda/ rumah.](https://console.aws.amazon.com/lambda/home ) Di panel navigasi kiri, pilih **Fungsi**.

1. Pilih **Buat fungsi**.

1. Konfigurasi bidang berikut:
   + Nama fungsi: opensearch-function
   + Runtime: Python 3.9
   + Arsitektur: x86\$164

   Simpan semua opsi default lainnya dan pilih **Buat fungsi**. 

1. 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**.

1. *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. `opensearch-lambda.lambda_handler` Untuk informasi lebih lanjut, lihat [Handler fungsi Lambda di Python](https://docs.aws.amazon.com/lambda/latest/dg/python-handler.html).

## Langkah 3: Buat API di API Gateway
<a name="search-example-api"></a>

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
<a name="create-api"></a>

Untuk membuat API Anda menggunakan konsol API Gateway

1. Arahkan ke konsol API Gateway di [https://console.aws.amazon.com/apigateway/rumah](https://console.aws.amazon.com/apigateway/home ). Di panel navigasi kiri, pilih **APIs**.

1. Cari **API REST** (tidak privat) dan pilih **Membangun**.

1. Pada halaman berikut, cari bagian **Create new API** dan pastikan **New API** dipilih.

1. Konfigurasi bidang berikut:
   + Nama API: **opensearch-api**
   + Deskripsi: **API Publik untuk mencari domain OpenSearch Layanan Amazon**
   + Tipe Titik Akhir: **Regional**

1. Pilih **Buat API**. 

1. Pilih **Actions** dan **Create Method**.

1. Pilih **GET** di dropdown dan klik tanda centang untuk mengonfirmasi.

1. Konfigurasikan pengaturan berikut, lalu pilih **Simpan**:


| Pengaturan | Nilai | 
| --- | --- | 
| Tipe integrasi | Fungsi Lambda | 
| Gunakan integrasi proksi Lambda | Ya | 
| Wilayah Lambda | us-west-1 | 
| Fungsi Lambda | opensearch-lambda | 
| Gunakan waktu habis default | Ya | 

### Mengkonfigurasi permintaan metode
<a name="method-request"></a>

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
<a name="deploy-api"></a>

 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**.

1. Untuk **Tahap deployment** pilih **Tahap Baru** dan beri nama tahap `opensearch-api-test`.

1. Pilih **Terapkan.**

1. 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](https://docs.aws.amazon.com/apigateway/latest/developerguide/how-to-create-api.html) dan [Menerapkan REST API di Amazon API Gateway](https://docs.aws.amazon.com/apigateway/latest/developerguide/how-to-deploy-api.html).

## Langkah 4: (Opsional) Ubah kebijakan akses domain
<a name="search-example-perms"></a>

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: 

------
#### [ JSON ]

****  

```
{
  "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 persis peran yang dibuat Lambda secara otomatis, buka konsol AWS Identity and Access Management (IAM), pilih **Peran**, dan cari “lambda”.

------
#### [ JSON ]

****  

```
{
  "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](fgac.md#fgac-mapping) di OpenSearch Dasbor, jika tidak, Anda akan melihat kesalahan izin.

### Konfigurasikan izin peran eksekusi Lambda
<a name="search-example-lambda-iam"></a>

Selain mengonfigurasi kebijakan akses domain, Anda juga harus memastikan bahwa peran eksekusi Lambda memiliki izin IAM yang diperlukan untuk mengakses domain Layanan Anda. OpenSearch Fungsi Lambda memerlukan izin khusus tergantung pada apakah Anda menggunakan domain terkelola atau koleksi OpenSearch Service Serverless.

**Untuk domain OpenSearch Layanan terkelola:**

Lampirkan kebijakan IAM berikut ke peran eksekusi Lambda Anda untuk memungkinkannya membuat permintaan ke domain Layanan OpenSearch Anda:

------
#### [ JSON ]

****  

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

------

**Untuk koleksi OpenSearch Service Serverless:**

Jika Anda menggunakan OpenSearch Service Serverless, lampirkan kebijakan IAM berikut ke peran eksekusi Lambda Anda:

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "aoss:*",
      "Resource": "arn:aws:aoss:us-west-1:123456789012:collection/collection-id"
    }
  ]
}
```

------

Untuk melampirkan kebijakan ini ke peran eksekusi Lambda Anda:

1. Arahkan ke konsol IAM di [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/).

1. Pilih **Peran dan cari peran** eksekusi Lambda Anda (biasanya bernama`opensearch-lambda-role-xxxxxxxx`).

1. Pilih **Tambahkan izin**, lalu **Buat kebijakan sebaris**.

1. Pilih tab **JSON** dan tempel kebijakan yang sesuai dari atas, ganti nilai placeholder dengan sumber daya Anda yang sebenarnya. ARNs

1. Pilih **Kebijakan tinjauan**, berikan nama seperti`OpenSearchAccess`, dan pilih **Buat kebijakan**.

**catatan**  
Tanpa izin IAM ini, fungsi Lambda Anda akan menerima kesalahan “Akses Ditolak” saat mencoba menanyakan domain OpenSearch Layanan Anda, meskipun kebijakan akses domain mengizinkan permintaan tersebut.

Untuk informasi selengkapnya tentang kebijakan akses, lihat [Mengonfigurasi kebijakan akses](createupdatedomains.md#createdomain-configure-access-policies).

## Petakan peran Lambda (jika menggunakan kontrol akses berbutir halus)
<a name="search-example-perms-fgac"></a>

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.

1. Dari menu utama, pilih **Keamanan**, **Peran**, dan pilih tautan ke`all_access`, peran yang Anda butuhkan untuk memetakan peran Lambda.

1. Pilih **Pengguna yang Dipetakan**, **Kelola pemetaan**. 

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

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

## Langkah 5: Menguji aplikasi web
<a name="search-example-webpage"></a>

**Untuk menguji aplikasi web**

1. Unduh [sample-site.zip](samples/sample-site.zip), unzip itu, dan buka `scripts/search.js` di editor teks favorit Anda.

1. 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 mengambil bentuk `https://some-id.execute-api.us-west-1.amazonaws.com/opensearch-api-test` /.

1. Buka `index.html` dan coba jalankan pencarian untuk *thor*, *rumah*, dan beberapa istilah lainnya.  
![\[Sampel pencarian untuk thor.\]](http://docs.aws.amazon.com/id_id/opensearch-service/latest/developerguide/images/search-ui.png)

### Memecahkan masalah kesalahan CORS
<a name="search-example-cors"></a>

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](https://docs.aws.amazon.com/apigateway/latest/developerguide/how-to-cors-console.html) pada sumber daya GET. Di bawah **Advanced**, atur **Access-Control-Allow-Credentials** ke. `'true'`

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

1. 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:    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/id_id/opensearch-service/latest/developerguide/search-example.html)

## Langkah selanjutnya
<a name="search-example-next"></a>

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.