Tutorial: Bangun API CRUD dengan Lambda dan DynamoDB - Amazon API Gateway

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

Tutorial: Bangun API CRUD dengan Lambda dan DynamoDB

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.

Pertama, Anda membuat tabel DynamoDB menggunakan konsol DynamoDB. Kemudian Anda membuat fungsi Lambda 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.

Untuk menyelesaikan latihan ini, Anda memerlukan AWS akun dan AWS Identity and Access Management pengguna dengan akses konsol. Untuk informasi selengkapnya, lihat Prasyarat untuk memulai dengan API Gateway.

Dalam tutorial ini, Anda menggunakan AWS Management Console. Untuk AWS SAM template yang membuat API ini dan semua sumber daya terkait, lihat template.yaml.

Langkah 1: Buat tabel DynamoDB

Anda menggunakan tabel DynamoDB untuk menyimpan data untuk API Anda.

Setiap item memiliki ID unik, yang kita gunakan sebagai kunci partisi untuk tabel.

Untuk membuat tabel DynamoDB
  1. Buka konsol DynamoDB di https://console.aws.amazon.com/dynamodb/.

  2. Pilih Buat tabel.

  3. Untuk Nama tabel, masukkan http-crud-tutorial-items.

  4. Untuk kunci Partisi, masukkanid.

  5. Pilih Buat tabel.

Langkah 2: Buat fungsi Lambda

Anda membuat fungsi Lambda untuk backend API Anda. Fungsi Lambda ini membuat, membaca, memperbarui, dan menghapus item dari DynamoDB. Fungsi ini menggunakan peristiwa dari API Gateway 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 membuat fungsi Lambda
  1. Masuk ke konsol Lambda di https://console.aws.amazon.com/lambda.

  2. Pilih Buat fungsi.

  3. Untuk Nama fungsi, masukkan http-crud-tutorial-function.

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

  5. Di bawah Izin pilih Ubah peran eksekusi default.

  6. Pilih Buat peran baru dari templat AWS kebijakan.

  7. Untuk Nama peran, masukkan http-crud-tutorial-role.

  8. Untuk templat Kebijakan, pilihSimple 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.

  9. Pilih Buat fungsi.

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

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.

  2. Pilih Buat API, lalu untuk HTTP API, pilih Build.

  3. Untuk nama API, masukkanhttp-crud-tutorial-api.

  4. Pilih Selanjutnya.

  5. Untuk Mengonfigurasi rute, pilih Berikutnya untuk melewati pembuatan rute. Anda membuat rute nanti.

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

  7. Pilih Buat.

Langkah 4: Buat rute

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.

  2. Pilih API Anda.

  3. Pilih Rute.

  4. Pilih Buat.

  5. Untuk Metode, pilihGET.

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

  7. Pilih Buat.

  8. Ulangi langkah 4-7 untukGET /items,DELETE /items/{id}, danPUT /items.

API Anda memiliki rute untukGET /items,GET /items/{id},DELETE /items/{id}, danPUT /items.

Langkah 5: Buat integrasi

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.

  2. Pilih API Anda.

  3. Pilih Integrasi.

  4. Pilih Kelola integrasi dan kemudian pilih Buat.

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

  6. Untuk jenis Integrasi, pilih fungsi Lambda.

  7. Untuk fungsi Lambda, masukkan. http-crud-tutorial-function

  8. Pilih Buat.

Langkah 6: Lampirkan integrasi Anda ke rute

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.

  2. Pilih API Anda.

  3. Pilih Integrasi.

  4. Pilih rute.

  5. Di bawah Pilih integrasi yang ada, pilihhttp-crud-tutorial-function.

  6. Pilih Lampirkan integrasi.

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

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

Langkah 7: Uji API Anda

Untuk memastikan bahwa API Anda berfungsi, Anda menggunakan curl.

Untuk mendapatkan URL untuk menjalankan API Anda
  1. Masuk ke konsol API Gateway di https://console.aws.amazon.com/apigateway.

  2. Pilih API Anda.

  3. Perhatikan URL pemanggilan API Anda. Itu muncul di bawah Memanggil URL pada halaman Detail.

    Setelah Anda membuat API, konsol akan menampilkan URL pemanggilan API Anda.
  4. Salin URL pemanggilan API Anda.

    URL lengkapnya terlihat sepertihttps://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
  2. Dapatkan semua item untuk memverifikasi bahwa item telah dihapus.

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

Langkah 8: Membersihkan

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

Untuk menghapus tabel DynamoDB
  1. Buka konsol DynamoDB di https://console.aws.amazon.com/dynamodb/.

  2. Pilih meja Anda.

  3. Pilih Hapus tabel.

  4. Konfirmasikan pilihan Anda, dan pilih Hapus.

Untuk menghapus API HTTP
  1. Masuk ke konsol API Gateway di https://console.aws.amazon.com/apigateway.

  2. Pada halaman API, pilih API. Pilih Tindakan, lalu pilih Hapus.

  3. Pilih Hapus.

Untuk menghapus fungsi Lambda
  1. Masuk ke konsol Lambda di https://console.aws.amazon.com/lambda.

  2. Pada halaman Fungsi, pilih fungsi. Pilih Tindakan, lalu pilih Hapus.

  3. Pilih Hapus.

Untuk menghapus grup log fungsi Lambda
  1. Di CloudWatch konsol Amazon, buka halaman Grup log.

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

  3. Pilih Hapus.

Untuk menghapus peran eksekusi fungsi Lambda
  1. Di AWS Identity and Access Management konsol, buka halaman Peran.

  2. Pilih peran fungsi, misalnya,http-crud-tutorial-role.

  3. Pilih Hapus peran.

  4. Pilih Ya, Hapus.

Langkah selanjutnya: Otomatiskan dengan AWS SAM atau AWS CloudFormation

Anda dapat mengotomatiskan pembuatan dan pembersihan AWS sumber daya dengan menggunakan AWS CloudFormation atau. AWS SAM Untuk contoh AWS SAM template untuk tutorial ini, lihat template.yaml.

Misalnya AWS CloudFormation template, lihat contoh AWS CloudFormation template.