Memulai dengan AWS

Membangun Aplikasi Web Nirserver

dengan AWS Lambda, Amazon API Gateway, AWS Amplify, Amazon DynamoDB, dan Amazon Cognito

Modul 3: Backend Layanan Nirserver

Anda akan menggunakan AWS Lambda dan Amazon DynamoDB untuk membangun proses backend untuk menangani permintaan aplikasi web Anda.

Gambaran Umum

Dalam modul ini, Anda akan menggunakan AWS Lambda dan Amazon DynamoDB untuk membangun proses backend guna menangani permintaan untuk aplikasi web Anda. Aplikasi peramban yang Anda deploy dalam modul pertama memungkinkan pengguna untuk meminta unicorn dikirim ke lokasi pilihan mereka. Untuk memenuhi permintaan tersebut, JavaScript yang berjalan di peramban harus meminta layanan yang berjalan di cloud.

Gambaran umum arsitektur

Gambaran Umum Arsitektur

Anda akan mengimplementasikan fungsi Lambda yang akan diinvokasi setiap saat pengguna meminta unicorn. Fungsi ini akan memilih unicorn dari armada, mencatat permintaan dalam tabel DynamoDB, dan kemudian menanggapi aplikasi frontend dengan perincian tentang unicorn yang dikirim.

Fungsi ini diinvokasi dari peramban menggunakan Amazon API Gateway. Anda akan mengimplementasikan koneksi itu di modul berikutnya. Untuk modul ini, Anda hanya akan menguji fungsi dalam isolasi.

 Waktu penyelesaian

30 menit

 Layanan yang digunakan

