Dalam modul ini, Anda akan menyediakan database Amazon DynamoDB dan mempelajari cara menggunakan DynamoDB untuk menyimpan informasi tentang game berbasis giliran.

Waktu untuk Menyelesaikan Modul: 30 Menit


Amazon DynamoDB adalah database NoSQL yang dikelola sepenuhnya dan disediakan oleh AWS. Database ini memberikan waktu respons satu digit milidetik dan keterskalaan yang hampir tidak terbatas. DynamoDB digunakan oleh berbagai aplikasi dan industri, mulai dari keranjang belanja Amazon.com hingga layanan geolokasi Lyft’s hingga berbagai game online.

Semua interaksi dengan DynamoDB dilakukan melalui HTTPS dengan menggunakan AWS Identity and Access Management (IAM) untuk autentikasi dan otorisasi. Biasanya, Anda akan menggunakan AWS SDK untuk bahasa yang Anda pilih untuk berinteraksi dengan DynamoDB. Jika Anda menggunakan opsi komputasi untuk aplikasi Anda, seperti Amazon Elastic Compute Cloud (Amazon EC2) atau AWS Lambda, aplikasi Anda dapat menggunakan kredensial AWS di lingkungan komputasi ke DynamoDB.

Dalam langkah-langkah berikut, Anda akan terlebih dulu menyediakan database DynamoDB. Selanjutnya, Anda akan mempelajari cara berinteraksi dengan database DynamoDB menggunakan AWS SDK untuk JavaScript di Node.js.


  • Langkah 1. Sediakan database Amazon DynamoDB

    Pertama, mari kita sediakan database DynamoDB. Sebuah database di DynamoDB disebut juga sebagai tabel.

    Saat membuat sebuah tabel DynamoDB, Anda perlu menetapkan atribut yang akan menjadi kunci utama tabel Anda. Setiap catatan yang Anda tuliskan ke tabel DynamoDB disebut sebagai item, dan setiap item harus menyertakan kunci utama tabel Anda.

    Pemodelan data DynamoDB dan desain kunci utama adalah topik penting. Namun, game Anda memiliki sebuah pola akses sederhana yang tidak memerlukan pemodelan data lanjutan, jadi tutorial ini tidak akan membahas topik lanjutan dalam pemodelan data DynamoDB. Untuk detail tambahan mengenai pemodelan data di DynamoDB, Anda dapat membaca tutorialnya di Merancang database untuk aplikasi mobile dengan Amazon DynamoDB atau Membuat Model Aplikasi Game dengan Amazon DynamoDB.

    Anda dapat menggunakan DynamoDB sebagai penyimpanan nilai kunci sederhana dalam aplikasi Anda. Setiap game memiliki atribut gameId yang secara unik mengidentifikasi setiap game. Atribut gameId digunakan sebagai kunci utama untuk tabel Anda.

    Dalam direktori scripts/, terdapat file yang disebut create-table.sh yang membuat tabel DynamoDB Anda menggunakan AWS Command Line Interface (AWS CLI). Konten file tersebut adalah sebagai berikut:
     

    aws dynamodb create-table \
      --table-name turn-based-game \
      --attribute-definitions '[
        {
          "AttributeName": "gameId",
          "AttributeType": "S"
        }
      ]' \
      --key-schema '[
        {
          "AttributeName": "gameId",
          "KeyType": "HASH"
        }
      ]' \
      --provisioned-throughput '{
        "ReadCapacityUnits": 5,
        "WriteCapacityUnits": 5
      }'

    Pertama, file tersebut memberi nama game berbasis giliran untuk tabel. Kemudian, file menyatakan atribut yang dapat digunakan dalam kunci utama tabel tersebut. Anda menggunakan kunci utama sederhana dalam contoh ini, sehingga Anda hanya menyatakan satu atribut, gameId, yang merupakan jenis data string. Berikutnya, Anda akan menetapkan skema kunci utama dengan menyatakan bahwa atribut gameId digunakan sebagai kunci hash tabel.

    Terakhir, Anda akan menetapkan jumlah unit kapasitas baca dan tulis yang Anda inginkan untuk tabel Anda. DynamoDB memiliki mode harga sesuai permintaan yang memungkinkan Anda membayar untuk setiap permintaan baca dan tulis untuk tabel. Namun, mode throughput yang disediakan pas dalam Tingkat Gratis AWS, sehingga Anda dapat menggunakannya di sini.

    Buat tabel Anda dengan menjalankan perintah berikut di terminal Anda.

    bash scripts/create-table.sh

    Anda akan melihat output berikut di terminal Anda:

    {
        "TableDescription": {
            "AttributeDefinitions": [
                {
                    "AttributeName": "gameId",
                    "AttributeType": "S"
                }
            ],
            "TableName": "turn-based-game",
            "KeySchema": [
                {
                    "AttributeName": "gameId",
                    "KeyType": "HASH"
                }
            ],
            "TableStatus": "CREATING",
            "CreationDateTime": 1574086642.07,
            "ProvisionedThroughput": {
                "NumberOfDecreasesToday": 0,
                "ReadCapacityUnits": 5,
                "WriteCapacityUnits": 5
            },
            "TableSizeBytes": 0,
            "ItemCount": 0,
            "TableArn": "arn:aws:dynamodb:us-east-1:955617200811:table/turn-based-game",
            "TableId": "c62cb86a-211e-4a50-a160-4a616c8f3445"
        }
    }
  • Langkah 2. Simpan game contoh di tabel Anda

    Sekarang setelah Anda membuat tabel, Anda dapat menambahkan item ke tabel Anda. Setiap game diwakili dengan satu item dalam tabel.

    Skema dari setiap item game adalah sebagai berikut:

    Setiap game meliputi GameId, yang merupakan pengidentifikasi unik untuk game. Atribut User1 dan User2 menyimpan nama pengguna dari dua pengguna yang sedang bermain game. Atribut Heap1, Heap2, dan Heap3 menyimpan jumlah objek dalam masing-masing dari tiga tumpukan. Terakhir, atribut LastMoveBy yang menunjukkan pemain yang membuat gerakan paling akhir.

    Dalam direktori scripts/, terdapat file createGame.js yang akan menambahkan game contoh ke tabel Anda. Konten file tersebut adalah sebagai berikut:

    const AWS = require('aws-sdk')
    const documentClient = new AWS.DynamoDB.DocumentClient()
    
    const params = {
      TableName: 'turn-based-game',
      Item: {
        gameId: '5b5ee7d8',
        user1: 'myfirstuser',
        user2: 'theseconduser',
        heap1: 5,
        heap2: 4,
        heap3: 5,
        lastMoveBy: 'myfirstuser'
      }
    }
    
    documentClient.put(params).promise()
      .then(() => console.log('Game added successfully!'))
      .catch((error) => console.log('Error adding game', error))

    Anda mengimpor AWS SDK kemudian membuat sebuah instans DynamoDB Document Client. Document Client adalah sebuah abstraksi dengan tingkat lebih tinggi daripada DynamoDB API tingkat rendah, dan memudahkan untuk bekerja dengan berbagai item DynamoDB. Setelah membuat klien, skrip akan mengumpulkan berbagai parameter untuk panggilan PutItem API, yang meliputi nama tabel dan atribut pada item. Kemudian skrip akan memanggil metode put() pada Document Client dan mengeluarkan informasi mengenai keberhasilan maupun kegagalan.

    Anda dapat menjalankan skrip untuk menyisipkan game ke dalam tabel dengan menjalankan perintah berikut dalam terminal Anda:

    node scripts/createGame.js

    Anda akan melihat output berikut di terminal Anda:

    Game added successfully!

    Catatan: Jika Anda terlalu cepat menjalankan perintah, Anda dapat mendapatkan kesalahan bahwa tabel belum tersedia. Tunggu satu menit, kemudian coba kembali perintahnya.

    Bagus! Kini Anda telah menambahkan satu game ke tabel. Dalam langkah berikutnya, Anda akan mempelajari cara memperbarui item game untuk menyimulasikan pengguna yang membuat gerakan.

  • Langkah 3. Perbarui item game dalam tabel Anda

    Kini setelah Anda memiliki item game dalam tabel, Anda dapat mempelajari cara menyimulasikan pemain yang membuat gerakan untuk game yang sedang berlangsung.

    Terdapat dua cara untuk Anda menangani operasi ini. Dalam cara pertama, Anda akan menarik item menggunakan GetItem API. Kemudian, Anda akan memperbarui item game dalam aplikasi berdasarkan gerakan yang dibuat oleh pemain. Terakhir, Anda mengganti item yang ada dalam DynamoDB menggunakan PutItem API. Walaupun dapat berjalan, opsi ini memerlukan beberapa permintaan ke tabel DynamoDB Anda dan memiliki risiko menyimpan setiap perubahan yang terjadi antara fetching dan menulis ulang item game.

    Cara kedua untuk menangani operasi ini adalah dengan menggunakan panggilan UpdateItem API di DynamoDB. Dengan UpdateItem API, Anda dapat memperbarui item DynamoDB yang ada melalui satu permintaan. Anda menetapkan item yang ingin diubah, atribut yang ingin diubah, dan kondisi yang ingin dinyatakan pada item. Ini adalah cara yang lebih disukai untuk mengubah item karena tidak memerlukan beberapa panggilan ke database.

    Dalam direktori scripts/, terdapat sebuah file yang disebut performMove.js dan memiliki konten berikut:

    const AWS = require('aws-sdk')
    const documentClient = new AWS.DynamoDB.DocumentClient()
    
    const performMove = async ({ gameId, user, changedHeap, changedHeapValue }) => {
      if (changedHeapValue < 0 ) {
        throw new Error('Cannot set heap value below 0')
      }
      const params = {
        TableName: 'turn-based-game',
        Key: { 
          gameId: gameId
        },
        UpdateExpression: `SET lastMoveBy = :user, ${changedHeap} = :changedHeapValue`,
        ConditionExpression: `(user1 = :user OR user2 = :user) AND lastMoveBy <> :user AND ${changedHeap} > :changedHeapValue`,
        ExpressionAttributeValues: {
          ':user': user,
          ':changedHeapValue': changedHeapValue,
        },
        ReturnValues: 'ALL_NEW'
      }
      try {
        const resp = await documentClient.update(params).promise()
        console.log('Updated game: ', resp.Attributes)
      } catch (error) {
        console.log('Error updating item: ', error.message)
      }
    }
    
    performMove({ gameId: '5b5ee7d8', user: 'theseconduser', changedHeap: 'heap1', changedHeapValue: 3 })

    Skrip ini sedikit rumit, jadi mari kita lakukan langkah demi langkah.

    Seperti skrip sebelumnya, Anda akan mengimpor AWS SDK dan membuat instans DynamoDB Document Client.

    Kemudian, Anda menentukan sebuah metode yang disebut performMove. Metode ini mirip dengan metode internal yang akan digunakan dalam aplikasi Anda saat pengguna meminta membuat sebuah gerakan. Skrip ini akan mengumpulkan berbagai parameter untuk panggilan UpdateItem API. Pertama, skrip akan mengubah dua atribut pada game -- pengguna terakhir yang akan membuat gerakan, dan jumlah elemen dalam tumpukan yang berubah.

    Parameter UpdateItem API kemudian membuat sejumlah penegasan mengenai status game saat ini. ConditionExpression dievaluasi sebelum item diperbarui untuk mengonfirmasi bahwa item dalam status yang Anda inginkan. Anda membuat tiga penegasan berikut dalam ekspresi kondisi Anda:

    1. Bahwa pengguna yang meminta menjalankan gerakan adalah satu dari dua pengguna dalam game;
    2. Bahwa giliran saat ini milik pengguna yang meminta menjalankan gerakan;
    3. Bahwa tumpukan yang sedang diubah memiliki nilai saat ini yang lebih tinggi daripada nilai yang diubah.

    Terakhir, parameter menyatakan ReturnValue dari ALL_NEW, yang berarti bahwa DynamoDB mengembalikan seluruh item setelah nilainya telah diperbarui. Setelah Anda mendapatkannya, aplikasi Anda dapat mengevaluasi game untuk melihat apakah ada pemenang.

    Pada bagian bawah file terdapat contoh bagaimana metode ini dipanggil dalam aplikasi Anda. Anda dapat menjalankan skrip dengan perintah berikut di:

    node scripts/performMove.js

    Anda akan melihat output berikut di terminal Anda:

    Updated game:  { heap2: 4,
      heap1: 3,
      heap3: 5,
      gameId: '5b5ee7d8',
      user2: 'theseconduser',
      user1: 'myfirstuser',
      lastMoveBy: 'theseconduser' }

    Anda dapat melihat bahwa penulisan berhasil dan game telah diperbarui.

    Coba jalankan kembali skrip tersebut di terminal Anda. Anda akan melihat output berikut:

    Error updating item:  The conditional request failed

    Permintaan kondisional Anda kali ini gagal. Pengguna yang meminta -- theseconduser -- adalah pemain terakhir yang bergerak. Lebih lanjut, tumpukan yang berubah -- heap1 -- telah memiliki nilai 3, yang berarti pengguna tidak mengubah apa pun. Karena itu, permintaan tersebut ditolak.


Dalam modul ini, Anda telah menyediakan database Amazon DynamoDB untuk menyimpan data game Anda. Anda telah mempelajari berbagai kunci utama pada DynamoDB dalam membuat model data Anda. Setelah membuat tabel, Anda mempelajari cara menyisipkan item ke dalam tabel untuk menyimpan status game awal. Terakhir, Anda telah melihat cara memperbarui item dalam data untuk menghindari membuat beberapa permintaan ke DynamoDB dalam satu permintaan.

Dalam modul berikutnya, Anda akan mempelajari tentang menggunakan Amazon Simple Notification Service (Amazon SNS) untuk mengirim pesan SMS untuk memberi tahu pengguna mengenai kejadian penting dalam game mereka.