AWS CLI es la herramienta oficial de Amazon para gestionar los servicios de AWS desde la terminal: S3, EC2, IAM y prácticamente cualquier otro. Instalada en un servidor, permite automatizar tareas como subir copias de seguridad a S3 o consultar el estado de tus recursos desde scripts. En este tutorial instalarás AWS CLI v2 en Ubuntu 24.04 con el instalador oficial, crearás un usuario IAM con permisos mínimos, configurarás credenciales y perfiles, y sincronizarás un directorio con un bucket de S3.

Requisitos previos

Para seguir esta guía necesitas:

  • Un servidor con Ubuntu 24.04 LTS, por ejemplo un VPS de CubePath, con arquitectura x86_64 o arm64.
  • Un usuario no root con privilegios sudo.
  • Una cuenta de AWS con acceso a la consola para crear un usuario IAM.

Paso 1: Instalar AWS CLI v2

El instalador oficial es un archivo ZIP que contiene la CLI con su propio intérprete de Python, así que no depende del Python del sistema. Instala unzip para poder extraerlo:

sudo apt update
sudo apt install -y unzip curl

Descarga el instalador en un directorio temporal. Si tu servidor es ARM, sustituye x86_64 por aarch64 en la URL (puedes comprobar la arquitectura con uname -m):

cd /tmp
curl -fsSL "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o awscliv2.zip
unzip -q awscliv2.zip

Ejecuta el instalador. Por defecto copia los archivos en /usr/local/aws-cli y crea el enlace /usr/local/bin/aws:

sudo ./aws/install

Comprueba que el comando está disponible:

aws --version
aws-cli/2.x.x Python/3.x.x Linux/6.8.0-xx-generic exe/x86_64.ubuntu.24

Elimina los archivos temporales:

rm -rf /tmp/aws /tmp/awscliv2.zip

Paso 2: Crear un usuario IAM con permisos mínimos

No uses las credenciales del usuario raíz de la cuenta de AWS en un servidor. Crea un usuario IAM específico con solo los permisos que va a necesitar el servidor:

  1. En la consola de AWS, abre IAM > Usuarios > Crear usuario y dale un nombre descriptivo, por ejemplo backup-servidor-web. No le des acceso a la consola.
  2. En los permisos, adjunta directamente una política. Para este tutorial basta con una política que permita trabajar con un único bucket de S3 (la verás en el paso 6). Evita AdministratorAccess.
  3. Abre el usuario creado, ve a Credenciales de seguridad > Crear clave de acceso, elige el caso de uso Command Line Interface (CLI) y guarda el Access Key ID y la Secret Access Key. La clave secreta solo se muestra una vez.

Paso 3: Configurar las credenciales

El comando aws configure guarda las credenciales y la configuración por defecto en el directorio ~/.aws del usuario que lo ejecuta. Ejecútalo con el usuario que va a usar la CLI, sin sudo:

aws configure

Introduce los valores cuando te los pida. Sustituye las claves por las tuyas y elige la región donde están tus recursos:

AWS Access Key ID [None]: AKIAXXXXXXXXXXXXXXXX
AWS Secret Access Key [None]: tu_clave_secreta
Default region name [None]: eu-west-1
Default output format [None]: json

Se crean dos archivos: ~/.aws/credentials con las claves y ~/.aws/config con la región y el formato de salida. Comprueba sus permisos, ya que las claves dan acceso a tu cuenta:

ls -l ~/.aws/
-rw------- 1 tu_usuario tu_usuario  ... config
-rw------- 1 tu_usuario tu_usuario  ... credentials

Si no aparecen como -rw-------, corrígelos con chmod 600 ~/.aws/credentials ~/.aws/config.

Ahora verifica que las credenciales funcionan. sts get-caller-identity no necesita ningún permiso especial y devuelve la identidad con la que te has autenticado:

aws sts get-caller-identity
{
    "UserId": "AIDAXXXXXXXXXXXXXXXXX",
    "Account": "123456789012",
    "Arn": "arn:aws:iam::123456789012:user/backup-servidor-web"
}

Si el ARN corresponde al usuario que acabas de crear, la configuración es correcta.

Paso 4: Trabajar con varios perfiles

Los perfiles permiten usar varias cuentas o usuarios desde el mismo servidor, por ejemplo uno para producción y otro para pruebas. Crea un perfil adicional:

aws configure --profile pruebas

Los perfiles quedan guardados como secciones en los mismos archivos. ~/.aws/credentials tendrá este aspecto:

[default]
aws_access_key_id = AKIAXXXXXXXXXXXXXXXX
aws_secret_access_key = tu_clave_secreta

[pruebas]
aws_access_key_id = AKIAYYYYYYYYYYYYYYYY
aws_secret_access_key = otra_clave_secreta

En ~/.aws/config, los perfiles que no son el de por defecto llevan el prefijo profile:

[default]
region = eu-west-1
output = json

[profile pruebas]
region = us-east-1
output = table

Lista los perfiles configurados:

aws configure list-profiles
default
pruebas

Usa un perfil concreto con la opción --profile, o con la variable de entorno AWS_PROFILE para toda la sesión:

aws sts get-caller-identity --profile pruebas
export AWS_PROFILE=pruebas

Para ver qué credenciales y región está usando la CLI en este momento, y de dónde salen, ejecuta:

aws configure list
      Name                    Value             Type    Location
      ----                    -----             ----    --------
   profile                  pruebas              env    ['AWS_PROFILE', 'AWS_DEFAULT_PROFILE']
access_key     ****************YYYY shared-credentials-file
secret_key     ****************YYYY shared-credentials-file
    region                us-east-1      config-file    ~/.aws/config

Para volver al perfil por defecto, ejecuta unset AWS_PROFILE.

Paso 5: Controlar el formato de salida

AWS CLI admite los formatos json, text, table y yaml. La opción --query filtra la respuesta con sintaxis JMESPath antes de mostrarla, lo que evita tener que procesar el JSON con otras herramientas.

Por ejemplo, para listar las regiones disponibles en una tabla:

aws ec2 describe-regions --query 'Regions[].RegionName' --output table

Si el usuario tiene permiso de lectura sobre EC2, esta consulta muestra el ID, el tipo, el estado y la IP pública de cada instancia en ejecución:

aws ec2 describe-instances \
  --filters "Name=instance-state-name,Values=running" \
  --query 'Reservations[].Instances[].[InstanceId,InstanceType,State.Name,PublicIpAddress]' \
  --output table

En scripts, --output text es el formato más cómodo, porque devuelve valores separados por tabuladores que se pueden asignar directamente a variables:

CUENTA=$(aws sts get-caller-identity --query Account --output text)
echo "$CUENTA"

Si el usuario no tiene permisos para una operación, recibirás un error AccessDenied o UnauthorizedOperation, que confirma que la política IAM de permisos mínimos funciona.

Paso 6: Sincronizar un directorio con S3

Un uso habitual de AWS CLI en un servidor es enviar copias de seguridad a S3. Crea un bucket. Los nombres de bucket son globales en todo AWS, así que elige uno único, en minúsculas:

aws s3 mb s3://tu-bucket-backups --region eu-west-1
make_bucket: tu-bucket-backups

Una política IAM de permisos mínimos para que el usuario trabaje con este bucket, y solo con él, es la siguiente. Adjúntala al usuario desde IAM > Usuarios > Permisos > Añadir permisos > Crear política insertada en el editor JSON:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "s3:ListBucket",
      "Resource": "arn:aws:s3:::tu-bucket-backups"
    },
    {
      "Effect": "Allow",
      "Action": ["s3:GetObject", "s3:PutObject", "s3:DeleteObject"],
      "Resource": "arn:aws:s3:::tu-bucket-backups/*"
    }
  ]
}

Sube un archivo y lista el contenido del bucket:

echo "prueba" > /tmp/prueba.txt
aws s3 cp /tmp/prueba.txt s3://tu-bucket-backups/prueba.txt
aws s3 ls s3://tu-bucket-backups/
upload: ../tmp/prueba.txt to s3://tu-bucket-backups/prueba.txt
2026-09-25 10:12:03          7 prueba.txt

aws s3 sync copia solo los archivos nuevos o modificados, lo que lo hace adecuado para copias periódicas. Ejecuta primero una simulación con --dryrun para ver qué haría sin transferir nada:

aws s3 sync /var/backups/ s3://tu-bucket-backups/servidor-web/ --exclude "*.tmp" --dryrun

Si la lista es la esperada, repite el comando sin --dryrun. Añade --delete solo si quieres que los archivos borrados en el servidor se eliminen también del bucket; sin esa opción, sync nunca borra nada en el destino.

Para descargar un archivo, invierte el origen y el destino:

aws s3 cp s3://tu-bucket-backups/prueba.txt ./prueba-descargada.txt

Paso 7: Actualizar AWS CLI

El instalador oficial no se actualiza con apt. Para pasar a una versión nueva, descarga de nuevo el ZIP y ejecuta el instalador con --update, indicando las mismas rutas de la instalación original:

cd /tmp
curl -fsSL "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o awscliv2.zip
unzip -q -o awscliv2.zip
sudo ./aws/install --bin-dir /usr/local/bin --install-dir /usr/local/aws-cli --update
aws --version

Solución de problemas

Unable to locate credentials. La CLI no encuentra credenciales para el usuario actual. Ejecuta aws configure list para ver qué está leyendo. Es frecuente al ejecutar la CLI con sudo o desde cron con otro usuario, ya que cada usuario tiene su propio ~/.aws.

An error occurred (SignatureDoesNotMatch) o InvalidClientTokenId. La clave secreta es incorrecta o la clave de acceso se ha desactivado. Crea una nueva clave en IAM, ejecuta aws configure de nuevo y desactiva la antigua.

RequestTimeTooSkewed. El reloj del servidor está desincronizado y AWS rechaza las firmas. Comprueba la sincronización con timedatectl y que systemd-timesyncd está activo.

aws: command not found. Comprueba que existe /usr/local/bin/aws y que /usr/local/bin está en tu PATH con echo "$PATH". Para ver el detalle completo de cualquier error, añade --debug al comando.

Conclusión

Has instalado AWS CLI v2 en Ubuntu 24.04 con el instalador oficial, has configurado un usuario IAM con permisos mínimos, has trabajado con perfiles y consultas --query, y has sincronizado un directorio con S3. Como siguientes pasos puedes programar el aws s3 sync con un temporizador de systemd para tener copias automáticas, activar el versionado del bucket para protegerte de borrados accidentales, o usar IAM Identity Center con aws configure sso si gestionas varias cuentas de AWS.