AWS::DynamoDB::Table - AWS CloudFormation

AWS::DynamoDB::Table

O recurso AWS::DynamoDB::Table cria uma tabela do DynamoDB. Para obter mais informações, consulte CreateTable na Referência da API do Amazon DynamoDB.

Você deve estar ciente dos seguintes comportamentos ao trabalhar com tabelas do DynamoDB:

  • Normalmente, o AWS CloudFormation cria tabelas do DynamoDB em paralelo. No entanto, se seu modelo incluir várias tabelas com índices do DynamoDB, declare as dependências para que as tabelas sejam criadas em sequência. O Amazon DynamoDB limita o número de tabelas com índices secundários que estão no estado de criação. Se você criar várias tabelas com índices ao mesmo tempo, o DynamoDB retornará um erro e haverá falha na operação da pilha. Para obter um exemplo, consulte Tabela no DynamoDB com atributo DependsOn.

Sintaxe

Para declarar esta entidade no modelo do AWS CloudFormation, use a seguinte sintaxe:

Properties

AttributeDefinitions

Uma lista de atributos que descreve o esquema de chaves para a tabela e os índices.

Essa propriedade é necessária para criar uma tabela do DynamoDB.

Para a atualização, são necessárias: algumas interrupções. Substituição se você editar um AttributeDefinition existente.

Obrigatório: Condicional

Type: lista de AttributeDefinition

Update requires: Some interruptions

BillingMode

Especifique como você é cobrado pela taxa de transferência de leitura e gravação e como você gerencia a capacidade.

Os valores válidos são:

  • PROVISIONED - Recomendamos usar o PROVISIONED para cargas de trabalho previsíveis. O PROVISIONED define o modo de faturamento como Modo provisionado.

  • PAY_PER_REQUEST - Recomendamos usar o PAY_PER_REQUEST para cargas de trabalho imprevisíveis. O PAY_PER_REQUEST define o modo de faturamento como Modo sob demanda.

Se não especificado, o padrão será PROVISIONED.

Obrigatório: Não

Type: string

Valores permitidos: PAY_PER_REQUEST | PROVISIONED

Update requires: No interruption

GlobalSecondaryIndexes

Os índices secundários globais devem ser criados na tabela. Você pode criar até 20 índices secundários globais.

Importante

Se você atualizar uma tabela para incluir um novo índice secundário global, AWS CloudFormation iniciará a criação do índice e, depois, continuará com a atualização da pilha. O AWS CloudFormation não espera que o índice conclua a criação porque a fase de backfilling pode demorar muito tempo, dependendo do tamanho da tabela. Você não pode usar o índice ou atualizar a tabela até que o status do índice seja ACTIVE. Você pode acompanhar seu status usando o comando DescribeTable no DynamoDB.

Se você adicionar ou excluir um índice durante uma atualização, recomendamos que você não atualize nenhum outro recurso. Se a pilha falhar ao atualizar e for recuperada ao adicionar um novo índice, você deverá excluir manualmente o índice.

Não há suporte para atualizações. Veja as exceções:

  • Se atualizar apenas os valores de taxa de transferência provisionada dos índices secundários globais, você poderá atualizar a tabela sem interrupção.

  • Você pode excluir ou adicionar um índice secundário global sem interrupção. Se você fizer os dois na mesma atualização (por exemplo, alterando o ID lógico do índice), a atualização falhará.

Obrigatório: Não

Type: lista de GlobalSecondaryIndex

Update requires: No interruption

KeySchema

Especifica os atributos que compõem a chave primária da tabela. Os atributos na propriedade KeySchema também devem ser definidos na propriedade AttributeDefinitions.

Obrigatório: Sim

Type: lista de KeySchema

Update requires: Replacement

LocalSecondaryIndexes

Os índices secundários locais devem ser criados na tabela. Você pode criar até 5 índices secundários locais. Cada índice é delimitado por um determinado valor de chave de hash. O tamanho de cada chave de hash pode ser de até 10 gigabytes.

Obrigatório: Não

Type: lista de LocalSecondaryIndex

Update requires: Replacement

PointInTimeRecoverySpecification

As configurações usadas para habilitar a recuperação point-in-time.

