Comandos Frecuentes AWS CLI

De Luis Moreno Wiki
Ir a la navegación Ir a la búsqueda

Comandos Frecuentes AWS CLI

Recuerda buscar con CTRL+F con acentos y sin acentos, a veces lo escribía con teclado en inglés y no era fácil poner los acentos.
Por ejemplo si quieres ver como se pone una ip fija en CentOS busca "direccion" así sin acento y vas saltando entre las respuestas hasta que encuentres lo que buscas.


Los comandos más comunes en AWS CLI


Es una compilación de comandos AWS CLI que fui haciendo mientras aprendía y que aún uso de referencia, espero que también les sirva a ustedes tanto como me ha servido a mí.

Lo primero que se debe hacer es instalar y configurar AWS CLI


-- configurar las llaves

aws configure

-- Conocer el ID de la cuenta actual

aws sts get-caller-identity --query 'Account' --output text

868765432181

-- Ver el alias de la cuenta o el nombre amistoso que se le da a la cuenta

aws iam list-account-aliases --query 'AccountAliases[0]' --output text

-- identificar con que cuenta estamos trabajando tipo whoami en linux

aws sts get-caller-identity

El resultado será un json con más o menos la siguiente información:

{
   "UserId": "AIDA52SZJW52SZM5KLUIS",
   "Account": "868765432181",
   "Arn": "arn:aws:iam::868765432181:user/hackvolution"
}

-- Describir los trails de la cuenta

aws cloudTrail describe-trails

-- Obtener el estado de un trail

aws cloudTrail get-trail-status --name arn:aws:cloudtrail:us-east-1:053329225524:trail/kolibers-cloudtrail-org-prod-security

-- Listar las cuentas que forman parte de la organización

 aws organizations list-accounts

-- Listar todos los usuarios de una cuenta y filtrar por el usuario que en su nombre contenga "luis", por favor nota que las comillas del nombre son backticks como se les conoce en inglés o comilla invertida, no es la comilla simple.

aws iam list-users --query 'Users[?contains(UserName, `luis`)].UserName' --output text  

-- hacer grep a una salida de AWS CLI

 aws iam list-users |grep luis

-- Listar todas las access keys de una cuenta

for user in $(AWS IAM list-users --output-text | awk '{print $NF}'); do 
    aws iam list-access-keys --user $user --output text; 
done

-- Listar todas las access keys de una cuenta, si tienes más de un perfil agregar la opción --profile

for user in $(AWS IAM list-users --output-text --profile miperfil2aws | awk '{print $NF}'); do 
    aws iam list-access-keys --user $user --output text --profile miperfil2aws; 
done

-- Listar los buckets s3 que hay en la cuenta (o a los que tienes acceso)

aws s3 ls

-- Listar los archivos de un bucket

aws s3 ls s3://el-nombre-de-tu-bucket/

-- calcular el tamaño del bucket

aws s3 ls s3://el-nombre-de-tu-bucket --recursive --human-readable --summarize

Te dará una salida como la siguiente:

2022-02-22 11:04:13    121Kib Bytes archivos_importantes/0054321.csv
2022-02-22 11:04:21  57.9 MiB Bytes archivos_importantes/hackvolution_ai-x000.csv
2022-02-22 11:04:40         0 Bytes archivos_importantes_kolibers/_EXITO
2022-02-22 11:04:40         0 Bytes media_kolibers/registros_27000.csv
2022-02-22 11:04:40       147 Bytes archivos_importantes_/hvt_20230404.csv
Total Objects: 2486
  Total Size: 3.4 GiB

-- Listar todos los delivery streams de Kinesis:

aws firehose list-delivery-streams

-- Describir delivery streams específicos

aws firehose describe-delivery-stream --delivery-stream-name nombre-del-delivery-stream

-- Listar todos los waf de una cuenta

aws wafv2 list-web-acls --scope REGIONAL 

-- Listar todos los grupos de CloudWatch

aws logs describe-log-groups

-- Listar los log streams dentro de un grupo:

aws logs describe-log-streams --log-group-name tu-log-group-del-waf

-- Para ver los logs de un stream específico usa el siguiente comando:

aws logs get-log-events --log-group-name mis-logs-waf --log-stream-name "us-east-1_prod-APIWAFy_9"

-- Obtener los nombres de dominio asociados a un API Gateway

aws apigatewayv2 get-domain-names

