Рубрики
Uncategorized

Как создать таблицу DynamoDB в AWS с помощью Pulumi и Golang

В предыдущих постах я посмотрел на Пулуми, чтобы делать всевозможные вещи с инфраструктурой. Большинство приложений, я … с меткой Go, DevOps.

В предыдущий Сообщения , Я посмотрел на Pulumi делать всевозможные вещи с инфраструктурой. Большинству приложений, тем не менее, понадобится какая -то форма данных, поэтому в этом посте я проведу шаги, чтобы создать таблицу DynamoDB в AWS с помощью Pulumi.

Полный проект доступен на GitHub .

Статические типы

Одним из основных преимуществ программирования, таких как Golang и Java, является то, что эти языки имеют статические типы, которые делают разработку менее подверженным ошибкам. Поскольку разработчики пишут код, они знают, каким будет вход и вывод методов. К сожалению, GO SDK для Pulumi еще не предлагает статические типы для ресурсов AWS. У фрагмента кода ниже есть два типа ( Dynamoattribute и Globalsecondaryindex ), которые представляют статические типы конструкций DynamoDB.

// DynamoAttribute represents an attribute for describing the key schema for the table and indexes.
type DynamoAttribute struct {
    Name string
    Type string
}

// DynamoAttributes is an array of DynamoAttribute
type DynamoAttributes []DynamoAttribute

// GlobalSecondaryIndex represents the properties of a global secondary index
type GlobalSecondaryIndex struct {
    Name string
    HashKey string
    ProjectionType string
    WriteCapacity int
    ReadCapacity int
}

// GlobalSecondaryIndexes is an array of GlobalSecondaryIndex
type GlobalSecondaryIndexes []GlobalSecondaryIndex

Ввод для создания таблицы DynamoDB, TableArgs , ожидает Интерфейс {} Для этих двух полей и базовой инфраструктуры ожидают, что интерфейс {} будет A список (или кусок интерфейсов, чтобы использовать правильную терминологию GO). Чтобы сделать это преобразование типа, вы можете использовать приведенные ниже два Толист () Методы для типов выше.

// ToList takes a DynamoAttributes object and turns that into a slice of map[string]interface{} so it can be correctly passed to the Pulumi runtime
func (d DynamoAttributes) ToList() []map[string]interface{} {
    array := make([]map[string]interface{}, len(d))
    for idx, attr := range d {
        m := make(map[string]interface{})
        m["name"] = attr.Name
        m["type"] = attr.Type
        array[idx] = m
    }
    return array
}

// ToList takes a GlobalSecondaryIndexes object and turns that into a slice of map[string]interface{} so it can be correctly passed to the Pulumi runtime
func (g GlobalSecondaryIndexes) ToList() []map[string]interface{} {
    array := make([]map[string]interface{}, len(g))
    for idx, attr := range g {
        m := make(map[string]interface{})
        m["name"] = attr.Name
        m["hash_key"] = attr.HashKey
        m["projection_type"] = attr.ProjectionType
        m["write_capacity"] = attr.WriteCapacity
        m["read_capacity"] = attr.ReadCapacity
        array[idx] = m
    }
    return array
}

Два вышеуказанных метода облегчают использование статических типизированных объектов в вашем коде, в то же время имея возможность использовать время выполнения Pulumi для создания ваших таблиц DynamoDB.

Построение стола

Следующий шаг — объединить все это и создать таблицу. В этом примере я использовал таблицу с именами пользователей и уникальных идентификаторов, которые я использую в одном из моих приложений, чтобы отслеживать данные заказа. Поскольку реальные данные заказа здесь не смоделированы, вы не сможете использовать их в своих запросах.

// Create the attributes for ID and User
dynamoAttributes := DynamoAttributes{
    DynamoAttribute{
        Name: "ID",
        Type: "S",
    },
    DynamoAttribute{
        Name: "User",
        Type: "S",
    },
}

// Create a Global Secondary Index for the user field
gsi := GlobalSecondaryIndexes{
    GlobalSecondaryIndex{
        Name: "User",
        HashKey: "User",
        ProjectionType: "ALL",
        WriteCapacity: 10,
        ReadCapacity: 10,
    },
}