Obrigatório: Não

Type: PointInTimeRecoverySpecification

Update requires: No interruption

ProvisionedThroughput

O throughput da tabela especificada, que consiste em valores para ReadCapacityUnits e WriteCapacityUnits. Para obter mais informações sobre o conteúdo de uma estrutura de taxa de transferência provisionada, consulte ProvisionedThroughput de tabela do Amazon DynamoDB.

Se você definir BillingMode como PROVISIONED, deverá especificar esta propriedade. Se você definir BillingMode como PAY_PER_REQUEST, não poderá especificar esta propriedade.

Obrigatório: Condicional

Type: ProvisionedThroughput

Update requires: No interruption

SSESpecification

Especifica as configurações para habilitar a criptografia no lado do servidor.

Para a atualização, são necessárias: algumas interrupções.

Obrigatório: Não

Type: SSESpecification

Update requires: No interruption

StreamSpecification

As configurações para o fluxo da tabela do DynamoDB, que capturam alterações em itens armazenados na tabela.

Obrigatório: Não

Type: StreamSpecification

Update requires: No interruption

TableName

Um nome para a tabela. Se você não especificar um nome, o AWS CloudFormation gera um ID físico exclusivo o usa como nome da tabela. Para obter mais informações, consulte Tipo de nome.

Importante

Se especificar um nome, você não poderá implementar atualizações que exijam a substituição desse recurso. Você pode realizar atualizações que não exijam interrupções. Caso você precise substituir o recurso, especifique um nome novo.

Obrigatório: Não

Type: string

Mínimo: 3

Máximo: 255

Padrão: [a-zA-Z0-9_.-]+

Update requires: Replacement

Tags

Uma matriz de pares de chave-valor a serem aplicados a este recurso.

Para obter mais informações, consulte Tag.

Obrigatório: Não

Type: lista de Tag

Update requires: No interruption

TimeToLiveSpecification

Especifica as configurações de tempo de vida (TTL) para a tabela.

nota

Para obter informações detalhadas sobre os limites no DynamoDB, consulte Limites do Amazon DynamoDB no Guia do desenvolvedor do Amazon DynamoDB.

Obrigatório: Não

Type: TimeToLiveSpecification

Update requires: No interruption

Valores de retorno

Ref.

Quando você transmite o ID lógico desse recurso para a função intrínseca Ref, Ref é retornado. o nome do recurso. Por exemplo:

{ "Ref": "MyResource" }

Para o recurso com o ID lógico myDynamoDBTable, Ref retornará o nome da tabela do DynamoDB.

For more information about using the Ref function, see Ref.

Fn::GetAtt

A função intrínseca Fn::GetAtt retorna um valor para um atributo especificado deste tipo. Estes são os atributos disponíveis e os valores de retorno de amostra.

Para obter mais informações sobre como usar a função intrínseca Fn::GetAtt, consulte Fn::GetAtt.

Arn

O nome de recurso da Amazon (ARN) da tabela do DynamoDB, por exemplo, arn:aws:dynamodb:us-east-2:123456789012:table/myDynamoDBTable.

StreamArn

O ARN do fluxo do DynamoDB, por exemplo arn:aws:dynamodb:us-east-1:123456789012:table/testddbstack-myDynamoDBTable-012A1SL7SMP5Q/stream/2015-11-30T20:10:00.000.

nota

Você deve especificar a propriedade StreamSpecification para usar esse atributo.

Exemplos

Tabela do DynamoDB com índices secundários locais e secundários

O exemplo a seguir cria uma tabela do DynamoDB com os atributos Album, Artist, Sales, NumberOfSongs. A chave primária inclui o atributo Album como a chave de hash e o atributo Artist como a chave de intervalo. A tabela também inclui dois índices globais e um secundário. Para consultar o número de vendas de um determinado artista, o índice secundário global usa o atributo Sales como a chave de hash e o atributo Artist como a chave de intervalo.

Para consultar as vendas baseadas no número de músicas, o índice secundário global usa o atributo NumberOfSongs como a chave de hash e o atributo Sales como a chave de intervalo.

Para consultar as vendas de um álbum, o índice secundário local usa a mesma chave de hash que a tabela, mas usa o atributo Sales como a chave de intervalo.