-- Para solo filtrar el elemento DomainName del json del comando anterior se puede emplear la herramienta jq de la siguiente forma:

aws apigatewayv2 get-domain-names| jq '.Items[].DomainName'


-- ver el contenido de la política

aws iam get-policy-version --policy-arn arn:aws:iam::123456789012:policy/AllowCreateEnableMFA --version-id v2 --query 'PolicyVersion.Document' --output json 

-- ver la versión de la política contenido de una política

aws iam get-policy --policy-arn arn:aws:iam::123456789012:policy/AllowCreateEnableMFA --query 'Policy.DefaultVersionId' --output text

-- que políticas están vinculadas al usuario

aws iam list-user-policies --user-name mi-usuario-aws

-- que políticas in line están vinculadas al usuario

aws iam list-attached-user-policies --user-name mi-usuario-aws

-- crear una nueva versión de la política, actualizar la política y ponerla como default

aws iam create-policy-version --policy-arn arn:aws:iam::123456789012:policy/AllowCreateEnableMFA --policy-document file://habilitar-mfa.json --set-as-default 

-- Traer la versión específica de la política aws iam get-policy-version --policy-arn arn:aws:iam::123456789012:policy/AllowCreateEnableMFA --version-id v1 --query 'PolicyVersion.Document' --output json

-- Listar que que SCP existen

aws organizations list-policies --filter SERVICE_CONTROL_POLICY --max-items 25 

Es posible cambiar el número de elementos en el ejemplo se usaron 25

-- Encontrar que políticas SCP aplican para una cuenta en particular -- El primer paso es listar todas las cuentas en la organización

aws organizations list-accounts

-- Busca la cuenta de la cuál quieras saber sus datos y anota su id, con el id ahora buscaremos a que OU o unidad organizational pertenece, por ejemplo el id en este caso es: 123456789012

aws organizations list-parents --child-id 123456789012

-- Nuevamente anotar el id que aparece de la OU por ejemplo en este caso ou-klbr-srebil0k y ejecutar el siguiente comando

aws organizations list-policies-for-target --target-id ou-klbr-srebil0k --filter SERVICE_CONTROL_POLICY 

Si existen políticas aplicadas para esta OU se mostraran a continuación.

-- También es posible que la política esté aplicada directamente para una cuanta en particular, para este caso ejecutar el comando:

aws organizations list-policies-for-target --target-id 123456789012 --filter SERVICE_CONTROL_POLICY

-- Listar todos los nombres de las cuentas que existen en la organización y solo mostrar el ID y el nombre en la misma línea

aws organizations list-accounts |jq -r '.Accounts[] | "\(.Id) - \(.Name)"'

Es posible agregarle el parámetro --profile account-master es para usar las credenciales de la cuenta master o principal.

-- Crear un dispositivo MFA

aws iam create-virtual-mfa-device --virtual-mfa-device-name mi-dispositivo-MFA --bootstrap-method QRCodePNG --outfile CodigoQR.png
{
    "VirtualMFADevice": {
        "SerialNumber": "arn:aws:iam::123456789012:mfa/mi-dispositivo-MFA"
    }
}

-- Habilitar un dispositivo MFA

aws iam enable-mfa-device --user-name mi-dispositivo-MFA --serial-number arn:aws:iam::123456789012:mfa/mi-dispositivo-MFA --authentication-code-1 866541 --authentication-code-2 987645

-- Vincular el dispositivo con el usuario

aws iam attach-user-policy --user-name mi-usuario-AWS --policy-arn arn:aws:iam::123456789012:policy/AllowCreateEnableMFA 

-- Crear el archivo de política con tu editor favorito

vi habilitar-mfa.json
   {
       "Policy": {
           "PolicyName": "AllowCreateEnableMFA",
           "PolicyId": "ABCDEFGHI5LUISN74EMXX",
           "Arn": "arn:aws:iam::123456789012:policy/AllowCreateEnableMFA",
           "Path": "/",
           "DefaultVersionId": "v1",
           "AttachmentCount": 0,
           "PermissionsBoundaryUsageCount": 0,
           "IsAttachable": true,
           "CreateDate": "2023-04-21T23:40:35+00:00",
           "UpdateDate": "2023-04-21T23:40:35+00:00"
       }
   }

-- Crear la política con el archivo recién creado

aws iam create-policy --policy-name AllowCreateEnableMFA --policy-document file://habilitar-mfa.json

