Tutorial Serverless: Membuat API Penghitung Kata dengan Bash

3 min read

Disclaimer
Saya bekerja di AWS, semua opini adalah dari saya pribadi. (I work for AWS, my opinions are my own.)
Tutorial Serverless: Membuat API Penghitung Kata dengan Bash
Photo by Priscilla Du Preez on Unsplash

TeknoCerdas.com – Salam cerdas untuk kita semua. Kali ini penulis akan memberikan tutorial dengan cara yang bisa dibilang anti-mainstream yaitu tutorial serverless: Membuat API Penghitung Kata dengan Bash. Fungsi API yang dibuat sederhana yaitu menghitung jumlah kata yang dikirimkan melalui HTTP POST dalam bentuk JSON.

Dalam membangun API ini akan digunakan model Serverless. Untuk itu kita akan menggunakan layanan dari AWS yaitu Lambda dan API Gateway. Keduanya sebagai platform untuk membangun API Penghitung Kata ini.

Dengan adanya custom runtime pada AWS Lambda memungkin pengembang untuk menjalankan Lambda pada bahasa pemrograman yang tidak disediakan secara default oleh AWS salah satu contohnya adalah Bash.

Response yang diinginkan dari API Penghitung Kata cukup sederhana seperti ditunjukkan oleh output berikut ini.

$ curl -X POST -d '{ "words": "satu dua tiga" }' -H "Content-Type: application/json" END_POINT_URL
{
  "lines": 1,
  "words": 3,
  "characters": 14
}

Artikel ini adalah artikel re-publish dengan beberapa modifikasi. Artikel asli dapat dilihat pada Medium Rio Astamal.

Persiapan API Penghitung Kata

Sebelum mulai membuat API Penghitung Kata menggunakan Bash terdapat beberapa prasyarat yang harus anda penuhi.

  • Memiliki akun AWS yang aktif
  • Memiliki pemahaman dasar tentang AWS Lambda
  • Memiliki pemahaman dasar tentang Bash atau Shell script

Jika anda tidak memiliki prasyarat diatas silahkan lanjutkan membaca. Karena mungkin banyak informasi baru yang diperoleh meskipun tanpa mencoba langsung tutorial ini.

Membuat Fungsi di AWS Lambda

Karena kita menggunakan Bash yang tidak didukung secara default oleh Lambda, maka kita akan gunakan custom runtime. Masuk ke console AWS Lambda dan buat sebuah fungsi baru dengan kriteria berikut.

  1. Function Name: “BashWordCounter”
  2. Runtime: “Use default bootstrap”.
  3. Execution Role: “Create a new role with basic Lambda permissions”
Membuat Fungsi di AWS Lambda
Membuat Fungsi Penghitung Kata di AWS Lambda

Langkah berikutnya adalah melakukan editing file yang diperlukan. Tapi sebelumnya mari kita ubah nama file hello.sh menjadi functions.sh agar lebih sesuai konteks.

  1. Pada daftar fungsi yang ada klik “BashWordCounter” untuk masuk ke halaman editor.
  2. Pada window Function Code klik kanan hello.sh lalu ganti menjadi functions.sh
  3. Konfigurasi dari Handler juga harus diubah dari hello.handler menjadi functions.handler.

Perubahan tersebut berarti ketika Lambda BashWordCounter dijalankan ia akan memanggil fungsi handler()didalam file functions.sh.

Ubah nama fungsi di AWS Lambda
Ubah nama fungsi hello.sh menjadi functions.sh

Menulis Kode API

Ini adalah bagian utama dari tutorial ini yaitu menulis kode API Penghitung Kata. Pada AWS Lambda code editor klik ganda file functions.sh lalu ketik kode dibawah ini.

function handler()
{
    local EVENT_DATA="$1"

    # The event.body data is still in escaped JSON string
    # So we need to parse the JSON twice
    local WORDS=$( echo "${EVENT_DATA}" | parse_json '["body"]' | parse_json '["words"]' )

    # VAR=(VAR) is syntax to convert to array
    local RESPONSE=( $(echo "$WORDS" | wc ) )

    printf '{
    "lines": %s,
    "words": %s,
    "characters": %s
}' ${RESPONSE[0]} ${RESPONSE[1]} ${RESPONSE[2]} | tr -d "[:space:]"
    return 0
}

function parse_json()
{
    # 1. Parse JSON from STDIN
    # 2. Optional - filter the value by args
    #
    # Example
    # Print all keys: echo '{"name": "Rio Astamal", "Age": 32}' | parse_json
    # Print name: echo '{"name": "Rio Astamal", "Age": 32}' | parse_json '["name"]'
    python3 -c "import sys, json; print(json.load(sys.stdin)$@)"
}

