

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

# Tutorial: Buat REST API kalkulator dengan dua integrasi AWS layanan dan satu integrasi non-proxy Lambda
<a name="integrating-api-with-aws-services-lambda"></a>

[Tutorial: Buat REST API dengan integrasi non-proxy Lambda](getting-started-lambda-non-proxy-integration.md)Penggunaan `Lambda Function` integrasi secara eksklusif. `Lambda Function`integrasi adalah kasus khusus dari jenis `AWS Service` integrasi yang melakukan banyak pengaturan integrasi untuk Anda, seperti secara otomatis menambahkan izin berbasis sumber daya yang diperlukan untuk menjalankan fungsi Lambda. Di sini, dua dari tiga integrasi menggunakan `AWS Service` integrasi. Dalam jenis integrasi ini, Anda memiliki lebih banyak kontrol, tetapi Anda harus melakukan tugas secara manual seperti membuat dan menentukan peran IAM yang berisi izin yang sesuai.



Dalam tutorial ini, Anda akan membuat fungsi `Calc` Lambda yang mengimplementasikan operasi aritmatika dasar, menerima dan mengembalikan input dan output berformat JSON. Kemudian Anda akan membuat REST API dan mengintegrasikannya dengan fungsi Lambda dengan cara berikut:

1. Dengan mengekspos `GET` metode pada `/calc` sumber daya untuk menjalankan fungsi Lambda, memasok input sebagai parameter string kueri. (`AWS Service`integrasi)

1. Dengan mengekspos `POST` metode pada `/calc` sumber daya untuk menjalankan fungsi Lambda, memasok input dalam payload permintaan metode. (`AWS Service`integrasi)

1. Dengan mengekspos `/calc/{operand1}/{operand2}/{operator}` sumber daya `GET` bersarang untuk menjalankan fungsi Lambda, memasok input sebagai parameter jalur. (`Lambda Function`integrasi)

Selain mencoba tutorial ini, Anda mungkin ingin mempelajari [file definisi OpenAPI](api-as-lambda-proxy-export-swagger-with-extensions.md) untuk `Calc` API, yang dapat Anda impor ke API Gateway dengan mengikuti petunjuk di. [Kembangkan REST APIs menggunakan OpenAPI di API Gateway](api-gateway-import-api.md)