-- Listar todas las cuentas AWS en la organización

aws organizations list-accounts 

La salida es algo similar a esto:

{
   "Accounts": [
       {
           "Id": "111111111111",
           "Arn": "arn:aws:organizations::999999999999:account/o-3x69pob97t/111111111111",
           "Email": "aws-tools@kolibers.com",
           "Name": "tools",
           "Status": "ACTIVE",
           "JoinedMethod": "CREATED",
           "JoinedTimestamp": "2020-05-27T13:36:19.045000-06:00"
       },
       {
           "Id": "222222222222",
           "Arn": "arn:aws:organizations::999999999999:account/o-3x69pob97t/222222222222",
           "Email": "aws-onekolibers-nonprod@kolibers.com",
           "Name": "onekolibers-nonprod",
           "Status": "ACTIVE",
           "JoinedMethod": "CREATED",
           "JoinedTimestamp": "2023-01-28T15:40:25.079000-06:00"
       },
       {
           "Id": "333333333333",
           "Arn": "arn:aws:organizations::999999999999:account/o-3x69pob97t/333333333333",
           "Email": "aws-integrations-prod@kolibers.com",
           "Name": "integrations-prod",
           "Status": "ACTIVE",
           "JoinedMethod": "CREATED",
           "JoinedTimestamp": "2022-01-25T10:38:07.487000-06:00"
       },
       {
           "Id": "444444444444",
           "Arn": "arn:aws:organizations::999999999999:account/o-3x69pob97t/444444444444",
           "Email": "aws-security@kolibers.com",
           "Name": "security",
           "Status": "ACTIVE",
           "JoinedMethod": "CREATED",
           "JoinedTimestamp": "2022-04-27T13:40:07.647000-06:00"
       }
   ]
}

-- Para listar solo los números de cuenta, para este ejemplo usamos jq una utilería para trabajar con archivos json.

aws organizations list-accounts  |jq -r '.Accounts[] | .Id' 

-- Listar todas las cuentas en la organización y si nombre amigable a un lado, para este ejemplo usamos jq una utilería para trabajar con archivos json, el parámetro --profile cuenta-master es opcional será de acuerdo a tu archivo de configuración.

aws organizations list-accounts --profile cuenta-master |jq -r '.Accounts[] | "\(.Id) - \(.Name)"' 

Ahora la salida es algo similar a esto:

111111111111 - tools
222222222222 - onekolibers-nonprod
333333333333 - integrations-prod
444444444444 - security

El resultado se puede pegar en un archivo de texto para futura referencia o se puede guardar en un archivo de texto desde la misma línea de comandos como se ve a continuación (el parámetro --profile cuenta-master es opcional será de acuerdo a tu archivo de configuración.) :

aws organizations list-accounts --profile cuenta-master |jq -r '.Accounts[] | "\(.Id) - \(.Name)"' > cuentas.txt

-- Como obtener los contactos alternativos de una cuenta en la organización

aws account get-alternate-contact --alternate-contact-type=SECURITY --account-id 123456789012

Se obtendrá una salida como la siguiente:

{
    "AlternateContact": {
        "AlternateContactType": "SECURITY",
        "EmailAddress": "lmoreno@kolibers.com",
        "Name": "Luis Moreno",
        "PhoneNumber": "+525558765432",
        "Title": "Cloud Security Architect"
    }
}

-- Cómo cambiar los contactos alternativos de AWS desde la línea de comandos, si el comando funciona bien, no produce ninguna salida.

aws account put-alternate-contact \
   --account-id $word \
   --alternate-contact-type=SECURITY \
   --email-address=lmoreno@kolibers.com \
   --name="Luis Moreno" \
   --phone-number="+525566778899" \
   --title="Cloud Security Architect"

-- Cómo cambiar los contactos administrativos para toda la organización, primero deberás obtener una lista de todas las cuentas con uno de los comandos que están arriba y luego emplear un poco de Linux command Fu como se muestra a continuación. Para confirmar los cambios ejecutar el comando anterior en alguna de las cuentas.

for cuentas in `cat accounts-numbers.txt`; do aws account put-alternate-contact \
   --account-id $cuentas \
   --alternate-contact-type=SECURITY \
   --email-address=lmoreno@kolibers.com \
   --name="Luis Moreno" \
   --phone-number="+525566778899" \
   --title="Cloud Security Architect" \
   ; done;