Kode diatas cukup sederhana. Untuk melakukan parsing JSON kita meminta bantuan Python dan membungkusnya dalam fungsi parse_json.

Custom runtime dari Lambda adalah turunan dari Amazon Linux sehingga beberapa aplikasi dan utilitas tersedia pada runtime ini termasuk binary Python3.

Fungsi utama API ini terletak pada fungsi handler() dimana fungsi ini akan memproses data yang dikirimkan oleh API Gateway ke Lambda untuk diteruskan ke fungsi ini.

Dalam fungsi handler() ini kita melakukan parsing JSON dua kali. Yang pertama adalah EVENT_DATA yang dikirimkan dari Lambda. Karena Lambda yang dibuat akan terintegrasi dengan API Gateway maka EVENT_DATA memiliki format kurang lebih seperti berikut.

{
    "resource": "/",
    "path": "/",
    "httpMethod": "GET",
    "requestContext": {
        "resourcePath": "/",
        ...
    },
    "headers": {
        "Host": "70ixmpl4fl.execute-api.us-east-2.amazonaws.com",
        "X-Amzn-Trace-Id": "Root=1-5e66d96f-7491f09xmpl79d18acf3d050",
        ...
    },
    "multiValueHeaders": {
        "accept-encoding": [
            "gzip, deflate, br"
        ],
        ...
    },
    ...
    "multiValueQueryStringParameters": null,
    "body": "{ \"words\": \"satu dua tiga\" }",
    "isBase64Encoded": false
}

Data JSON yang dikirim untuk API Penghitung Kata ada pada propertibody. Namun ingat isinya adalah string JSON bukan JSON jadi kita harus melakukan parse ulang. Itulah kenapa ada dua kali parse_json pada fungsi yang kita buat.

Setelah data di-extract dari JSON kemudian kita menghitung jumlah kata menggunakan utilitas wc. Selain dapat menghitung kata wc juga dapat menghitung jumlah karakter dan baris. Oleh karena itu API kita juga menyediakan data tersebut agar lebih lengkap.

PENTING: Nilai dari body adalah encoded JSON string bukan JSON.

Deploy API Menggunakan API Gateway

Setelah menyelesaikan fungsi pada Lambda langkah berikutnya adalah menghubungkan Lambda dengan API Gateway agar bisa diakses dari internet.

Untuk itu kita perlu menambahkan trigger pada Lambda yang dibuat. Pada window Designer klik tombol Add Trigger dan ikuti langkah berikut untuk menambahkan API Gateway.

  1. Pada trigger pilih “API Gateway”
  2. API: “Create an API” untuk membuat API Gateway baru
  3. API type: “HTTP API”
  4. Security: “Open”
  5. API name: “BashWordCounter-API”
  6. Deployment stage: “$default” (dengan dollar didepan)
  7. Centang “Cross-origin resource sharing (CORS)”
Menambahkan Trigger API Gateway pada AWS Lambda
Menambahkan Trigger API Gateway pada AWS Lambda

Klik tombol Add untuk membuat API Gateway. Anda dapat melihat URL API endpoint dari API Penghitung Kata pada bagian bawah halaman. Contoh pada URL pada akun saya adalah https://6f1rmsrm4i.execute-api.us-west-1.amazonaws.com/BashWordCounter.

Test API Penghitung Kata

Untuk melakukan test kita cukup menggunakan utilitas CLI seperti curlSebagai contoh kita akan coba menghitung jumlah kata untuk “membuat api menggunakan bash”. Total kata harusnya adalah empat.

$ curl -s -X POST \
> -d '{ "words": "membuat api menggunakan bash" }' \
> -H 'Content-Type: application/json' \
> https://6f1rmsrm4i.execute-api.us-west-1.amazonaws.com/BashWordCounter
{"lines":1,"words":4,"characters":29}

Dari output diatas API Penghitung Kata dengan Bash yang kita buat berhasil menghitung jumlah kata dengan benar.

Kode Sumber Tutorial

Kode sumber tutorial serverless: Membuat API Penghitung Kata dengan Bash dapat anda download atau clone dari tautan Github berikut https://github.com/rioastamal-examples/aws-lambda-word-counter-bash.

Pada kode tersebut juga terdapat Terraform script yang dapat anda gunakan untuk melakukan otomasi pembuatan infrastruktur API Penghitung Kata. Cukup lakukan beberapa perintah berikut dan infrastruktur siap digunakan.

$ bash build.sh
$ terraform init
$ terraform apply

Selamat mencoba 🙂