JSON

{ "AWSTemplateFormatVersion" : "2010-09-09", "Resources" : { "myDynamoDBTable" : { "Type" : "AWS::DynamoDB::Table", "Properties" : { "AttributeDefinitions" : [ { "AttributeName" : "Album", "AttributeType" : "S" }, { "AttributeName" : "Artist", "AttributeType" : "S" }, { "AttributeName" : "Sales", "AttributeType" : "N" }, { "AttributeName" : "NumberOfSongs", "AttributeType" : "N" } ], "KeySchema" : [ { "AttributeName" : "Album", "KeyType" : "HASH" }, { "AttributeName" : "Artist", "KeyType" : "RANGE" } ], "ProvisionedThroughput" : { "ReadCapacityUnits" : "5", "WriteCapacityUnits" : "5" }, "TableName" : "myTableName", "GlobalSecondaryIndexes" : [{ "IndexName" : "myGSI", "KeySchema" : [ { "AttributeName" : "Sales", "KeyType" : "HASH" }, { "AttributeName" : "Artist", "KeyType" : "RANGE" } ], "Projection" : { "NonKeyAttributes" : ["Album","NumberOfSongs"], "ProjectionType" : "INCLUDE" }, "ProvisionedThroughput" : { "ReadCapacityUnits" : "5", "WriteCapacityUnits" : "5" } }, { "IndexName" : "myGSI2", "KeySchema" : [ { "AttributeName" : "NumberOfSongs", "KeyType" : "HASH" }, { "AttributeName" : "Sales", "KeyType" : "RANGE" } ], "Projection" : { "NonKeyAttributes" : ["Album","Artist"], "ProjectionType" : "INCLUDE" }, "ProvisionedThroughput" : { "ReadCapacityUnits" : "5", "WriteCapacityUnits" : "5" } }], "LocalSecondaryIndexes" :[{ "IndexName" : "myLSI", "KeySchema" : [ { "AttributeName" : "Album", "KeyType" : "HASH" }, { "AttributeName" : "Sales", "KeyType" : "RANGE" } ], "Projection" : { "NonKeyAttributes" : ["Artist","NumberOfSongs"], "ProjectionType" : "INCLUDE" } }] } } } }

YAML

AWSTemplateFormatVersion: "2010-09-09" Resources: myDynamoDBTable: Type: AWS::DynamoDB::Table Properties: AttributeDefinitions: - AttributeName: "Album" AttributeType: "S" - AttributeName: "Artist" AttributeType: "S" - AttributeName: "Sales" AttributeType: "N" - AttributeName: "NumberOfSongs" AttributeType: "N" KeySchema: - AttributeName: "Album" KeyType: "HASH" - AttributeName: "Artist" KeyType: "RANGE" ProvisionedThroughput: ReadCapacityUnits: "5" WriteCapacityUnits: "5" TableName: "myTableName" GlobalSecondaryIndexes: - IndexName: "myGSI" KeySchema: - AttributeName: "Sales" KeyType: "HASH" - AttributeName: "Artist" KeyType: "RANGE" Projection: NonKeyAttributes: - "Album" - "NumberOfSongs" ProjectionType: "INCLUDE" ProvisionedThroughput: ReadCapacityUnits: "5" WriteCapacityUnits: "5" - IndexName: "myGSI2" KeySchema: - AttributeName: "NumberOfSongs" KeyType: "HASH" - AttributeName: "Sales" KeyType: "RANGE" Projection: NonKeyAttributes: - "Album" - "Artist" ProjectionType: "INCLUDE" ProvisionedThroughput: ReadCapacityUnits: "5" WriteCapacityUnits: "5" LocalSecondaryIndexes: - IndexName: "myLSI" KeySchema: - AttributeName: "Album" KeyType: "HASH" - AttributeName: "Sales" KeyType: "RANGE" Projection: NonKeyAttributes: - "Artist" - "NumberOfSongs" ProjectionType: "INCLUDE"

Tabela do DynamoDB com um atributo DependsOn

Se você incluir várias tabelas com índices do DynamoDB; em um único modelo, você deverá incluir dependências para que as tabelas sejam criadas em sequência. O DynamoDB limita o número de tabelas com índices secundários que estão no estado de criação. Se você criar várias tabelas com índices ao mesmo tempo, o DynamoDB retornará um erro e haverá falha na operação da pilha.

O exemplo a seguir pressupõe que a tabela myFirstDDBTable seja declarada no mesmo modelo como a tabela mySecondDDBTable e ambas as tabelas incluem um índice secundário. A tabela mySecondDDBTable inclui uma dependência na tabela myFirstDDBTable para que o AWS CloudFormation crie uma tabela de cada vez.

JSON

"mySecondDDBTable" : { "Type" : "AWS::DynamoDB::Table", "DependsOn" : "myFirstDDBTable" , "Properties" : { "AttributeDefinitions" : [ { "AttributeName" : "ArtistId", "AttributeType" : "S" }, { "AttributeName" : "Concert", "AttributeType" : "S" }, { "AttributeName" : "TicketSales", "AttributeType" : "S" } ], "KeySchema" : [ { "AttributeName" : "ArtistId", "KeyType" : "HASH" }, { "AttributeName" : "Concert", "KeyType" : "RANGE" } ], "ProvisionedThroughput" : { "ReadCapacityUnits" : {"Ref" : "ReadCapacityUnits"}, "WriteCapacityUnits" : {"Ref" : "WriteCapacityUnits"} }, "GlobalSecondaryIndexes" : [{ "IndexName" : "myGSI", "KeySchema" : [ { "AttributeName" : "TicketSales", "KeyType" : "HASH" } ], "Projection" : { "ProjectionType" : "KEYS_ONLY" }, "ProvisionedThroughput" : { "ReadCapacityUnits" : {"Ref" : "ReadCapacityUnits"}, "WriteCapacityUnits" : {"Ref" : "WriteCapacityUnits"} } }], "Tags": [ { "Key": "foo", "Value": "bar" } ] } }

YAML

mySecondDDBTable: Type: AWS::DynamoDB::Table DependsOn: "myFirstDDBTable" Properties: AttributeDefinitions: - AttributeName: "ArtistId" AttributeType: "S" - AttributeName: "Concert" AttributeType: "S" - AttributeName: "TicketSales" AttributeType: "S" KeySchema: - AttributeName: "ArtistId" KeyType: "HASH" - AttributeName: "Concert" KeyType: "RANGE" ProvisionedThroughput: ReadCapacityUnits: Ref: "ReadCapacityUnits" WriteCapacityUnits: Ref: "WriteCapacityUnits" GlobalSecondaryIndexes: - IndexName: "myGSI" KeySchema: - AttributeName: "TicketSales" KeyType: "HASH" Projection: ProjectionType: "KEYS_ONLY" ProvisionedThroughput: ReadCapacityUnits: Ref: "ReadCapacityUnits" WriteCapacityUnits: Ref: "WriteCapacityUnits" Tags: - Key: foo Value: bar

Tabela do DynamoDB com o Application Auto Scaling

Este exemplo configura o Application Auto Scaling para um recurso AWS::DynamoDB::Table. O modelo define uma política de escalabilidade TargetTrackingScaling que aumenta a taxa de transferência de WriteCapacityUnits para a tabela.

JSON

{ "Resources": { "DDBTable": { "Type": "AWS::DynamoDB::Table", "Properties": { "AttributeDefinitions": [ { "AttributeName": "ArtistId", "AttributeType": "S" }, { "AttributeName": "Concert", "AttributeType": "S" }, { "AttributeName": "TicketSales", "AttributeType": "S" } ], "KeySchema": [ { "AttributeName": "ArtistId", "KeyType": "HASH" }, { "AttributeName": "Concert", "KeyType": "RANGE" } ], "GlobalSecondaryIndexes": [ { "IndexName": "GSI", "KeySchema": [ { "AttributeName": "TicketSales", "KeyType": "HASH" } ], "Projection": { "ProjectionType": "KEYS_ONLY" }, "ProvisionedThroughput": { "ReadCapacityUnits": 5, "WriteCapacityUnits": 5 } } ], "ProvisionedThroughput": { "ReadCapacityUnits": 5, "WriteCapacityUnits": 5 } } }, "WriteCapacityScalableTarget": { "Type": "AWS::ApplicationAutoScaling::ScalableTarget", "Properties": { "MaxCapacity": 15, "MinCapacity": 5, "ResourceId": { "Fn::Join": [ "/", [ "table", { "Ref": "DDBTable" } ] ] }, "RoleARN": { "Fn::GetAtt": ["ScalingRole", "Arn"] }, "ScalableDimension": "dynamodb:table:WriteCapacityUnits", "ServiceNamespace": "dynamodb" } }, "ScalingRole": { "Type": "AWS::IAM::Role", "Properties": { "AssumeRolePolicyDocument": { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": [ "application-autoscaling.amazonaws.com" ] }, "Action": [ "sts:AssumeRole" ] } ] }, "Path": "/", "Policies": [ { "PolicyName": "root", "PolicyDocument": { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "dynamodb:DescribeTable", "dynamodb:UpdateTable", "cloudwatch:PutMetricAlarm", "cloudwatch:DescribeAlarms", "cloudwatch:GetMetricStatistics", "cloudwatch:SetAlarmState", "cloudwatch:DeleteAlarms" ], "Resource": "*" } ] } } ] } }, "WriteScalingPolicy": { "Type": "AWS::ApplicationAutoScaling::ScalingPolicy", "Properties": { "PolicyName": "WriteAutoScalingPolicy", "PolicyType": "TargetTrackingScaling", "ScalingTargetId": { "Ref": "WriteCapacityScalableTarget" }, "TargetTrackingScalingPolicyConfiguration": { "TargetValue": 50.0, "ScaleInCooldown": 60, "ScaleOutCooldown": 60, "PredefinedMetricSpecification": { "PredefinedMetricType": "DynamoDBWriteCapacityUtilization" } } } } } }

YAML

Resources: DDBTable: Type: AWS::DynamoDB::Table Properties: AttributeDefinitions: - AttributeName: "ArtistId" AttributeType: "S" - AttributeName: "Concert" AttributeType: "S" - AttributeName: "TicketSales" AttributeType: "S" KeySchema: - AttributeName: "ArtistId" KeyType: "HASH" - AttributeName: "Concert" KeyType: "RANGE" GlobalSecondaryIndexes: - IndexName: "GSI" KeySchema: - AttributeName: "TicketSales" KeyType: "HASH" Projection: ProjectionType: "KEYS_ONLY" ProvisionedThroughput: ReadCapacityUnits: 5 WriteCapacityUnits: 5 ProvisionedThroughput: ReadCapacityUnits: 5 WriteCapacityUnits: 5 WriteCapacityScalableTarget: Type: AWS::ApplicationAutoScaling::ScalableTarget Properties: MaxCapacity: 15 MinCapacity: 5 ResourceId: !Join - / - - table - !Ref DDBTable RoleARN: !GetAtt ScalingRole.Arn ScalableDimension: dynamodb:table:WriteCapacityUnits ServiceNamespace: dynamodb ScalingRole: Type: AWS::IAM::Role Properties: AssumeRolePolicyDocument: Version: "2012-10-17" Statement: - Effect: "Allow" Principal: Service: - application-autoscaling.amazonaws.com Action: - "sts:AssumeRole" Path: "/" Policies: - PolicyName: "root" PolicyDocument: Version: "2012-10-17" Statement: - Effect: "Allow" Action: - "dynamodb:DescribeTable" - "dynamodb:UpdateTable" - "cloudwatch:PutMetricAlarm" - "cloudwatch:DescribeAlarms" - "cloudwatch:GetMetricStatistics" - "cloudwatch:SetAlarmState" - "cloudwatch:DeleteAlarms" Resource: "*" WriteScalingPolicy: Type: AWS::ApplicationAutoScaling::ScalingPolicy Properties: PolicyName: WriteAutoScalingPolicy PolicyType: TargetTrackingScaling ScalingTargetId: !Ref WriteCapacityScalableTarget TargetTrackingScalingPolicyConfiguration: TargetValue: 50.0 ScaleInCooldown: 60 ScaleOutCooldown: 60 PredefinedMetricSpecification: PredefinedMetricType: DynamoDBWriteCapacityUtilization