¿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

ClaseUsoCostoDisponibilidad
StandardDatos frecuentesAlto99.99%
Intelligent-TieringAcceso variableVariable99.9%
Standard-IAAcceso poco frecuenteMedio99.9%
One Zone-IADatos no críticosBajo99.5%
GlacierArchivo largo plazoMuy bajo99.99%
Glacier Deep ArchiveArchivo muy largo plazoMínimo99.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

  1. Habilitar versionado para datos críticos
  2. Usar cifrado (SSE-S3 o SSE-KMS)
  3. Implementar Lifecycle Policies para optimizar costos
  4. Configurar replicación para disaster recovery
  5. Habilitar MFA Delete para buckets críticos
  6. Usar IAM roles en lugar de access keys
  7. Monitorear con CloudWatch y CloudTrail
  8. 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

ServicioUsoAccesoCosto
S3Object storageHTTP/API$$
EBSBlock storage para EC2Attached$$$
EFSFile system compartidoNFS$$$$
GlacierArchive a largo plazoRetrieval 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