В предыдущий Сообщения , Я посмотрел на 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»