Implementasi

  • Gunakan konsol Amazon DynamoDB untuk membuat tabel DynamoDB baru. 

    1. Di konsol Amazon DynamoDB, pilih Buat tabel.
    2. Masukkan Rides untuk Nama tabel. Bidang ini peka huruf besar/kecil.
    3. Masukkan RideId untuk Kunci partisi dan pilih String untuk tipe kunci. Bidang ini peka huruf besar/kecil.
    4. Di bagian Pengaturan tabel, pastikan Pengaturan default dipilih, dan pilih Buat tabel
    5. Pada halaman Tabel, tunggu pembuatan tabel Anda selesai. Setelah selesai, status akan menyatakan Aktif. Pilih nama tabel Anda.
    6. Di tab Gambaran umum > bagian Informasi Umum pada tabel baru Anda, pilih Info tambahan. Salin ARN. Anda akan menggunakan ini di bagian berikutnya.
  • Setiap fungsi Lambda memiliki peran IAM yang terkait. Peran ini menetapkan apa layanan AWS lainnya yang diizinkan berinteraksi dengan fungsi ini. Untuk keperluan tutorial ini, Anda harus membuat peran IAM yang memberi fungsi Lambda izin untuk menulis log ke Log Amazon CloudWatch dan akses untuk menulis item ke tabel DynamoDB Anda.

    1. Di konsol IAM, pilih Peran di panel navigasi kiri lalu pilih Buat Peran.
    2. Di bagian Tipe Entitas Tepercaya, pilih Layanan AWS. Untuk Kasus penggunaan, pilih Lambda, lalu pilih Berikutnya
      Catatan: Pemilihan tipe peran secara otomatis membuat kebijakan kepercayaan untuk peran Anda yang memungkinkan layanan AWS mengambil peran ini atas nama Anda. Jika Anda membuat peran ini menggunakan CLI, AWS CloudFormation, atau mekanisme lain, tentukan kebijakan kepercayaan secara langsung.
    3. Masukkan AWSLambdaBasicExecutionRole di kotak teks filter dan tekan Enter
    4. Pilih kotak centang di sebelah nama kebijakan AWSLambdaBasicExecutionRole dan pilih Berikutnya.
    5. Masukkan WildRydesLambda untuk Nama Peran. Pertahankan pengaturan default untuk parameter lainnya.
    6. Pilih Buat Peran.
    7. Di kotak filter pada halaman Peran, ketik WildRydesLambda dan pilih nama peran yang baru saja Anda buat.
    8. Di tab Izin, pada Tambah izin, pilih Buat Kebijakan Inline.
    9. Di bagian Pilih layanan, ketik DynamoDB ke dalam bilah pencarian, dan pilih DynamoDB ketika muncul.
    10. Pilih Pilih tindakan.
    11. Di bagian Tindakan yang diizinkan, ketik PutItem ke bilah pencarian dan pilih kotak centang di sebelah PutItem ketika muncul.
    12. Di bagian Sumber daya, dengan opsi Spesifik dipilih, pilih tautan Tambahkan ARN.
    13. Pilih tab Teks. Tempelkan ARN dari tabel yang Anda buat di DynamoDB (Langkah 6 di bagian sebelumnya), dan pilih Tambahkan ARN.
    14. Pilih Berikutnya.
    15. Masukkan DynamoDBWriteAccess untuk nama kebijakan dan pilih Buat kebijakan.
  • AWS Lambda akan menjalankan kode Anda untuk merespons peristiwa seperti permintaan HTTP. Pada langkah ini Anda akan membangun fungsi inti yang akan memproses permintaan API dari aplikasi web untuk mengirim unicorn. Pada modul berikutnya Anda akan menggunakan Amazon API Gateway untuk membuat API RESTful yang akan memaparkan titik akhir HTTP yang dapat dipanggil dari browser pengguna Anda. Anda kemudian akan menghubungkan fungsi Lambda yang Anda buat pada langkah ini ke API tersebut untuk membuat backend yang berfungsi penuh untuk aplikasi web Anda.

    Gunakan konsol AWS Lambda untuk membuat fungsi Lambda baru yang disebut RequestUnicorn yang akan memproses permintaan API. Gunakan implementasi contoh requestUnicorn.js berikut yang disediakan untuk kode fungsi Anda. Cukup salin dan tempelkan dari file tersebut ke dalam editor konsol AWS Lambda.

    Pastikan untuk mengonfigurasikan fungsi Anda untuk menggunakan peran IAM WildRydesLambda yang Anda buat di bagian sebelumnya.

    1. Di konsol AWS Lambda, pilih Buat fungsi.
    2. Tetap pilih kartu Penulis dari awal default.
    3. Masukkan RequestUnicorn di bidang Nama fungsi.
    4. Pilih Node.js 16.x untuk Runtime (versi Node.js yang lebih baru tidak akan berfungsi dalam tutorial ini).
    5. Pilih Gunakan peran yang ada dari menu tarik-turun Ubah peran eksekusi default.
    6. Pilih WildRydesLambda dari menu tarik-turun Peran yang Ada.
    7. Klik Buat fungsi.
    8. Gulir ke bawah ke bagian Kode sumber dan ganti kode yang ada di editor kode index.js dengan konten requestUnicorn.js. Blok kode berikut menampilkan file requestUnicorn.js. Salin dan tempel kode ini ke tab index.js dari editor kode.
    const randomBytes = require('crypto').randomBytes;
    const AWS = require('aws-sdk');
    const ddb = new AWS.DynamoDB.DocumentClient();
    
    const fleet = [
        {
            Name: 'Angel',
            Color: 'White',
            Gender: 'Female',
        },
        {
            Name: 'Gil',
            Color: 'White',
            Gender: 'Male',
        },
        {
            Name: 'Rocinante',
            Color: 'Yellow',
            Gender: 'Female',
        },
    ];
    
    exports.handler = (event, context, callback) => {
        if (!event.requestContext.authorizer) {
          errorResponse('Authorization not configured', context.awsRequestId, callback);
          return;
        }
    
        const rideId = toUrlString(randomBytes(16));
        console.log('Received event (', rideId, '): ', event);
    
        // Because we're using a Cognito User Pools authorizer, all of the claims
        // included in the authentication token are provided in the request context.
        // This includes the username as well as other attributes.
        const username = event.requestContext.authorizer.claims['cognito:username'];
    
        // The body field of the event in a proxy integration is a raw string.
        // In order to extract meaningful values, we need to first parse this string
        // into an object. A more robust implementation might inspect the Content-Type
        // header first and use a different parsing strategy based on that value.
        const requestBody = JSON.parse(event.body);
    
        const pickupLocation = requestBody.PickupLocation;
    
        const unicorn = findUnicorn(pickupLocation);
    
        recordRide(rideId, username, unicorn).then(() => {
            // You can use the callback function to provide a return value from your Node.js
            // Lambda functions. The first parameter is used for failed invocations. The
            // second parameter specifies the result data of the invocation.
    
            // Because this Lambda function is called by an API Gateway proxy integration
            // the result object must use the following structure.
            callback(null, {
                statusCode: 201,
                body: JSON.stringify({
                    RideId: rideId,
                    Unicorn: unicorn,
                    Eta: '30 seconds',
                    Rider: username,
                }),
                headers: {
                    'Access-Control-Allow-Origin': '*',
                },
            });
        }).catch((err) => {
            console.error(err);
    
            // If there is an error during processing, catch it and return
            // from the Lambda function successfully. Specify a 500 HTTP status
            // code and provide an error message in the body. This will provide a
            // more meaningful error response to the end client.
            errorResponse(err.message, context.awsRequestId, callback)
        });
    };
    
    // This is where you would implement logic to find the optimal unicorn for
    // this ride (possibly invoking another Lambda function as a microservice.)
    // For simplicity, we'll just pick a unicorn at random.
    function findUnicorn(pickupLocation) {
        console.log('Finding unicorn for ', pickupLocation.Latitude, ', ', pickupLocation.Longitude);
        return fleet[Math.floor(Math.random() * fleet.length)];
    }
    
    function recordRide(rideId, username, unicorn) {
        return ddb.put({
            TableName: 'Rides',
            Item: {
                RideId: rideId,
                User: username,
                Unicorn: unicorn,
                RequestTime: new Date().toISOString(),
            },
        }).promise();
    }
    
    function toUrlString(buffer) {
        return buffer.toString('base64')
            .replace(/\+/g, '-')
            .replace(/\//g, '_')
            .replace(/=/g, '');
    }
    
    function errorResponse(errorMessage, awsRequestId, callback) {
      callback(null, {
        statusCode: 500,
        body: JSON.stringify({
          Error: errorMessage,
          Reference: awsRequestId,
        }),
        headers: {
          'Access-Control-Allow-Origin': '*',
        },
      });
    }

        9. Pilih Deploy.

  • Untuk modul ini, Anda akan menguji fungsi yang Anda bangun menggunakan konsol AWS Lambda. Pada modul berikutnya, Anda akan menambahkan REST API dengan Gateway API sehingga Anda dapat menginvokasi fungsi dari aplikasi berbasis peramban yang Anda deploy di modul pertama.

    1. Dalam fungsi RequestUnicorn yang Anda bangun di bagian sebelumnya, pilih Pengujian di bagian Sumber kode, dan pilih Konfigurasikan peristiwa pengujian dari menu tarik-turun.
    2. Pertahankan pilihan default Buat peristiwa baru.
    3. Masukkan TestRequestEvent di bidang Nama peristiwa.
    4. Salin dan tempelkan peristiwa pengujian berikut ke dalam bagian JSON Peristiwa:
    {
        "path": "/ride",
        "httpMethod": "POST",
        "headers": {
            "Accept": "*/*",
            "Authorization": "eyJraWQiOiJLTzRVMWZs",
            "content-type": "application/json; charset=UTF-8"
        },
        "queryStringParameters": null,
        "pathParameters": null,
        "requestContext": {
            "authorizer": {
                "claims": {
                    "cognito:username": "the_username"
                }
            }
        },
        "body": "{\"PickupLocation\":{\"Latitude\":47.6174755835663,\"Longitude\":-122.28837066650185}}"
    }

        5. Pilih Simpan.

        6. Di bagian Sumber kode fungsi Anda, pilih Pengujian dan pilih TestRequestEvent dari menu tarik-turun.

        7.  Pada tab Pengujian, pilih Pengujian.

        8. Dalam pesan Mengeksekusi fungsi: berhasil yang muncul, perluas menu tarik-turun Detail.

        9. Verifikasi bahwa hasil fungsi terlihat seperti berikut:

    {
        "statusCode": 201,
        "body": "{\"RideId\":\"SvLnijIAtg6inAFUBRT+Fg==\",\"Unicorn\":{\"Name\":\"Rocinante\",\"Color\":\"Yellow\",\"Gender\":\"Female\"},\"Eta\":\"30 seconds\"}",
        "headers": {
            "Access-Control-Allow-Origin": "*"
        }
    }

Apakah halaman ini membantu?

Men-deploy RESTful API