**Topics**
+ [Buat peran IAM yang dapat diasumsikan](#api-as-lambda-proxy-setup-iam-role-policies)
+ [Buat fungsi `Calc` Lambda](#api-as-lambda-proxy-create-lambda-function)
+ [Uji fungsi `Calc` Lambda](#api-as-lambda-proxy-test-lambda-function-)
+ [Buat `Calc` API](#api-as-lambda-proxy-create-api-resources)
+ [Integrasi 1: Buat `GET` metode dengan parameter kueri untuk memanggil fungsi Lambda](#api-as-lambda-proxy-expose-get-method-with-query-strings-to-call-lambda-function)
+ [Integrasi 2: Buat `POST` metode dengan payload JSON untuk memanggil fungsi Lambda](#api-as-lambda-proxy-expose-post-method-with-json-body-to-call-lambda-function)
+ [Integrasi 3: Buat `GET` metode dengan parameter jalur untuk memanggil fungsi Lambda](#api-as-lambda-proxy-expose-get-method-with-path-parameters-to-call-lambda-function)
+ [Definisi OpenAPI dari contoh API terintegrasi dengan fungsi Lambda](api-as-lambda-proxy-export-swagger-with-extensions.md)

## Buat peran IAM yang dapat diasumsikan
<a name="api-as-lambda-proxy-setup-iam-role-policies"></a>

Agar API dapat menjalankan fungsi `Calc` Lambda, Anda harus memiliki peran IAM yang dapat diasumsikan API Gateway, yang merupakan peran IAM dengan hubungan tepercaya berikut:

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "",
      "Effect": "Allow",
      "Principal": {
        "Service": "apigateway.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}
```

------

Peran yang Anda buat harus memiliki izin Lambda [InvokeFunction](https://docs.aws.amazon.com/lambda/latest/api/API_Invoke.html). Jika tidak, pemanggil API akan menerima `500 Internal Server Error` respons. Untuk memberikan izin ini kepada peran ini, Anda akan melampirkan kebijakan IAM berikut:

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "lambda:InvokeFunction",
            "Resource": "*"
        }
    ]
}
```

------

Inilah cara untuk mencapai semua ini:

**Buat peran IAM yang dapat diasumsikan API Gateway**

1. Masuk ke konsol IAM.

1. Pilih **Peran**.

1. Pilih **Buat Peran**.

1. Di **Pilih jenis entitas tepercaya**, pilih **Layanan AWS **.

1. Di bawah **Pilih layanan yang akan menggunakan di peran ini**, pilih **Lambda**.

1. Pilih **Berikutnya: Izin**.

1. Pilih **Buat Kebijakan**.

   Jendela konsol **Create Policy** baru akan terbuka. Di jendela itu, lakukan hal berikut:

   1. Di tab **JSON**, ganti kebijakan yang ada dengan yang berikut:

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

****  

      ```
      {
          "Version":"2012-10-17",		 	 	 
          "Statement": [
              {
                  "Effect": "Allow",
                  "Action": "lambda:InvokeFunction",
                  "Resource": "*"
              }
          ]
      }
      ```

------

   1. Pilih **Tinjau kebijakan**.

   1. Di bawah **Kebijakan Peninjauan**, lakukan hal berikut:

      1. Untuk **Nama**, ketik nama seperti **lambda\$1execute**.

      1. Pilih **Buat Kebijakan**.

1. Di jendela konsol **Create Role** asli, lakukan hal berikut:

   1. Di bawah **Lampirkan kebijakan izin**, pilih **lambda\$1execute** kebijakan Anda dari daftar tarik-turun.

      Jika kebijakan tidak terlihat dalam daftar, pilih tombol refresh di bagian atas daftar. (Jangan me-refresh halaman browser\$1)

   1. Pilih **Selanjutnya: Tag**.

   1. Pilih **Selanjutnya: Tinjau**.

   1. Untuk **nama Peran**, ketikkan nama seperti**lambda\$1invoke\$1function\$1assume\$1apigw\$1role**.

   1. Pilih **Buat peran**.

1. Pilih **lambda\$1invoke\$1function\$1assume\$1apigw\$1role** dari daftar peran Anda.

1. Pilih tab **Trust relationship**.

1. Pilih **Edit trust relationship** (Edit Hubungan Kepercayaan).

1. Ganti kebijakan yang ada dengan yang berikut:

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

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [
       {
         "Sid": "",
         "Effect": "Allow",
         "Principal": {
           "Service": [
             "lambda.amazonaws.com",
             "apigateway.amazonaws.com"
           ]
         },
         "Action": "sts:AssumeRole"
       }
     ]
   }
   ```

------

1. Pilih **Perbarui Kebijakan Kepercayaan**.

1. Catat peran ARN untuk peran yang baru saja Anda buat. Anda akan membutuhkannya nanti.

## Buat fungsi `Calc` Lambda
<a name="api-as-lambda-proxy-create-lambda-function"></a>

Selanjutnya Anda akan membuat fungsi Lambda menggunakan konsol Lambda.

1. Di konsol Lambda, pilih **Buat** fungsi.

1. Pilih **Penulis dari Scratch**.

1. Untuk **Nama**, masukkan **Calc**.

1. Untuk **Runtime, pilih runtime** **Node.js** atau **Python** terbaru yang didukung.

1. Untuk semua opsi lain, gunakan pengaturan default.

1. Pilih **Buat fungsi**.

1.  Salin fungsi Lambda berikut di runtime pilihan Anda dan tempelkan ke editor kode di konsol Lambda. 

------
#### [ Node.js ]

   ```
   export const handler = async function (event, context) {
     console.log("Received event:", JSON.stringify(event));
   
     if (
       event.a === undefined ||
       event.b === undefined ||
       event.op === undefined
     ) {
       return "400 Invalid Input";
     }
   
     const res = {};
     res.a = Number(event.a);
     res.b = Number(event.b);
     res.op = event.op;
     if (isNaN(event.a) || isNaN(event.b)) {
       return "400 Invalid Operand";
     }
     switch (event.op) {
       case "+":
       case "add":
         res.c = res.a + res.b;
         break;
       case "-":
       case "sub":
         res.c = res.a - res.b;
         break;
       case "*":
       case "mul":
         res.c = res.a * res.b;
         break;
       case "/":
       case "div":
         if (res.b == 0) {
           return "400 Divide by Zero";
         } else {
           res.c = res.a / res.b;
         }
         break;
       default:
         return "400 Invalid Operator";
     }
   
     return res;
   };
   ```

------
#### [ Python ]

   ```
   import json
   
   
   def lambda_handler(event, context):
       print(event)
   
       try:
           (event['a']) and (event['b']) and (event['op'])
       except KeyError:
           return '400 Invalid Input'
   
       try:
           res = {
               "a": float(
                   event['a']), "b": float(
                   event['b']), "op": event['op']}
       except ValueError:
           return '400 Invalid Operand'
   
       if event['op'] == '+':
           res['c'] = res['a'] + res['b']
       elif event['op'] == '-':
           res['c'] = res['a'] - res['b']
       elif event['op'] == '*':
           res['c'] = res['a'] * res['b']
       elif event['op'] == '/':
           if res['b'] == 0:
               return '400 Divide by Zero'
           else:
               res['c'] = res['a'] / res['b']
       else:
           return '400 Invalid Operator'
   
       return res
   ```

------

1. Di bawah Peran eksekusi, **pilih Pilih peran yang ada**.

1. Masukkan peran ARN untuk **lambda\$1invoke\$1function\$1assume\$1apigw\$1role** peran yang Anda buat sebelumnya.

1. Pilih **Deploy**.

 Fungsi ini membutuhkan dua operan (`a`dan`b`) dan operator (`op`) dari parameter `event` input. Input adalah objek JSON dari format berikut: 

```
{
  "a": "Number" | "String",
  "b": "Number" | "String",
  "op": "String"
}
```

Fungsi ini mengembalikan hasil yang dihitung (`c`) dan masukan. Untuk input yang tidak valid, fungsi mengembalikan nilai null atau string “Invalid op” sebagai hasilnya. Outputnya adalah format JSON berikut: 

```
{
  "a": "Number",
  "b": "Number",
  "op": "String",
  "c": "Number" | "String"
}
```

Anda harus menguji fungsi di konsol Lambda sebelum mengintegrasikannya dengan API di langkah berikutnya. 

## Uji fungsi `Calc` Lambda
<a name="api-as-lambda-proxy-test-lambda-function-"></a>

Berikut cara menguji `Calc` fungsi Anda di konsol Lambda:

1. Pilih tab **Uji**.

1. Untuk nama acara pengujian, masukkan**calc2plus5**.

1. Ganti definisi acara pengujian dengan yang berikut:

   ```
   {
     "a": "2",
     "b": "5",
     "op": "+"
   }
   ```

1. Pilih **Simpan**.

1. Pilih **Uji**.

1. Perluas **Hasil eksekusi: berhasil.** Anda akan melihat yang berikut ini:

   ```
   {
     "a": 2,
     "b": 5,
     "op": "+",
     "c": 7
   }
   ```

## Buat `Calc` API
<a name="api-as-lambda-proxy-create-api-resources"></a>

Prosedur berikut menunjukkan cara membuat API untuk fungsi `Calc` Lambda yang baru saja Anda buat. Di bagian berikutnya, Anda akan menambahkan sumber daya dan metode ke dalamnya.

**Untuk membuat API**

1. Masuk ke konsol API Gateway di [https://console.aws.amazon.com/apigateway](https://console.aws.amazon.com/apigateway).

1. Jika ini adalah pertama kalinya Anda menggunakan API Gateway, Anda akan melihat halaman yang memperkenalkan Anda ke fitur layanan. Di bawah **REST API**, pilih **Build**. **Saat munculan **Create Example API** muncul, pilih OK.**

   Jika ini bukan pertama kalinya Anda menggunakan API Gateway, pilih **Buat API**. Di bawah **REST API**, pilih **Build**.

1.  Untuk **nama API**, masukkan**LambdaCalc**.

1. (Opsional) Untuk **Deskripsi**, masukkan deskripsi.

1. Tetap tetapkan **jenis endpoint API** ke **Regional**.

1. Untuk **jenis alamat IP**, pilih **IPv4**.

1. Pilih **Buat API**.

## Integrasi 1: Buat `GET` metode dengan parameter kueri untuk memanggil fungsi Lambda
<a name="api-as-lambda-proxy-expose-get-method-with-query-strings-to-call-lambda-function"></a>

Dengan membuat `GET` metode yang meneruskan parameter string kueri ke fungsi Lambda, Anda mengaktifkan API untuk dipanggil dari browser. Pendekatan ini dapat berguna, terutama untuk APIs itu memungkinkan akses terbuka.

Setelah membuat API, Anda membuat sumber daya. Biasanya, sumber daya API diatur dalam pohon sumber daya sesuai dengan logika aplikasi. Untuk langkah ini, Anda membuat sumber daya **/calc**. 

**Untuk membuat sumber daya **/calc****

1. Pilih **Buat sumber daya**.

1. Matikan **sumber daya Proxy**. 

1. Pertahankan **jalur Sumber Daya** sebagai`/`.

1. Untuk **Nama sumber daya**, masukkan **calc**.

1. Tetap nonaktifkan **CORS (Cross Origin Resource Sharing)**.

1. Pilih **Buat sumber daya**.

Dengan membuat `GET` metode yang meneruskan parameter string kueri ke fungsi Lambda, Anda mengaktifkan API untuk dipanggil dari browser. Pendekatan ini dapat berguna, terutama untuk APIs itu memungkinkan akses terbuka.

Dalam metode ini, Lambda mengharuskan `POST` permintaan digunakan untuk memanggil fungsi Lambda apa pun. Contoh ini menunjukkan bahwa metode HTTP dalam permintaan metode frontend dapat berbeda dari permintaan integrasi di backend.

**Untuk membuat `GET` metode**

1. Pilih sumber daya **/calc**, lalu pilih **Create** method.

1. Untuk **tipe Metode**, pilih **GET**.

1. Untuk **jenis Integrasi**, pilih **Layanan AWS**.

1. Untuk **Wilayah AWS**, pilih Wilayah AWS tempat Anda membuat fungsi Lambda Anda.

1. Untuk **Layanan AWS**, pilih **Lambda**.

1. Biarkan **AWS subdomain** kosong.

1. Untuk **metode HTTP**, pilih **POST**.

1. Untuk **tipe Action**, pilih **Use path override**. Opsi ini memungkinkan kita untuk menentukan ARN dari tindakan [Invoke](https://docs.aws.amazon.com/lambda/latest/dg/API_Invoke.html) untuk menjalankan fungsi kita. `Calc` 

1. Untuk **Path override**, masukkan**2015-03-31/functions/arn:aws:lambda:*us-east-2*:*account-id*:function:Calc/invocations**. Untuk** *account-id***, masukkan Akun AWS ID Anda. Untuk***us-east-2***, masukkan Wilayah AWS tempat Anda membuat fungsi Lambda Anda. 

1. Untuk **peran Eksekusi**, masukkan peran ARN untuk. **lambda\$1invoke\$1function\$1assume\$1apigw\$1role**

1. Jangan mengubah pengaturan **cache Credential** dan **batas waktu default**.

1. Pilih **Pengaturan permintaan Metode**.

1. Untuk **validator Permintaan**, pilih **Validasi parameter string kueri** dan header.

   Pengaturan ini akan menyebabkan pesan kesalahan kembali jika klien tidak menentukan parameter yang diperlukan.

1. Pilih **parameter string kueri URL**.

   Sekarang Anda mengatur parameter string kueri untuk metode **GET** pada sumber daya **/calc** sehingga dapat menerima input atas nama fungsi Lambda backend.

   Untuk membuat parameter string kueri lakukan hal berikut:

   1. Pilih **Tambahkan string kueri**.

   1. Untuk **Nama**, masukkan **operand1**.

   1. Aktifkan **Diperlukan**.

   1. Tetap **caching** dimatikan.

   Ulangi langkah yang sama dan buat string kueri bernama **operand2** dan string kueri bernama**operator**.

1. Pilih **metode Buat**.

Sekarang, Anda membuat template pemetaan untuk menerjemahkan string kueri yang disediakan klien ke payload permintaan integrasi seperti yang dipersyaratkan oleh fungsi. `Calc` Template ini memetakan tiga parameter string kueri yang dideklarasikan dalam **permintaan Metode** ke dalam nilai properti yang ditunjuk dari objek JSON sebagai masukan ke fungsi Lambda backend. Objek JSON yang diubah akan dimasukkan sebagai payload permintaan integrasi. 

**Untuk memetakan parameter input ke permintaan integrasi**

1. Pada tab **Permintaan integrasi**, di bawah **Pengaturan permintaan integrasi**, pilih **Edit**.

1. Untuk **Request body passthrough**, pilih **Bila tidak ada templat yang ditentukan (disarankan)**.

1. Pilih **template Pemetaan**.

1. Pilih **Tambahkan templat pemetaan**.

1. Untuk **jenis Konten**, masukkan**application/json**.

1. Untuk **badan Template**, masukkan kode berikut:

   ```
   {
       "a":  "$input.params('operand1')",
       "b":  "$input.params('operand2')", 
       "op": "$input.params('operator')"   
   }
   ```

1. Pilih **Simpan**.

Anda sekarang dapat menguji `GET` metode Anda untuk memverifikasi bahwa itu telah diatur dengan benar untuk menjalankan fungsi Lambda.

**Untuk menguji `GET` metode**

1. Pilih tab **Uji**. Anda mungkin perlu memilih tombol panah kanan untuk menampilkan tab.

1. Untuk **string Query**, masukkan**operand1=2&operand2=3&operator=\$1**.

1. Pilih **Uji**.

   Hasilnya akan terlihat mirip dengan ini:  
![\[Buat API di API Gateway sebagai proxy Lambda\]](http://docs.aws.amazon.com/id_id/apigateway/latest/developerguide/images/aws_proxy_lambda_calc_get_method_test_new_console.png)

## Integrasi 2: Buat `POST` metode dengan payload JSON untuk memanggil fungsi Lambda
<a name="api-as-lambda-proxy-expose-post-method-with-json-body-to-call-lambda-function"></a>

Dengan membuat `POST` metode dengan payload JSON untuk memanggil fungsi Lambda, Anda membuatnya sehingga klien harus memberikan input yang diperlukan ke fungsi backend di badan permintaan. Untuk memastikan bahwa klien mengunggah data input yang benar, Anda akan mengaktifkan validasi permintaan pada payload.

**Untuk membuat `POST` metode dengan payload JSON**

1. Pilih sumber daya **/calc**, lalu pilih **Create** method.

1. Untuk **jenis Metode**, pilih **POST**.

1. Untuk **jenis Integrasi**, pilih **Layanan AWS**.

1. Untuk **Wilayah AWS**, pilih Wilayah AWS tempat Anda membuat fungsi Lambda Anda.

1. Untuk **Layanan AWS**, pilih **Lambda**.

1. Biarkan **AWS subdomain** kosong.

1. Untuk **metode HTTP**, pilih **POST**.

1. Untuk **tipe Action**, pilih **Use path override**. Opsi ini memungkinkan kita untuk menentukan ARN dari tindakan [Invoke](https://docs.aws.amazon.com/lambda/latest/dg/API_Invoke.html) untuk menjalankan fungsi kita. `Calc` 

1. Untuk **Path override**, masukkan**2015-03-31/functions/arn:aws:lambda:*us-east-2*:*account-id*:function:Calc/invocations**. Untuk** *account-id***, masukkan Akun AWS ID Anda. Untuk***us-east-2***, masukkan Wilayah AWS tempat Anda membuat fungsi Lambda Anda. 

1. Untuk **peran Eksekusi**, masukkan peran ARN untuk. **lambda\$1invoke\$1function\$1assume\$1apigw\$1role**

1. Jangan mengubah pengaturan **cache Credential** dan **batas waktu default**.

1. Pilih **metode Buat**.

Sekarang Anda membuat model **input** untuk menggambarkan struktur data input dan memvalidasi badan permintaan yang masuk.

**Untuk membuat model input**

1. Di panel navigasi utama, pilih **Model**.

1. Pilih **Buat model**.

1. Untuk **Nama**, masukkan **input**.

1. Untuk **jenis Konten**, masukkan**application/json**. 

   Jika tidak ada jenis konten yang cocok ditemukan, validasi permintaan tidak dilakukan. Untuk menggunakan model yang sama terlepas dari jenis konten, masukkan**\$1default**.

1. Untuk **skema Model**, masukkan model berikut:

   ```
   {
       "type":"object",
       "properties":{
           "a":{"type":"number"},
           "b":{"type":"number"},
           "op":{"type":"string"}
       },
       "title":"input"
   }
   ```

1. Pilih **Buat model**.

Anda sekarang membuat model **output**. Model ini menjelaskan struktur data dari output yang dihitung dari backend. Ini dapat digunakan untuk memetakan data respons integrasi ke model yang berbeda. Tutorial ini bergantung pada perilaku passthrough dan tidak menggunakan model ini.

**Untuk membuat model keluaran**

1. Pilih **Buat model**.

1. Untuk **Nama**, masukkan **output**.

1. Untuk **jenis Konten**, masukkan**application/json**. 

   Jika tidak ada jenis konten yang cocok ditemukan, validasi permintaan tidak dilakukan. Untuk menggunakan model yang sama terlepas dari jenis konten, masukkan**\$1default**.

1. Untuk **skema Model**, masukkan model berikut:

   ```
   {
       "type":"object",
       "properties":{
           "c":{"type":"number"}
       },
       "title":"output"
   }
   ```

1. Pilih **Buat model**.

Anda sekarang membuat model **hasil**. Model ini menjelaskan struktur data dari data respons yang dikembalikan. Ini mereferensikan skema **input** dan **output** yang ditentukan dalam API Anda.

**Untuk membuat model hasil**

1. Pilih **Buat model**.

1. Untuk **Nama**, masukkan **result**.

1. Untuk **jenis Konten**, masukkan**application/json**. 

   Jika tidak ada jenis konten yang cocok ditemukan, validasi permintaan tidak dilakukan. Untuk menggunakan model yang sama terlepas dari jenis konten, masukkan**\$1default**.

1. Untuk **skema Model**, masukkan model berikut dengan skema Anda*restapi-id*. Anda *restapi-id* tercantum dalam tanda kurung di bagian atas konsol dalam alur berikut: `API Gateway > APIs > LambdaCalc (abc123).`

   ```
   {
       "type":"object",
       "properties":{
           "input":{
               "$ref":"https://apigateway.amazonaws.com/restapis/restapi-id/models/input"
           },
           "output":{
               "$ref":"https://apigateway.amazonaws.com/restapis/restapi-id/models/output"
           }
       },
       "title":"result"
   }
   ```

1. Pilih **Buat model**.

Anda sekarang mengonfigurasi permintaan metode metode POST Anda untuk mengaktifkan validasi permintaan pada badan permintaan yang masuk.

**Untuk mengaktifkan validasi permintaan pada metode POST**

1. Di panel navigasi utama, pilih **Sumber daya**, lalu pilih `POST` metode dari pohon sumber daya.

1. Pada tab **Permintaan metode**, di bawah **Pengaturan permintaan metode**, pilih **Edit**.

1. Untuk **validator Permintaan**, pilih **Validasi** isi.

1. Pilih **Request body**, lalu pilih **Add model**.

1. Untuk **jenis Konten**, masukkan**application/json**.

   Jika tidak ada jenis konten yang cocok ditemukan, validasi permintaan tidak dilakukan. Untuk menggunakan model yang sama terlepas dari jenis konten, masukkan**\$1default**.

1. Untuk **Model**, pilih **input**.

1. Pilih **Simpan**.

Anda sekarang dapat menguji `POST` metode Anda untuk memverifikasi bahwa itu telah diatur dengan benar untuk menjalankan fungsi Lambda.

**Untuk menguji `POST` metode**

1. Pilih tab **Uji**. Anda mungkin perlu memilih tombol panah kanan untuk menampilkan tab.

1. Untuk **badan Permintaan**, masukkan payload JSON berikut.

   ```
   {
       "a": 1,
       "b": 2,
       "op": "+"
   }
   ```

1. Pilih **Uji**.

   Anda akan melihat output berikut:

   ```
   {
     "a": 1,
     "b": 2,
     "op": "+",
     "c": 3
   }
   ```

## Integrasi 3: Buat `GET` metode dengan parameter jalur untuk memanggil fungsi Lambda
<a name="api-as-lambda-proxy-expose-get-method-with-path-parameters-to-call-lambda-function"></a>

Sekarang Anda akan membuat `GET` metode pada sumber daya yang ditentukan oleh urutan parameter jalur untuk memanggil fungsi Lambda backend. Nilai parameter jalur menentukan data input ke fungsi Lambda. Anda akan menggunakan template pemetaan untuk memetakan nilai parameter jalur masuk ke payload permintaan integrasi yang diperlukan.

Struktur sumber daya API yang dihasilkan akan terlihat seperti ini:

![\[Buat API di API Gateway sebagai proxy Lambda\]](http://docs.aws.amazon.com/id_id/apigateway/latest/developerguide/images/aws_proxy_lambda_create_api_resources_new_console.png)


**Untuk membuat sumber daya**/\$1operand1\$1/\$1operand2\$1/\$1operator\$1****

1. Pilih **Buat sumber daya**.

1. Untuk **jalur Sumber Daya**, pilih`/calc`.

1. Untuk **Nama sumber daya**, masukkan **\$1operand1\$1**.

1. Tetap nonaktifkan **CORS (Cross Origin Resource Sharing)**.

1. Pilih **Buat sumber daya**.

1. Untuk **jalur Sumber Daya**, pilih`/calc/{operand1}/`.

1. Untuk **Nama sumber daya**, masukkan **\$1operand2\$1**.

1. Tetap nonaktifkan **CORS (Cross Origin Resource Sharing)**.

1. Pilih **Buat sumber daya**.

1. Untuk **jalur Sumber Daya**, pilih`/calc/{operand1}/{operand2}/`.

1. Untuk **Nama sumber daya**, masukkan **\$1operator\$1**.

1. Tetap nonaktifkan **CORS (Cross Origin Resource Sharing)**.

1. Pilih **Buat sumber daya**.

Kali ini Anda akan menggunakan integrasi Lambda bawaan di konsol API Gateway untuk menyiapkan integrasi metode.

**Untuk mengatur integrasi metode**

1. **Pilih sumber daya**/\$1operand1\$1/\$1operand2\$1/\$1operator\$1**, lalu pilih Create method.**

1. Untuk **tipe Metode**, pilih **GET**.

1. Untuk **jenis Integrasi**, pilih **Lambda**.

1. Matikan **integrasi proxy Lambda**.

1. Untuk **fungsi Lambda**, pilih Wilayah AWS tempat Anda membuat fungsi Lambda dan masukkan. **Calc**

1. Tetap **aktifkan batas waktu default**.

1. Pilih **metode Buat**.

Anda sekarang membuat template pemetaan untuk memetakan tiga parameter jalur URL, dideklarasikan ketika sumber daya **/calc/ \$1operand1\$1/\$1operand2\$1/\$1operator\$1** dibuat, ke dalam nilai properti yang ditunjuk di objek JSON. Karena jalur URL harus dikodekan URL, operator divisi harus ditentukan sebagai pengganti. `%2F` `/` Template ini menerjemahkan `%2F` ke dalam `'/'` sebelum meneruskannya ke fungsi Lambda. 

**Untuk membuat template pemetaan**

1. Pada tab **Permintaan integrasi**, di bawah **Pengaturan permintaan integrasi**, pilih **Edit**.

1. Untuk **Request body passthrough**, pilih **Bila tidak ada templat yang ditentukan (disarankan)**.

1. Pilih **template Pemetaan**.

1. Untuk **jenis Konten**, masukkan**application/json**.

1. Untuk **badan Template**, masukkan kode berikut:

   ```
   {
      "a": "$input.params('operand1')",
      "b": "$input.params('operand2')",
      "op": #if($input.params('operator')=='%2F')"/"#{else}"$input.params('operator')"#end
   }
   ```

1. Pilih **Simpan**.

Anda sekarang dapat menguji `GET` metode Anda untuk memverifikasi bahwa itu telah diatur dengan benar untuk menjalankan fungsi Lambda dan meneruskan output asli melalui respons integrasi tanpa pemetaan. 

**Untuk menguji `GET` metode**

1. Pilih tab **Uji**. Anda mungkin perlu memilih tombol panah kanan untuk menampilkan tab.

1. Untuk **Path**, lakukan hal berikut:

   1. Untuk **operand1, masukkan**. **1**

   1. Untuk **operand2, masukkan**. **1**

   1. Untuk **operator**, masukkan**\$1**.

1. Pilih **Uji**.

1. Hasilnya akan terlihat seperti ini:  
![\[Uji metode GET di konsol API Gateway.\]](http://docs.aws.amazon.com/id_id/apigateway/latest/developerguide/images/aws_proxy_lambda_calc_get_method_test_path_parm_new_console.png)

Selanjutnya, Anda memodelkan struktur data payload respons metode setelah `result` skema.

Secara default, badan respons metode diberi model kosong. Ini akan menyebabkan badan respons integrasi dilewatkan tanpa pemetaan. Namun, ketika Anda membuat SDK untuk salah satu bahasa tipe kuat, seperti Java atau Objective-C, pengguna SDK Anda akan menerima objek kosong sebagai hasilnya. Untuk memastikan bahwa klien REST dan klien SDK menerima hasil yang diinginkan, Anda harus memodelkan data respons menggunakan skema yang telah ditentukan. Di sini Anda akan mendefinisikan model untuk badan respons metode dan untuk membuat template pemetaan untuk menerjemahkan badan respons integrasi ke dalam badan respons metode.

**Untuk membuat respons metode**

1. Pada tab **Respons Metode**, di bawah **Respons 200**, pilih **Edit**.

1. Di bawah **Badan respons**, pilih **Tambahkan model**.

1. Untuk **jenis Konten**, masukkan**application/json**.

1. Untuk **Model**, pilih **hasil**.

1. Pilih **Simpan**.

Menyetel model untuk badan respons metode memastikan bahwa data respons akan dilemparkan ke `result` objek SDK tertentu. Untuk memastikan bahwa data respons integrasi dipetakan sesuai, Anda memerlukan template pemetaan.

**Untuk membuat template pemetaan**

1. Pada tab **Respons integrasi**, di bawah **Default - Respons**, pilih **Edit**.

1. Pilih **template Pemetaan**.

1. Untuk **jenis Konten**, masukkan**application/json**.

1. Untuk **badan Template**, masukkan kode berikut:

   ```
   #set($inputRoot = $input.path('$'))
   {
     "input" : {
       "a" : $inputRoot.a,
       "b" : $inputRoot.b,
       "op" : "$inputRoot.op"
     },
     "output" : {
       "c" : $inputRoot.c
     }
   }
   ```

1. Pilih **Simpan**.

**Untuk menguji template pemetaan**

1. Pilih tab **Uji**. Anda mungkin perlu memilih tombol panah kanan untuk menampilkan tab.

1. Untuk **Path**, lakukan hal berikut:

   1. Untuk **operand1, masukkan**. **1**

   1. Untuk **operand2, masukkan**. **2**

   1. Untuk **operator**, masukkan**\$1**.

1. Pilih **Uji**.

1. Hasilnya akan terlihat seperti berikut:

   ```
   {
     "input": {
       "a": 1,
       "b": 2,
       "op": "+"
     },
     "output": {
       "c": 3
     }
   }
   ```

Pada titik ini, Anda hanya dapat memanggil API menggunakan fitur **Uji** di konsol API Gateway. Untuk membuatnya tersedia bagi klien, Anda harus menerapkan API Anda. Selalu pastikan untuk menerapkan ulang API Anda setiap kali Anda menambahkan, memodifikasi, atau menghapus sumber daya atau metode, memperbarui pemetaan data, atau memperbarui pengaturan tahap. Jika tidak, fitur atau pembaruan baru tidak akan tersedia untuk klien API Anda. sebagai berikut:

**Untuk menerapkan API**

1. Pilih **Deploy API**.

1. Untuk **Stage**, pilih **New stage**.

1. Untuk **nama Panggung**, masukkan**Prod**.

1. (Opsional) Untuk **Deskripsi**, masukkan deskripsi.

1. Pilih **Deploy**.

1.  (Opsional) Di bawah **detail Tahap**, untuk **Invoke URL**, Anda dapat memilih ikon salin untuk menyalin URL pemanggilan API Anda. Anda dapat menggunakan ini dengan alat seperti [Postman](https://www.postman.com) dan [cURL](https://curl.se/) untuk menguji API Anda.

**catatan**  
Selalu terapkan ulang API Anda setiap kali Anda menambahkan, memodifikasi, atau menghapus sumber daya atau metode, memperbarui pemetaan data, atau memperbarui pengaturan tahap. Jika tidak, fitur atau pembaruan baru tidak akan tersedia untuk klien API Anda.

# Definisi OpenAPI dari contoh API terintegrasi dengan fungsi Lambda
<a name="api-as-lambda-proxy-export-swagger-with-extensions"></a>

------
#### [ OpenAPI 2.0 ]

```
{
  "swagger": "2.0",
  "info": {
    "version": "2017-04-20T04:08:08Z",
    "title": "LambdaCalc"
  },
  "host": "uojnr9hd57.execute-api.us-east-1.amazonaws.com",
  "basePath": "/test",
  "schemes": [
    "https"
  ],
  "paths": {
    "/calc": {
      "get": {
        "consumes": [
          "application/json"
        ],
        "produces": [
          "application/json"
        ],
        "parameters": [
          {
            "name": "operand2",
            "in": "query",
            "required": true,
            "type": "string"
          },
          {
            "name": "operator",
            "in": "query",
            "required": true,
            "type": "string"
          },
          {
            "name": "operand1",
            "in": "query",
            "required": true,
            "type": "string"
          }
        ],
        "responses": {
          "200": {
            "description": "200 response",
            "schema": {
              "$ref": "#/definitions/Result"
            },
            "headers": {
              "operand_1": {
                "type": "string"
              },
              "operand_2": {
                "type": "string"
              },
              "operator": {
                "type": "string"
              }
            }
          }
        },
        "x-amazon-apigateway-request-validator": "Validate query string parameters and headers",
        "x-amazon-apigateway-integration": {
          "credentials": "arn:aws:iam::123456789012:role/apigAwsProxyRole",
          "responses": {
            "default": {
              "statusCode": "200",
              "responseParameters": {
                "method.response.header.operator": "integration.response.body.op",
                "method.response.header.operand_2": "integration.response.body.b",
                "method.response.header.operand_1": "integration.response.body.a"
              },
              "responseTemplates": {
                "application/json": "#set($res = $input.path('$'))\n{\n    \"result\": \"$res.a, $res.b, $res.op => $res.c\",\n  \"a\" : \"$res.a\",\n  \"b\" : \"$res.b\",\n  \"op\" : \"$res.op\",\n  \"c\" : \"$res.c\"\n}"
              }
            }
          },
          "uri": "arn:aws:apigateway:us-west-2:lambda:path/2015-03-31/functions/arn:aws:lambda:us-west-2:123456789012:function:Calc/invocations",
          "passthroughBehavior": "when_no_match",
          "httpMethod": "POST",
          "requestTemplates": {
            "application/json": "{\n    \"a\":  \"$input.params('operand1')\",\n    \"b\":  \"$input.params('operand2')\", \n    \"op\": \"$input.params('operator')\"   \n}"
          },
          "type": "aws"
        }
      },
      "post": {
        "consumes": [
          "application/json"
        ],
        "produces": [
          "application/json"
        ],
        "parameters": [
          {
            "in": "body",
            "name": "Input",
            "required": true,
            "schema": {
              "$ref": "#/definitions/Input"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "200 response",
            "schema": {
              "$ref": "#/definitions/Result"
            }
          }
        },
        "x-amazon-apigateway-request-validator": "Validate body",
        "x-amazon-apigateway-integration": {
          "credentials": "arn:aws:iam::123456789012:role/apigAwsProxyRole",
          "responses": {
            "default": {
              "statusCode": "200",
              "responseTemplates": {
                "application/json": "#set($inputRoot = $input.path('$'))\n{\n  \"a\" : $inputRoot.a,\n  \"b\" : $inputRoot.b,\n  \"op\" : $inputRoot.op,\n  \"c\" : $inputRoot.c\n}"
              }
            }
          },
          "uri": "arn:aws:apigateway:us-west-2:lambda:path/2015-03-31/functions/arn:aws:lambda:us-west-2:123456789012:function:Calc/invocations",
          "passthroughBehavior": "when_no_templates",
          "httpMethod": "POST",
          "type": "aws"
        }
      }
    },
    "/calc/{operand1}/{operand2}/{operator}": {
      "get": {
        "consumes": [
          "application/json"
        ],
        "produces": [
          "application/json"
        ],
        "parameters": [
          {
            "name": "operand2",
            "in": "path",
            "required": true,
            "type": "string"
          },
          {
            "name": "operator",
            "in": "path",
            "required": true,
            "type": "string"
          },
          {
            "name": "operand1",
            "in": "path",
            "required": true,
            "type": "string"
          }
        ],
        "responses": {
          "200": {
            "description": "200 response",
            "schema": {
              "$ref": "#/definitions/Result"
            }
          }
        },
        "x-amazon-apigateway-integration": {
          "credentials": "arn:aws:iam::123456789012:role/apigAwsProxyRole",
          "responses": {
            "default": {
              "statusCode": "200",
              "responseTemplates": {
                "application/json": "#set($inputRoot = $input.path('$'))\n{\n  \"input\" : {\n    \"a\" : $inputRoot.a,\n    \"b\" : $inputRoot.b,\n    \"op\" : \"$inputRoot.op\"\n  },\n  \"output\" : {\n    \"c\" : $inputRoot.c\n  }\n}"
              }
            }
          },
          "uri": "arn:aws:apigateway:us-west-2:lambda:path/2015-03-31/functions/arn:aws:lambda:us-west-2:123456789012:function:Calc/invocations",
          "passthroughBehavior": "when_no_templates",
          "httpMethod": "POST",
          "requestTemplates": {
            "application/json": "{\n   \"a\": \"$input.params('operand1')\",\n   \"b\": \"$input.params('operand2')\",\n   \"op\": #if($input.params('operator')=='%2F')\"/\"#{else}\"$input.params('operator')\"#end\n   \n}"
          },
          "contentHandling": "CONVERT_TO_TEXT",
          "type": "aws"
        }
      }
    }
  },
  "definitions": {
    "Input": {
      "type": "object",
      "required": [
        "a",
        "b",
        "op"
      ],
      "properties": {
        "a": {
          "type": "number"
        },
        "b": {
          "type": "number"
        },
        "op": {
          "type": "string",
          "description": "binary op of ['+', 'add', '-', 'sub', '*', 'mul', '%2F', 'div']"
        }
      },
      "title": "Input"
    },
    "Output": {
      "type": "object",
      "properties": {
        "c": {
          "type": "number"
        }
      },
      "title": "Output"
    },
    "Result": {
      "type": "object",
      "properties": {
        "input": {
          "$ref": "#/definitions/Input"
        },
        "output": {
          "$ref": "#/definitions/Output"
        }
      },
      "title": "Result"
    }
  },
  "x-amazon-apigateway-request-validators": {
    "Validate body": {
      "validateRequestParameters": false,
      "validateRequestBody": true
    },
    "Validate query string parameters and headers": {
      "validateRequestParameters": true,
      "validateRequestBody": false
    }
  }
}
```

------