Paweł Łukasiewicz
2023-12-10
Paweł Łukasiewicz
2023-12-10
Udostępnij Udostępnij Kontakt
Wprowadzenie

Wszelkich operacji na tabelach DynamoDB będziemy dokonywać przy wykorzystaniu AWS SDK dla platformy .NET. W tym i w kolejnych wpisach skupimy się na tworzeniu, aktualizowaniu czy usuwaniu tabel. Będziemy również mogli wylistować tabele, które utworzyliśmy w ramach swojego konta czy uzyskać informacje dotyczące każdej z nich.

Poniżej lista wspólnych kroków niezbędnych do wykonania powyższych operacji na tabelach DynamoDB:

  • utworzenie instancji klasy AmazonDynamoDBClient;
  • podanie wymaganych i opcjonalnych parametrów przy tworzeniu obiektu żądania;
  • użycie odpowiedniej metody, np. CreateTableRequest w celu utworzeniu tabeli czy metody UpdateTableRequest w celu zaktualizowania istniejącej tabeli;
  • odpalenie metody przygotowanej w powyższych krokach.

Dodatkowo tym razem nie będziemy używać konsoli AWS - wszystkich operacji będziemy dokonywać wykorzystując język C#. Jeden z przykładów, gdzie używaliśmy manualnego tworzenia tabeli możecie znaleźć w tym wpisie: AWS Lambda - Lambda z DynamoDB

Tworzenie tabeli

W celu utworzenia tabeli należy podać nazwę, jej klucz główny oraz wartości przepustowości, tzw. provisioned read/write capacity units o których więcej możecie przeczytać w tym wpisie: DynamoDB - podstawowe pojęcia

Kroki przez które musimy przejść to odpowiednio: utworzenie instancji klasy AmazonDynamoDBClient, utworzenie instancji klasy CreateTableRequest w celu przygotowania żądania, określenie nazwy tabeli, zdefiniowanie klucza głównego oraz ustawienie wartości przepustowości. Ostatni krok to uruchomienie metody AmazonDynamoDBClient.CreateTable wraz z przekazaniem przygotowanego powyżej obiektu żądania jako parametru tej metody.

Spójrzcie na poniższy, praktyczny, przykład tworzący tabelę samochodów (CarCatalog), która używa Id jako klucza głównego. Zdefiniowaliśmy dodatkowo write oraz read capacities, tj. wartości zapisu oraz odczytu dopuszczalne dla naszej tabeli. Wartości te, jak doskonale pamiętacie z tego wpisu: AWS Lambda - CloudWatch: testowanie i metryki, będziemy analizować na bazie ruchu naszej aplikacji. Jeżeli dojdzie do potrzeby zmiany tych wartości możemy posłużyć się metodą UpdateTable dostępną w ramach intefejsu API - o tym jednak w kolejnym wpisie.

using Amazon.DynamoDBv2;
using Amazon.DynamoDBv2.Model;
using Microsoft.AspNetCore.Mvc;
using System.Collections.Generic;
using System.Text;
using System.Threading.Tasks;

namespace DynamoDbLocalUse.Controllers {
  public class DynamoDBController: Controller {
    private
    const string TableName = "CarCatalog";
    private readonly IAmazonDynamoDB _amazonDynamoDB;
    public DynamoDBController(IAmazonDynamoDB amazonDynamoDB) {
      _amazonDynamoDB = amazonDynamoDB;
    }

    public async Task<ActionResult<string>> InitializeTable() {
      // przygotowanie żądania utworzenia tabeli wraz z definicją klucza głównego
      // oraz wartości read/write capacities
      var request = new CreateTableRequest {
        TableName = TableName,
          AttributeDefinitions = new List<AttributeDefinition> () {
            new AttributeDefinition() {
              AttributeName = "Id",
                AttributeType = "N"
            }
          },
          KeySchema = new List <KeySchemaElement> () {
            new KeySchemaElement() {
              AttributeName = "Id",
                KeyType = "Hash" // Partition key / klucz partycji
            }

          },
          ProvisionedThroughput = new ProvisionedThroughput() {
            ReadCapacityUnits = 15,
              WriteCapacityUnits = 10
          }
      };

      var response = await _amazonDynamoDB.CreateTableAsync(request);
      var tableDescription = response.TableDescription;
      StringBuilder sb = new StringBuilder();
      sb.AppendLine($"{tableDescription.TableName} : {tableDescription.TableStatus}, " +
        $ "ReadCapacity: {tableDescription.ProvisionedThroughput.ReadCapacityUnits}," +
        $ "WriteCapacity: {tableDescription.ProvisionedThroughput.WriteCapacityUnits}");
      return sb.ToString();
    }
  }
}

Musimy poczekać, aż DynamoDB utworzy tabele i ustawi jej status na ACTIVE. Odpowiedź metody CreateTable zawiera właściwość TableDescription, która dostarcza niezbędnych informacji o tabeli:
DynamoDB: tworzenie tabeli

W ramach tego i kolejnych wpisów będziemy obracać się w obrębie jednego projektu. W jednym z poprzednich wpisów utworzyliśmy projekt bazowy, w tym dodałem nowy kontroler, w którym będziemy dodawać kolejne akcje. Wybaczcie, nie przywiązuje uwagi do interfejsu użytkownika – nic jednak nie stoi na przeszkodzie utworzenia czegoś w rodzaju biblioteki operacji z czytelnym UI, który pozwoli na wykonywanie różnych operacji na DynamoDB.

A sam projekt możecie pobrać z poniższej sekcji i rozwijać go wraz z kolejnymi wpisami: