Solicitar una exportación de tabla en DynamoDB
La exportación de una tabla de DynamoDB le permite exportar datos de la tabla a un bucket de Amazon S3, habilitándolo para realizar análisis y consultas complejas sobre los datos mediante otros servicios de AWS como Athena, AWS Glue, Amazon SageMaker AI, Amazon EMR y AWS Lake Formation. Puede solicitar la exportación de una tabla de DynamoDB mediante la Consola de administración de AWS, la AWS CLI o la API de DynamoDB.
No se admite el pago de buckets de Amazon S3 por parte del solicitante.
DynamoDB admite tanto la exportación completa como la exportación incremental:
-
Con las exportaciones completas, puede exportar una instantánea completa de su tabla desde cualquier momento dado dentro del periodo de recuperación en un momento dado (PITR) a su bucket de S3 de Amazon.
-
Con las exportaciones incrementales, puede exportar datos de su tabla de DynamoDB que se hayan modificado, actualizado o eliminado entre un periodo de tiempo especificado, dentro de su ventana PITR, a su bucket de S3 de Amazon.
Requisitos previos
Habilitar PITR
Para utilizar la característica de exportación a S3, debe activar PITR en su tabla. Para más detalles sobre cómo activar PITR, consulte Recuperación en un momento dado. Si solicita una exportación para una tabla que no tiene PITR activado, su solicitud no se realizará correctamente y aparecerá el mensaje de excepción: “An error occurred (PointInTimeRecoveryUnavailableException) when calling the ExportTableToPointInTime operation: Point in time recovery is not enabled for table 'my-dynamodb-table’”. Solo puede solicitar y exportar desde un momento determinado que se encuentre dentro de los RecoveryPeriodInDays de PITR configurados.
Configuración de permisos de S
Puede exportar los datos de la tabla a cualquier bucket de Amazon S3 en el que tenga permiso para escribir. El bucket de destino no tiene por qué estar en la misma región de AWS o tener el mismo propietario que la tabla de origen. Su política de AWS Identity and Access Management (IAM) debe permitirle realizar acciones S3 (s3:AbortMultipartUpload, s3:PutObject ys3:PutObjectAcl ) y la acción de exportación DynamoDB (dynamodb:ExportTableToPointInTime). He aquí un ejemplo de una política de muestra que concederá a su usuario permisos para realizar exportaciones a un bucket de S3.
- JSON
-
-
{
"Version":"2012-10-17",
"Statement": [
{
"Sid": "AllowDynamoDBExportAction",
"Effect": "Allow",
"Action": "dynamodb:ExportTableToPointInTime",
"Resource": "arn:aws:dynamodb:us-east-1:111122223333:table/my-table"
},
{
"Sid": "AllowS3BucketWrites",
"Effect": "Allow",
"Action": [
"s3:AbortMultipartUpload",
"s3:PutObject",
"s3:PutObjectAcl"
],
"Resource": "arn:aws:s3:::amzn-s3-demo-bucket/*"
}
]
}
Si necesita escribir en un bucket de Amazon S3 que esté en otra cuenta o en el que no tenga permisos de escritura, el propietario del bucket de Amazon S3 debe agregar una política de buckets para permitirle exportar desde DynamoDB a ese bucket. He aquí un ejemplo de política en el bucket de Amazon S3 de destino.
- JSON
-
-
{
"Version":"2012-10-17",
"Statement": [
{
"Sid": "ExampleStatement",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::123456789012:user/Dave"
},
"Action": [
"s3:AbortMultipartUpload",
"s3:PutObject",
"s3:PutObjectAcl"
],
"Resource": "arn:aws:s3:::amzn-s3-demo-bucket/*"
}
]
}
Revocar estos permisos mientras se lleva a cabo una exportación dará como resultado archivos parciales.
Si la tabla o el bucket al que realiza la exportación está cifrado con claves administradas por el cliente, las políticas de esa clave KMS deben dar permiso a DynamoDB para que la utilice. Este permiso se concede a través del usuario o rol de IAM que desencadena el trabajo de exportación. Para obtener más información sobre el cifrado, incluidas las prácticas recomendadas, consulte ¿Cómo Amazon DynamoDB utiliza AWS KMS? y Using a custom KMS key (Cómo utilizar una clave KMS personalizada).
Solicitar una exportación mediante la Consola de administración de AWS
En el siguiente ejemplo, se muestra cómo utilizar la consola de DynamoDB para exportar una tabla llamada MusicCollection.
En este procedimiento se presupone que ha habilitado la recuperación a un momento dado. Para habilitar esta función en la tabla MusicCollection, dentro de la tabla, diríjase a la pestaña Overview (Información general) de la sección Table details (Detalles de la tabla) y seleccione la opción Enable (Habilitar) en Point-in-time recovery (Recuperación a un momento dado).
Para solicitar una exportación de tabla
Inicie sesión en la Consola de administración de AWS y abra la consola de DynamoDB en https://console.aws.amazon.com/dynamodb/.
-
En el panel de navegación del lado izquierdo de la consola, elija Exports to S3 (Exportación a S3).
-
Seleccione el botón Exportar a S3.
-
Elija una tabla de origen y un bucket de S3 de destino. Si el bucket de destino es propiedad de la cuenta, puede utilizar el botón Browse S3 (Examinar S3) para encontrarlo. En caso contrario, ingrese la URL del bucket con el comando s3://bucketname/prefix
format.. El prefix es una carpeta opcional para ayudarle a mantener el bucket de destino organizado.
-
Elija Exportación completa o Exportación incremental. Una exportación completa genera la instantánea completa de la tabla tal y como estaba en el momento que especifique. Una exportación incremental da salida a los cambios realizados en su tabla durante el periodo de exportación especificado. Su salida está compactada de tal manera que solo contiene el estado final del elemento del periodo de exportación. El elemento solo aparecerá una vez en la exportación aunque tenga varias actualizaciones en el mismo periodo de exportación.
- Full export
-
-
Seleccione el momento a partir del cual desea exportar la instantánea de la tabla completa. Puede ser en cualquier momento dentro del periodo de PITR. También puede seleccionar Hora actual para exportar la última instantánea.
-
Para Formato de archivo exportado, elija entre DynamoDB JSON y Amazon Ion. De forma predeterminada, la tabla se exportará en formato DynamoDB JSON a partir del último tiempo restaurable en la ventana de recuperación a un momento dado y se cifrará con una clave de Amazon S3 (SSE-S3). Puede modificar esta configuración de exportación si es necesario.
Si elige cifrar la exportación usando una clave protegida por AWS Key Management Service (AWS KMS), la clave debe estar en la misma región que el bucket de S3 de destino.
- Incremental export
-
-
Seleccione el periodo de exportación para el que desea exportar los datos incrementales. Seleccione una hora de inicio en el periodo de PITR. La duración del periodo de exportación debe ser de al menos 15 minutos y no debe superar las 24 horas. La hora de inicio del periodo de exportación es inclusiva y la hora de finalización es exclusiva.
-
Elija entre Modo absoluto o Modo relativo.
-
Modo absoluto exportará datos incrementales para el periodo de tiempo que especifique.
-
Modo relativo exportará los datos incrementales durante un período de exportación relativo al tiempo de envío del trabajo de exportación.
-
Para Formato de archivo exportado, elija entre DynamoDB JSON y Amazon Ion. De forma predeterminada, la tabla se exportará en formato DynamoDB JSON a partir del último tiempo restaurable en la ventana de recuperación a un momento dado y se cifrará con una clave de Amazon S3 (SSE-S3). Puede modificar esta configuración de exportación si es necesario.
Si elige cifrar la exportación usando una clave protegida por AWS Key Management Service (AWS KMS), la clave debe estar en la misma región que el bucket de S3 de destino.
-
Para Tipo de vista de exportación, seleccione Imágenes nuevas y antiguas o Solo imágenes nuevas. La nueva imagen proporciona el último estado del elemento. La imagen antigua proporciona el estado del elemento justo antes de la “fecha y hora de inicio” especificadas. La configuración predeterminada es Imágenes nuevas y antiguas. Para obtener más información sobre imágenes nuevas e imágenes antiguas, consulte Salida de exportación incremental.
-
Seleccione Exportar para empezar.
Los datos exportados no son coherentes con las transacciones. Sus operaciones de transacción pueden dividirse en dos salidas de exportación. Una operación de transacción reflejada en la exportación puede modificar un subconjunto de elementos, mientras que otro subconjunto de modificaciones de la misma transacción no se refleja en la misma solicitud de exportación. No obstante, las exportaciones son finalmente coherentes. Si se interrumpe una transacción durante una exportación, tendrá la transacción restante en su siguiente exportación contigua, sin duplicados. Los periodos de tiempo utilizados para las exportaciones se basan en un reloj interno del sistema y pueden variar en un minuto del reloj local de su aplicación.
Obtención de detalles sobre exportaciones pasadas en la Consola de administración de AWS
Puede encontrar información sobre las tareas de exportación que ha ejecutado en el pasado en la sección Exportaciones a S3 de la barra lateral de navegación. Esta sección contiene una lista de todas las exportaciones que ha creado en los últimos 90 días. Seleccione el ARN de una tarea enumerada en la pestaña Exportaciones para recuperar información sobre esa exportación, incluida la configuración avanzada que haya elegido. Tenga en cuenta que aunque los metadatos de la tarea de exportación vencen tras 90 días y los trabajos anteriores a eso ya no se encuentran en esta lista, los objetos de su bucket de S3 permanecen siempre que lo permitan las políticas de bucket. DynamoDB nunca elimina ninguno de los objetos que crea en su bucket de S3 durante una exportación.
Solicitud de exportación mediante la AWS CLI y los AWS SDK
En los siguientes ejemplos, se muestra cómo exportar una tabla existente a un bucket de S3.
En este procedimiento se presupone que ha habilitado la recuperación a un momento dado. Para habilitarlo en la tabla MusicCollection, ejecute el siguiente comando.
aws dynamodb update-continuous-backups \
--table-name MusicCollection \
--point-in-time-recovery-specification PointInTimeRecoveryEnabled=True
Exportación completa
- AWS CLI
-
Si solicita una exportación de tablas entre cuentas, asegúrese de incluir la opción --s3-bucket-owner.
aws dynamodb export-table-to-point-in-time \
--table-arn arn:aws:dynamodb:us-west-2:111122223333:table/MusicCollection \
--s3-bucket ddb-export-musiccollection-9012345678 \
--s3-prefix 2020-Nov \
--export-format DYNAMODB_JSON \
--export-time 1604632434 \
--s3-bucket-owner 9012345678 \
--s3-sse-algorithm AES256
- Python
-
import boto3
from datetime import datetime
client = boto3.client('dynamodb')
client.export_table_to_point_in_time(
TableArn='arn:aws:dynamodb:us-east-1:111122223333:table/TABLE',
ExportTime=datetime(2023, 9, 20, 12, 0, 0),
S3Bucket='bucket',
S3Prefix='prefix',
S3SseAlgorithm='AES256',
ExportFormat='DYNAMODB_JSON'
)
- Java
-
DynamoDbClient client = DynamoDbClient.create();
client.exportTableToPointInTime(b -> b
.tableArn("arn:aws:dynamodb:us-east-1:111122223333:table/TABLE")
.exportTime(Instant.parse("2023-09-20T12:00:00Z"))
.s3Bucket("bucket")
.s3Prefix("prefix")
.s3SseAlgorithm(S3SseAlgorithm.AES256)
.exportFormat(ExportFormat.DYNAMODB_JSON));
- .NET
-
var client = new AmazonDynamoDBClient();
await client.ExportTableToPointInTimeAsync(new ExportTableToPointInTimeRequest
{
TableArn = "arn:aws:dynamodb:us-east-1:111122223333:table/TABLE",
ExportTime = new DateTime(2023, 9, 20, 12, 0, 0, DateTimeKind.Utc),
S3Bucket = "bucket",
S3Prefix = "prefix",
S3SseAlgorithm = S3SseAlgorithm.AES256,
ExportFormat = ExportFormat.DYNAMODB_JSON
});
- JavaScript
-
import { DynamoDBClient, ExportTableToPointInTimeCommand } from "@aws-sdk/client-dynamodb";
const client = new DynamoDBClient();
await client.send(new ExportTableToPointInTimeCommand({
TableArn: "arn:aws:dynamodb:us-east-1:111122223333:table/TABLE",
ExportTime: new Date("2023-09-20T12:00:00Z"),
S3Bucket: "bucket",
S3Prefix: "prefix",
S3SseAlgorithm: "AES256",
ExportFormat: "DYNAMODB_JSON"
}));
- Go
-
cfg, _ := config.LoadDefaultConfig(context.TODO())
client := dynamodb.NewFromConfig(cfg)
exportTime := time.Date(2023, 9, 20, 12, 0, 0, 0, time.UTC)
client.ExportTableToPointInTime(context.TODO(), &dynamodb.ExportTableToPointInTimeInput{
TableArn: aws.String("arn:aws:dynamodb:us-east-1:111122223333:table/TABLE"),
ExportTime: &exportTime,
S3Bucket: aws.String("bucket"),
S3Prefix: aws.String("prefix"),
S3SseAlgorithm: types.S3SseAlgorithmAes256,
ExportFormat: types.ExportFormatDynamodbJson,
})
Exportación incremental
- AWS CLI
-
aws dynamodb export-table-to-point-in-time \
--table-arn arn:aws:dynamodb:REGION:ACCOUNT:table/TABLENAME \
--s3-bucket BUCKET --s3-prefix PREFIX \
--incremental-export-specification ExportFromTime=1693569600,ExportToTime=1693656000,ExportViewType=NEW_AND_OLD_IMAGES \
--export-type INCREMENTAL_EXPORT
- Python
-
import boto3
from datetime import datetime
client = boto3.client('dynamodb')
client.export_table_to_point_in_time(
TableArn='arn:aws:dynamodb:us-east-1:111122223333:table/TABLE',
IncrementalExportSpecification={
'ExportFromTime': datetime(2023, 9, 20, 12, 0, 0),
'ExportToTime': datetime(2023, 9, 20, 13, 0, 0),
'ExportViewType': 'NEW_AND_OLD_IMAGES'
},
ExportType='INCREMENTAL_EXPORT',
S3Bucket='bucket',
S3Prefix='prefix',
S3SseAlgorithm='AES256',
ExportFormat='DYNAMODB_JSON'
)
- Java
-
DynamoDbClient client = DynamoDbClient.create();
client.exportTableToPointInTime(b -> b
.tableArn("arn:aws:dynamodb:us-east-1:111122223333:table/TABLE")
.exportType(ExportType.INCREMENTAL_EXPORT)
.incrementalExportSpecification(i -> i
.exportFromTime(Instant.parse("2023-09-20T12:00:00Z"))
.exportToTime(Instant.parse("2023-09-20T13:00:00Z"))
.exportViewType(ExportViewType.NEW_AND_OLD_IMAGES))
.s3Bucket("bucket")
.s3Prefix("prefix")
.s3SseAlgorithm(S3SseAlgorithm.AES256)
.exportFormat(ExportFormat.DYNAMODB_JSON));
- .NET
-
var client = new AmazonDynamoDBClient();
await client.ExportTableToPointInTimeAsync(new ExportTableToPointInTimeRequest
{
TableArn = "arn:aws:dynamodb:us-east-1:111122223333:table/TABLE",
ExportType = ExportType.INCREMENTAL_EXPORT,
IncrementalExportSpecification = new IncrementalExportSpecification
{
ExportFromTime = new DateTime(2023, 9, 20, 12, 0, 0, DateTimeKind.Utc),
ExportToTime = new DateTime(2023, 9, 20, 13, 0, 0, DateTimeKind.Utc),
ExportViewType = ExportViewType.NEW_AND_OLD_IMAGES
},
S3Bucket = "bucket",
S3Prefix = "prefix",
S3SseAlgorithm = S3SseAlgorithm.AES256,
ExportFormat = ExportFormat.DYNAMODB_JSON
});
- JavaScript
-
import { DynamoDBClient, ExportTableToPointInTimeCommand } from "@aws-sdk/client-dynamodb";
const client = new DynamoDBClient();
await client.send(new ExportTableToPointInTimeCommand({
TableArn: "arn:aws:dynamodb:us-east-1:111122223333:table/TABLE",
ExportType: "INCREMENTAL_EXPORT",
IncrementalExportSpecification: {
ExportFromTime: new Date("2023-09-20T12:00:00Z"),
ExportToTime: new Date("2023-09-20T13:00:00Z"),
ExportViewType: "NEW_AND_OLD_IMAGES"
},
S3Bucket: "bucket",
S3Prefix: "prefix",
S3SseAlgorithm: "AES256",
ExportFormat: "DYNAMODB_JSON"
}));
- Go
-
cfg, _ := config.LoadDefaultConfig(context.TODO())
client := dynamodb.NewFromConfig(cfg)
fromTime := time.Date(2023, 9, 20, 12, 0, 0, 0, time.UTC)
toTime := time.Date(2023, 9, 20, 13, 0, 0, 0, time.UTC)
client.ExportTableToPointInTime(context.TODO(), &dynamodb.ExportTableToPointInTimeInput{
TableArn: aws.String("arn:aws:dynamodb:us-east-1:111122223333:table/TABLE"),
ExportType: types.ExportTypeIncrementalExport,
IncrementalExportSpecification: &types.IncrementalExportSpecification{
ExportFromTime: &fromTime,
ExportToTime: &toTime,
ExportViewType: types.ExportViewTypeNewAndOldImages,
},
S3Bucket: aws.String("bucket"),
S3Prefix: aws.String("prefix"),
S3SseAlgorithm: types.S3SseAlgorithmAes256,
ExportFormat: types.ExportFormatDynamodbJson,
})
Si elige cifrar la exportación usando una clave protegida por AWS Key Management Service (AWS KMS), la clave debe estar en la misma región que el bucket de S3 de destino.
Obtención de detalles sobre exportaciones pasadas mediante la AWS CLI y los AWS SDK
Puede encontrar información acerca de las solicitudes de exportación que ha ejecutado en el pasado mediante el comando list-exports. Este comando devuelve una lista de todas las exportaciones que ha creado en los últimos 90 días. Tenga en cuenta que aunque los metadatos de la tarea de exportación vencen después de 90 días y los trabajos anteriores a eso ya no se regresan por medio del comando list-exports, los objetos de su bucket de S3 permanecen siempre que lo permitan las políticas de bucket. DynamoDB nunca elimina ninguno de los objetos que crea en su bucket de S3 durante una exportación.
Las exportaciones tienen un estado de PENDING hasta que se realizan o no correctamente. Si se realizan correctamente, el estado cambia a COMPLETED. Si no se realizan correctamente, el estado cambia a FAILED con un failure_message y una failure_reason.
Muestra de exportaciones
- AWS CLI
-
aws dynamodb list-exports \
--table-arn arn:aws:dynamodb:us-east-1:111122223333:table/ProductCatalog
- Python
-
import boto3
client = boto3.client('dynamodb')
print(
client.list_exports(
TableArn='arn:aws:dynamodb:us-east-1:111122223333:table/TABLE',
)
)
- Java
-
DynamoDbClient client = DynamoDbClient.create();
ListExportsResponse response = client.listExports(b -> b
.tableArn("arn:aws:dynamodb:us-east-1:111122223333:table/TABLE"));
response.exportSummaries().forEach(System.out::println);
- .NET
-
var client = new AmazonDynamoDBClient();
var response = await client.ListExportsAsync(new ListExportsRequest
{
TableArn = "arn:aws:dynamodb:us-east-1:111122223333:table/TABLE"
});
response.ExportSummaries.ForEach(Console.WriteLine);
- JavaScript
-
import { DynamoDBClient, ListExportsCommand } from "@aws-sdk/client-dynamodb";
const client = new DynamoDBClient();
const response = await client.send(new ListExportsCommand({
TableArn: "arn:aws:dynamodb:us-east-1:111122223333:table/TABLE"
}));
console.log(response.ExportSummaries);
- Go
-
cfg, _ := config.LoadDefaultConfig(context.TODO())
client := dynamodb.NewFromConfig(cfg)
response, _ := client.ListExports(context.TODO(), &dynamodb.ListExportsInput{
TableArn: aws.String("arn:aws:dynamodb:us-east-1:111122223333:table/TABLE"),
})
fmt.Println(response.ExportSummaries)
Descripción de la exportación
- AWS CLI
-
aws dynamodb describe-export \
--export-arn arn:aws:dynamodb:us-east-1:111122223333:table/ProductCatalog/export/01695353076000-a1b2c3d4
- Python
-
import boto3
client = boto3.client('dynamodb')
print(
client.describe_export(
ExportArn='arn:aws:dynamodb:us-east-1:111122223333:table/TABLE/export/01695353076000-06e2188f',
)['ExportDescription']
)
- Java
-
DynamoDbClient client = DynamoDbClient.create();
DescribeExportResponse response = client.describeExport(b -> b
.exportArn("arn:aws:dynamodb:us-east-1:111122223333:table/TABLE/export/01695353076000-06e2188f"));
System.out.println(response.exportDescription());
- .NET
-
var client = new AmazonDynamoDBClient();
var response = await client.DescribeExportAsync(new DescribeExportRequest
{
ExportArn = "arn:aws:dynamodb:us-east-1:111122223333:table/TABLE/export/01695353076000-06e2188f"
});
Console.WriteLine(response.ExportDescription);
- JavaScript
-
import { DynamoDBClient, DescribeExportCommand } from "@aws-sdk/client-dynamodb";
const client = new DynamoDBClient();
const response = await client.send(new DescribeExportCommand({
ExportArn: "arn:aws:dynamodb:us-east-1:111122223333:table/TABLE/export/01695353076000-06e2188f"
}));
console.log(response.ExportDescription);
- Go
-
cfg, _ := config.LoadDefaultConfig(context.TODO())
client := dynamodb.NewFromConfig(cfg)
response, _ := client.DescribeExport(context.TODO(), &dynamodb.DescribeExportInput{
ExportArn: aws.String("arn:aws:dynamodb:us-east-1:111122223333:table/TABLE/export/01695353076000-06e2188f"),
})
fmt.Println(response.ExportDescription)