

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

# Tutorial: Buat API HTTP CRUD dengan Lambda dan DynamoDB
<a name="http-api-dynamo-db"></a>

Dalam tutorial ini, Anda membuat API tanpa server yang membuat, membaca, memperbarui, dan menghapus item dari tabel DynamoDB. DynamoDB adalah layanan basis data NoSQL terkelola penuh yang memberikan performa yang cepat dan dapat diprediksi dengan skalabilitas sempurna. Tutorial ini membutuhkan waktu sekitar 30 menit untuk menyelesaikannya, dan Anda dapat melakukannya dalam [Tingkat AWS Gratis](https://aws.amazon.com/free/).

Pertama, Anda membuat tabel [DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Introduction.html) menggunakan konsol DynamoDB. Kemudian Anda membuat fungsi [Lambda](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html) menggunakan konsol. AWS Lambda Selanjutnya, Anda membuat API HTTP menggunakan konsol API Gateway. Terakhir, Anda menguji API Anda.

Saat Anda memanggil API HTTP, API Gateway merutekan permintaan ke fungsi Lambda Anda. Fungsi Lambda berinteraksi dengan DynamoDB, dan mengembalikan respons ke API Gateway. API Gateway kemudian mengembalikan respons kepada Anda.

![\[Ikhtisar HTTP API yang Anda buat dalam tutorial ini.\]](http://docs.aws.amazon.com/id_id/apigateway/latest/developerguide/images/ddb-crud.png)


Untuk menyelesaikan latihan ini, Anda memerlukan AWS akun dan AWS Identity and Access Management pengguna dengan akses konsol. Untuk informasi selengkapnya, lihat [Siapkan untuk menggunakan API Gateway](setting-up.md).

Dalam tutorial ini, Anda menggunakan Konsol Manajemen AWS. Untuk AWS SAM template yang membuat API ini dan semua sumber daya terkait, lihat [samples/http-dynamo-tutorial.zip](samples/http-dynamo-tutorial.zip).

**Topics**
+ [Langkah 1: Buat tabel DynamoDB](#http-api-dynamo-db-create-table)
+ [Langkah 2: Buat fungsi Lambda](#http-api-dynamo-db-create-function)
+ [Langkah 3: Buat API HTTP](#http-api-dynamo-db-create-api)
+ [Langkah 4: Buat rute](#http-api-dynamo-db-create-routes)
+ [Langkah 5: Buat integrasi](#http-api-dynamo-db-create-integration)
+ [Langkah 6: Lampirkan integrasi Anda ke rute](#http-api-dynamo-db-attach-integrations)
+ [Langkah 7: Uji API Anda](#http-api-dynamo-db-invoke-api)
+ [Langkah 8: Membersihkan](#http-api-dynamo-db-cleanup)
+ [Langkah selanjutnya: Otomatiskan dengan AWS SAM atau CloudFormation](#http-api-dynamo-db-next-steps)

## Langkah 1: Buat tabel DynamoDB
<a name="http-api-dynamo-db-create-table"></a>

Anda menggunakan tabel [DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Introduction.html) untuk menyimpan data untuk API Anda. 

Setiap item memiliki ID unik, yang kita gunakan sebagai [kunci partisi](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/HowItWorks.CoreComponents.html#HowItWorks.CoreComponents.PrimaryKey) untuk tabel.

**Untuk membuat tabel DynamoDB**

1. Buka konsol DynamoDB di. [https://console.aws.amazon.com/dynamodb/](https://console.aws.amazon.com/dynamodb/)

1. Pilih **Buat tabel**.

1. Untuk **Nama tabel**, masukkan **http-crud-tutorial-items**.

1. Untuk **kunci Partisi**, masukkan**id**.

1. Pilih **Buat tabel**.

## Langkah 2: Buat fungsi Lambda
<a name="http-api-dynamo-db-create-function"></a>

Anda membuat fungsi [Lambda](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html) untuk backend API Anda. Fungsi Lambda ini membuat, membaca, memperbarui, dan menghapus item dari DynamoDB. Fungsi ini menggunakan [peristiwa dari API Gateway](http-api-develop-integrations-lambda.md#http-api-develop-integrations-lambda.proxy-format) untuk menentukan cara berinteraksi dengan DynamoDB. Untuk kesederhanaan tutorial ini menggunakan fungsi Lambda tunggal. Sebagai praktik terbaik, Anda harus membuat fungsi terpisah untuk setiap rute. Untuk informasi lebih lanjut, lihat [Monolit Lambda](https://serverlessland.com/content/service/lambda/guides/aws-lambda-operator-guide/monolith).

**Untuk membuat fungsi Lambda**

1. [Masuk ke konsol Lambda di https://console.aws.amazon.com /lambda.](https://console.aws.amazon.com/lambda)

1. Pilih **Buat fungsi**.

1. Untuk **Nama fungsi**, masukkan **http-crud-tutorial-function**.

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

1. Di bawah **Izin** pilih **Ubah peran eksekusi default**.

1. Pilih **Buat peran baru dari templat AWS kebijakan**.

1. Untuk **Nama peran**, masukkan **http-crud-tutorial-role**.

1. Untuk **templat Kebijakan**, pilih**Simple microservice permissions**. Kebijakan ini memberikan izin fungsi Lambda untuk berinteraksi dengan DynamoDB.
**catatan**  
Tutorial ini menggunakan kebijakan terkelola untuk kesederhanaan. Sebagai praktik terbaik, Anda harus membuat kebijakan IAM Anda sendiri untuk memberikan izin minimum yang diperlukan.

1. Pilih **Buat fungsi**.

1. Buka fungsi Lambda di editor kode konsol, dan ganti isinya dengan kode berikut. Pilih **Deploy** untuk memperbarui fungsi Anda.

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

```
import { DynamoDBClient } from "@aws-sdk/client-dynamodb";
import {
  DynamoDBDocumentClient,
  ScanCommand,
  PutCommand,
  GetCommand,
  DeleteCommand,
} from "@aws-sdk/lib-dynamodb";

const client = new DynamoDBClient({});

const dynamo = DynamoDBDocumentClient.from(client);

const tableName = "http-crud-tutorial-items";

export const handler = async (event, context) => {
  let body;
  let statusCode = 200;
  const headers = {
    "Content-Type": "application/json",
  };

  try {
    switch (event.routeKey) {
      case "DELETE /items/{id}":
        await dynamo.send(
          new DeleteCommand({
            TableName: tableName,
            Key: {
              id: event.pathParameters.id,
            },
          })
        );
        body = `Deleted item ${event.pathParameters.id}`;
        break;
      case "GET /items/{id}":
        body = await dynamo.send(
          new GetCommand({
            TableName: tableName,
            Key: {
              id: event.pathParameters.id,
            },
          })
        );
        body = body.Item;
        break;
      case "GET /items":
        body = await dynamo.send(
          new ScanCommand({ TableName: tableName })
        );
        body = body.Items;
        break;
      case "PUT /items":
        let requestJSON = JSON.parse(event.body);
        await dynamo.send(
          new PutCommand({
            TableName: tableName,
            Item: {
              id: requestJSON.id,
              price: requestJSON.price,
              name: requestJSON.name,
            },
          })
        );
        body = `Put item ${requestJSON.id}`;
        break;
      default:
        throw new Error(`Unsupported route: "${event.routeKey}"`);
    }
  } catch (err) {
    statusCode = 400;
    body = err.message;
  } finally {
    body = JSON.stringify(body);
  }

  return {
    statusCode,
    body,
    headers,
  };
};
```

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

```
import json
import boto3
from decimal import Decimal

client = boto3.client('dynamodb')
dynamodb = boto3.resource("dynamodb")
table = dynamodb.Table('http-crud-tutorial-items')
tableName = 'http-crud-tutorial-items'


def lambda_handler(event, context):
    print(event)
    body = {}
    statusCode = 200
    headers = {
        "Content-Type": "application/json"
    }

    try:
        if event['routeKey'] == "DELETE /items/{id}":
            table.delete_item(
                Key={'id': event['pathParameters']['id']})
            body = 'Deleted item ' + event['pathParameters']['id']
        elif event['routeKey'] == "GET /items/{id}":
            body = table.get_item(
                Key={'id': event['pathParameters']['id']})
            body = body["Item"]
            responseBody = [
                {'price': float(body['price']), 'id': body['id'], 'name': body['name']}]
            body = responseBody
        elif event['routeKey'] == "GET /items":
            body = table.scan()
            body = body["Items"]
            print("ITEMS----")
            print(body)
            responseBody = []
            for items in body:
                responseItems = [
                    {'price': float(items['price']), 'id': items['id'], 'name': items['name']}]
                responseBody.append(responseItems)
            body = responseBody
        elif event['routeKey'] == "PUT /items":
            requestJSON = json.loads(event['body'])
            table.put_item(
                Item={
                    'id': requestJSON['id'],
                    'price': Decimal(str(requestJSON['price'])),
                    'name': requestJSON['name']
                })
            body = 'Put item ' + requestJSON['id']
    except KeyError:
        statusCode = 400
        body = 'Unsupported route: ' + event['routeKey']
    body = json.dumps(body)
    res = {
        "statusCode": statusCode,
        "headers": {
            "Content-Type": "application/json"
        },
        "body": body
    }
    return res
```

------

## Langkah 3: Buat API HTTP
<a name="http-api-dynamo-db-create-api"></a>

HTTP API menyediakan endpoint HTTP untuk fungsi Lambda Anda. Pada langkah ini, Anda membuat API kosong. Pada langkah-langkah berikut, Anda mengonfigurasi rute dan integrasi untuk menghubungkan API dan fungsi Lambda Anda.



**Untuk membuat API HTTP**

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

1. Pilih **Buat API**, lalu untuk **HTTP API**, pilih **Build**.

1. Untuk **nama API**, masukkan**http-crud-tutorial-api**.

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

1. Pilih **Berikutnya**.

1. Untuk **Konfigurasi rute**, pilih **Berikutnya** untuk melewati pembuatan rute. Anda membuat rute nanti.

1. Tinjau tahap yang dibuat API Gateway untuk Anda, lalu pilih **Berikutnya**.

1. Pilih **Buat**.

## Langkah 4: Buat rute
<a name="http-api-dynamo-db-create-routes"></a>

Rute adalah cara untuk mengirim permintaan API yang masuk ke sumber daya backend. Rute terdiri dari dua bagian: metode HTTP dan jalur sumber daya, misalnya,`GET /items`. Untuk contoh API ini, kita membuat empat rute:
+ `GET /items/{id}`
+ `GET /items`
+ `PUT /items`
+ `DELETE /items/{id}`

**Untuk membuat rute**

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

1. Pilih API Anda.

1. Pilih **Rute**.

1. Pilih **Buat**.

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

1. Untuk jalan, masuk**/items/\$1id\$1**. `{id}`Di akhir jalur adalah parameter jalur yang diambil API Gateway dari jalur permintaan saat klien membuat permintaan.

1. Pilih **Buat**.

1. Ulangi langkah 4-7 untuk`GET /items`,`DELETE /items/{id}`, dan`PUT /items`.

![\[API Anda memiliki rute untukGET /items,GET /items/{id},DELETE /items/{id}, danPUT /items.\]](http://docs.aws.amazon.com/id_id/apigateway/latest/developerguide/images/ddb-create-routes.png)


## Langkah 5: Buat integrasi
<a name="http-api-dynamo-db-create-integration"></a>

Anda membuat integrasi untuk menghubungkan rute ke sumber daya backend. Untuk API contoh ini, Anda membuat satu integrasi Lambda yang Anda gunakan untuk semua rute.

**Untuk membuat integrasi**

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

1. Pilih API Anda.

1. Pilih **Integrasi.**

1. Pilih **Kelola integrasi** dan kemudian pilih **Buat**.

1. Lewati **Lampirkan integrasi ini ke rute**. Anda menyelesaikannya di langkah selanjutnya.

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

1. Untuk **fungsi Lambda, masukkan**. **http-crud-tutorial-function**

1. Pilih **Buat**.

## Langkah 6: Lampirkan integrasi Anda ke rute
<a name="http-api-dynamo-db-attach-integrations"></a>

Untuk API contoh ini, Anda menggunakan integrasi Lambda yang sama untuk semua rute. Setelah Anda melampirkan integrasi ke semua rute API, fungsi Lambda Anda akan dipanggil saat klien memanggil salah satu rute Anda.



**Untuk melampirkan integrasi ke rute**

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

1. Pilih API Anda.

1. Pilih **Integrasi.**

1. Pilih rute.

1. Di bawah **Pilih integrasi yang ada**, pilih**http-crud-tutorial-function**.

1. Pilih **Lampirkan integrasi**.

1. Ulangi langkah 4-6 untuk semua rute. 

Semua rute menunjukkan bahwa AWS Lambda integrasi terlampir.

![\[Konsol ditampilkan AWS Lambda di semua rute untuk menunjukkan bahwa integrasi Anda terpasang.\]](http://docs.aws.amazon.com/id_id/apigateway/latest/developerguide/images/ddb-attach-integrations.png)


Sekarang Anda memiliki API HTTP dengan rute dan integrasi, Anda dapat menguji API Anda.

## Langkah 7: Uji API Anda
<a name="http-api-dynamo-db-invoke-api"></a>

Untuk memastikan bahwa API Anda berfungsi, Anda menggunakan [curl](https://curl.se).

**Untuk mendapatkan URL untuk menjalankan API Anda**

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

1. Pilih API Anda.

1. Perhatikan URL pemanggilan API Anda. Itu muncul di bawah **Memanggil URL** pada halaman **Detail**.  
![\[Setelah membuat API, konsol akan menampilkan URL pemanggilan API Anda.\]](http://docs.aws.amazon.com/id_id/apigateway/latest/developerguide/images/ddb-invoke-url.png)

1. Salin URL pemanggilan API Anda. 

   URL lengkapnya terlihat seperti`https://abcdef123.execute-api.us-west-2.amazonaws.com`. 

**Untuk membuat atau memperbarui item**
+ Gunakan perintah berikut untuk membuat atau memperbarui item. Perintah tersebut mencakup badan permintaan dengan ID, harga, dan nama item.

  ```
  curl -X "PUT" -H "Content-Type: application/json" -d "{\"id\": \"123\", \"price\": 12345, \"name\": \"myitem\"}" https://abcdef123.execute-api.us-west-2.amazonaws.com/items
  ```

**Untuk mendapatkan semua item**
+ Gunakan perintah berikut untuk daftar semua item.

  ```
  curl https://abcdef123.execute-api.us-west-2.amazonaws.com/items
  ```

**Untuk mendapatkan item**
+ Gunakan perintah berikut untuk mendapatkan item dengan ID-nya.

  ```
  curl https://abcdef123.execute-api.us-west-2.amazonaws.com/items/123
  ```

**Untuk menghapus item**

1. Gunakan perintah berikut untuk menghapus item.

   ```
   curl -X "DELETE" https://abcdef123.execute-api.us-west-2.amazonaws.com/items/123
   ```

1. Dapatkan semua item untuk memverifikasi bahwa item telah dihapus.

   ```
   curl https://abcdef123.execute-api.us-west-2.amazonaws.com/items
   ```

## Langkah 8: Membersihkan
<a name="http-api-dynamo-db-cleanup"></a>

Untuk mencegah biaya yang tidak perlu, hapus sumber daya yang Anda buat sebagai bagian dari latihan memulai ini. Langkah-langkah berikut menghapus API HTTP, fungsi Lambda, dan sumber daya terkait.

**Untuk menghapus tabel DynamoDB**

1. Buka konsol DynamoDB di. [https://console.aws.amazon.com/dynamodb/](https://console.aws.amazon.com/dynamodb/)

1. Pilih meja Anda.

1. Pilih **Hapus tabel**.

1. Konfirmasikan pilihan Anda, dan pilih **Hapus**.

**Untuk menghapus API HTTP**

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

1. Pada **APIs**halaman, pilih API. Pilih **Tindakan**, lalu pilih **Hapus**.

1. Pilih **Hapus**.

**Untuk menghapus fungsi Lambda**

1. [Masuk ke konsol Lambda di https://console.aws.amazon.com /lambda.](https://console.aws.amazon.com/lambda)

1. Pada halaman **Fungsi**, pilih fungsi. Pilih **Tindakan**, lalu pilih **Hapus**.

1. Pilih **Hapus**.

**Untuk menghapus grup log fungsi Lambda**

1. Di CloudWatch konsol Amazon, buka [halaman Grup log](https://console.aws.amazon.com/cloudwatch/home#logs:).

1. Pada halaman **Grup log**, pilih grup log fungsi (`/aws/lambda/http-crud-tutorial-function`). Pilih **Tindakan**, lalu pilih **Hapus grup log**.

1. Pilih **Hapus**.

**Untuk menghapus peran eksekusi fungsi Lambda**

1. Di AWS Identity and Access Management konsol, buka [halaman Peran](https://console.aws.amazon.com/iam/home?#/roles).

1. Pilih peran fungsi, misalnya,`http-crud-tutorial-role`.

1. Pilih **Hapus peran**.

1. Pilih **Ya, Hapus**.

## Langkah selanjutnya: Otomatiskan dengan AWS SAM atau CloudFormation
<a name="http-api-dynamo-db-next-steps"></a>

Anda dapat mengotomatiskan pembuatan dan pembersihan AWS sumber daya dengan menggunakan CloudFormation atau. AWS SAM Untuk contoh AWS SAM template untuk tutorial ini, lihat [samples/http-dynamo-tutorial.zip](samples/http-dynamo-tutorial.zip).

Misalnya CloudFormation template, lihat [contoh CloudFormation template](https://github.com/awsdocs/amazon-api-gateway-developer-guide/tree/main/cloudformation-templates).