// Create a TableArgs struct that contains all the data
tableArgs := &dynamodb.TableArgs{
    Attributes: dynamoAttributes.ToList(),
    HashKey: "ID",
    WriteCapacity: 10,
    ReadCapacity: 10,
    GlobalSecondaryIndexes: gsi.ToList(),
}

// Let the Pulumi runtime create the table
userTable, err := dynamodb.NewTable(ctx, "User", tableArgs)
if err != nil {
    return err
}

// Export the name of the newly created table as an output in the stack
ctx.Export("TableName", userTable.ID())

Полный код

Объединение всего вышеперечисленного в одну, запущенную программу GO

package main

import (
    "github.com/pulumi/pulumi-aws/sdk/go/aws/dynamodb"
    "github.com/pulumi/pulumi/sdk/go/pulumi"
)

// DynamoAttribute represents an attribute for describing the key schema for the table and indexes.
type DynamoAttribute struct {
    Name string
    Type string
}

// DynamoAttributes is an array of DynamoAttribute
type DynamoAttributes []DynamoAttribute

// ToList takes a DynamoAttributes object and turns that into a slice of map[string]interface{} so it can be correctly passed to the Pulumi runtime
func (d DynamoAttributes) ToList() []map[string]interface{} {
    array := make([]map[string]interface{}, len(d))
    for idx, attr := range d {
        m := make(map[string]interface{})
        m["name"] = attr.Name
        m["type"] = attr.Type
        array[idx] = m
    }
    return array
}

// GlobalSecondaryIndex represents the properties of a global secondary index
type GlobalSecondaryIndex struct {
    Name string
    HashKey string
    ProjectionType string
    WriteCapacity int
    ReadCapacity int
}

// GlobalSecondaryIndexes is an array of GlobalSecondaryIndex
type GlobalSecondaryIndexes []GlobalSecondaryIndex

// ToList takes a GlobalSecondaryIndexes object and turns that into a slice of map[string]interface{} so it can be correctly passed to the Pulumi runtime
func (g GlobalSecondaryIndexes) ToList() []map[string]interface{} {
    array := make([]map[string]interface{}, len(g))
    for idx, attr := range g {
        m := make(map[string]interface{})
        m["name"] = attr.Name
        m["hash_key"] = attr.HashKey
        m["projection_type"] = attr.ProjectionType
        m["write_capacity"] = attr.WriteCapacity
        m["read_capacity"] = attr.ReadCapacity
        array[idx] = m
    }
    return array
}

func main() {
    pulumi.Run(func(ctx *pulumi.Context) error {
        // Create the attributes for ID and User
        dynamoAttributes := DynamoAttributes{
            DynamoAttribute{
                Name: "ID",
                Type: "S",
            },
            DynamoAttribute{
                Name: "User",
                Type: "S",
            },
        }

        // Create a Global Secondary Index for the user field
        gsi := GlobalSecondaryIndexes{
            GlobalSecondaryIndex{
                Name: "User",
                HashKey: "User",
                ProjectionType: "ALL",
                WriteCapacity: 10,
                ReadCapacity: 10,
            },
        }

        // Create a TableArgs struct that contains all the data
        tableArgs := &dynamodb.TableArgs{
            Attributes: dynamoAttributes.ToList(),
            HashKey: "ID",
            WriteCapacity: 10,
            ReadCapacity: 10,
            GlobalSecondaryIndexes: gsi.ToList(),
        }

        // Let the Pulumi runtime create the table
        userTable, err := dynamodb.NewTable(ctx, "User", tableArgs)
        if err != nil {
            return err
        }

        // Export the name of the newly created table as an output in the stack
        ctx.Export("TableName", userTable.ID())
    })
}

Пулуми вверх

Последний шаг — добавить все это в новый проект Pulumi и запустить Pulumi Up командование Чтобы создать новый проект на основе Go, вы можете запустить команду

pulumi new go \
--name builder \
--description "An awesome Pulumi infrastructure-as-code Stack" \
--stack retgits/builderstack

Теперь вы можете заменить код из файла GO с помощью кода выше и запустить Pulumi Up Анкет Чтобы получить немного более подробную информацию о создании нового проекта Pulumi, ознакомьтесь с одним из моих предыдущий посты

Оригинал: «https://dev.to/retgits/how-to-create-a-dynamodb-table-in-aws-using-pulumi-and-golang-4308»