Amazon S3
¿Qué es AWS S3?
Amazon S3 (Simple Storage Service) es un servicio de almacenamiento de objetos diseñado para almacenar y recuperar cualquier cantidad de datos desde cualquier lugar en Internet. Es uno de los servicios fundamentales de AWS.
Características principales
1. Durabilidad y Disponibilidad
- Durabilidad: 99.999999999% (11 nueves)
- Disponibilidad: 99.99%
- Replicación automática entre múltiples zonas de disponibilidad
2. Escalabilidad
- Capacidad virtualmente ilimitada
- Sin necesidad de provisionar capacidad
- Escala automáticamente según demanda
3. Seguridad
- Cifrado en tránsito (SSL/TLS)
- Cifrado en reposo (SSE-S3, SSE-KMS)
- Control de acceso granular (IAM, Bucket Policies, ACLs)
- Versionado de objetos
Conceptos clave
Buckets
Contenedor para objetos almacenados en S3:
1
2
3
4
5
| # Crear bucket
aws s3 mb s3://mi-bucket --region us-east-1
# Listar buckets
aws s3 ls
|
Objetos
Archivos y sus metadatos almacenados en S3:
1
2
3
4
5
6
7
8
| # Subir archivo
aws s3 cp archivo.txt s3://mi-bucket/
# Descargar archivo
aws s3 cp s3://mi-bucket/archivo.txt ./
# Sincronizar directorio
aws s3 sync ./directorio/ s3://mi-bucket/
|
Clases de almacenamiento
| Clase | Uso | Costo | Disponibilidad |
|---|
| Standard | Datos frecuentes | Alto | 99.99% |
| Intelligent-Tiering | Acceso variable | Variable | 99.9% |
| Standard-IA | Acceso poco frecuente | Medio | 99.9% |
| One Zone-IA | Datos no críticos | Bajo | 99.5% |
| Glacier | Archivo largo plazo | Muy bajo | 99.99% |
| Glacier Deep Archive | Archivo muy largo plazo | Mínimo | 99.99% |
Casos de uso
1. Hosting de sitios web estáticos
Perfecto para sitios generados con Hugo, Jekyll, etc:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
| # Configurar bucket para hosting web
aws s3 website s3://mi-sitio-web/ \
--index-document index.html \
--error-document 404.html
# Política para acceso público
cat > policy.json << 'EOF'
{
"Version": "2012-10-17",
"Statement": [{
"Sid": "PublicReadGetObject",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::mi-sitio-web/*"
}]
}
EOF
aws s3api put-bucket-policy \
--bucket mi-sitio-web \
--policy file://policy.json
|
2. Backup y archivo
1
2
3
4
| # Backup con reglas de lifecycle
aws s3api put-bucket-lifecycle-configuration \
--bucket mi-backup \
--lifecycle-configuration file://lifecycle.json
|
3. Data Lake
Almacenamiento centralizado para analytics:
1
2
3
4
5
6
7
8
9
10
| # Configurar para uso con Athena
aws s3api put-bucket-encryption \
--bucket mi-datalake \
--server-side-encryption-configuration '{
"Rules": [{
"ApplyServerSideEncryptionByDefault": {
"SSEAlgorithm": "AES256"
}
}]
}'
|
4. Distribución de contenido
Combinado con CloudFront:
- Imágenes
- Videos
- Descargas de software
- Actualizaciones de aplicaciones
Seguridad y permisos
IAM Policies
1
2
3
4
5
6
7
8
9
10
11
12
13
| {
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:PutObject"
],
"Resource": "arn:aws:s3:::mi-bucket/*"
}
]
}
|
Bucket Policy
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
| {
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowSSLRequestsOnly",
"Effect": "Deny",
"Principal": "*",
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::mi-bucket",
"arn:aws:s3:::mi-bucket/*"
],
"Condition": {
"Bool": {
"aws:SecureTransport": "false"
}
}
}
]
}
|
Versionado
Protección contra eliminación accidental:
1
2
3
4
5
6
7
| # Habilitar versionado
aws s3api put-bucket-versioning \
--bucket mi-bucket \
--versioning-configuration Status=Enabled
# Listar versiones
aws s3api list-object-versions --bucket mi-bucket
|
Lifecycle Policies
Automatizar transiciones entre clases de almacenamiento:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
| {
"Rules": [
{
"Id": "Archive-old-logs",
"Status": "Enabled",
"Filter": {
"Prefix": "logs/"
},
"Transitions": [
{
"Days": 30,
"StorageClass": "STANDARD_IA"
},
{
"Days": 90,
"StorageClass": "GLACIER"
}
],
"Expiration": {
"Days": 365
}
}
]
}
|
Replicación
Cross-Region Replication (CRR)
1
2
3
4
| # Configurar replicación entre regiones
aws s3api put-bucket-replication \
--bucket mi-bucket-origen \
--replication-configuration file://replication.json
|
Eventos y notificaciones
Trigger acciones basadas en eventos S3:
1
2
3
4
| # Configurar notificación a Lambda
aws s3api put-bucket-notification-configuration \
--bucket mi-bucket \
--notification-configuration file://notification.json
|
Eventos disponibles:
s3:ObjectCreated:*s3:ObjectRemoved:*s3:ObjectRestore:*s3:Replication:*
Monitoreo y logs
Server Access Logs
1
2
3
4
5
6
7
8
9
| # Habilitar logs de acceso
aws s3api put-bucket-logging \
--bucket mi-bucket \
--bucket-logging-status '{
"LoggingEnabled": {
"TargetBucket": "mi-bucket-logs",
"TargetPrefix": "access-logs/"
}
}'
|
Métricas de CloudWatch
Métricas automáticas:
- BucketSizeBytes
- NumberOfObjects
- AllRequests
- GetRequests
- PutRequests
Optimización de costos
1. Usar clases de almacenamiento apropiadas
1
2
3
4
| # Cambiar clase de storage
aws s3 cp s3://mi-bucket/archivo.txt \
s3://mi-bucket/archivo.txt \
--storage-class INTELLIGENT_TIERING
|
2. Implementar Lifecycle Policies
Mover automáticamente objetos antiguos a clases más baratas.
3. Eliminar versiones antiguas
1
2
3
4
5
6
7
8
9
10
| # Regla para eliminar versiones no actuales después de 30 días
{
"Rules": [{
"Id": "DeleteOldVersions",
"Status": "Enabled",
"NoncurrentVersionExpiration": {
"NoncurrentDays": 30
}
}]
}
|
4. Comprimir archivos
Reducir tamaño de datos almacenados:
1
2
| tar -czf backup.tar.gz /datos/
aws s3 cp backup.tar.gz s3://mi-bucket/backups/
|
Mejores prácticas
- ✅ Habilitar versionado para datos críticos
- ✅ Usar cifrado (SSE-S3 o SSE-KMS)
- ✅ Implementar Lifecycle Policies para optimizar costos
- ✅ Configurar replicación para disaster recovery
- ✅ Habilitar MFA Delete para buckets críticos
- ✅ Usar IAM roles en lugar de access keys
- ✅ Monitorear con CloudWatch y CloudTrail
- ✅ Bloquear acceso público por defecto
Integración con CloudFront
Mejorar performance y seguridad:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| # Crear OAI (Origin Access Identity)
aws cloudfront create-cloud-front-origin-access-identity \
--cloud-front-origin-access-identity-config '{
"CallerReference": "mi-sitio-'$(date +%s)'",
"Comment": "OAI para mi-sitio-web"
}'
# Actualizar bucket policy para permitir solo CloudFront
{
"Statement": [{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity E1234567890ABC"
},
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::mi-sitio-web/*"
}]
}
|
Comandos útiles
1
2
3
4
5
6
7
8
9
10
11
| # Calcular tamaño de bucket
aws s3 ls s3://mi-bucket --recursive --human-readable --summarize
# Copiar bucket completo
aws s3 sync s3://bucket-origen s3://bucket-destino
# Eliminar todos los objetos (¡cuidado!)
aws s3 rm s3://mi-bucket --recursive
# Hacer objeto público temporalmente (presigned URL)
aws s3 presign s3://mi-bucket/archivo.txt --expires-in 3600
|
Límites
- Tamaño máximo de objeto: 5 TB
- Tamaño máximo PUT: 5 GB (usar multipart upload para archivos mayores)
- Número de buckets por cuenta: 100 (soft limit, se puede aumentar)
- Sin límite de objetos por bucket
Comparación con otros servicios
| Servicio | Uso | Acceso | Costo |
|---|
| S3 | Object storage | HTTP/API | $$ |
| EBS | Block storage para EC2 | Attached | $$$ |
| EFS | File system compartido | NFS | $$$$ |
| Glacier | Archive a largo plazo | Retrieval time | $ |
Conceptos Relacionados
Referencias
Herramientas útiles
- AWS CLI: Cliente de línea de comandos
- s3cmd: Cliente alternativo
- CloudBerry: Cliente GUI
- Cyberduck: Cliente FTP/SFTP/S3
- Terraform: IaC para S3