Skip to content

Instantly share code, notes, and snippets.

@sosan
Created January 28, 2024 23:57
Show Gist options
  • Save sosan/9ea483d8fbc01e7b11d3d12bd8e47b96 to your computer and use it in GitHub Desktop.
Save sosan/9ea483d8fbc01e7b11d3d12bd8e47b96 to your computer and use it in GitHub Desktop.

NOTA: Saberse las casi 900 paginas de comandos del aws, no tiene demasiado valor para un desarrollador, pero aqui estan un par de comandos del aws cli con localstack

video al que hace referencia de Midudev https://www.youtube.com/watch?v=zQyrhjEAqLs

esqueleto para lanzar instancia EC2 de tipo t2.micro en este caso con public ip:

aws ec2 run-instances \
--image-id <ami-imagen-id> \
--instance-type <tipo-instancia> \
--subnet-id <subnet-id> \
--security-group-ids <security-group-id> \
--associate-public-ip-address \
--key-name <key-name>

pero antes necesitaremos par de claves para poder conectarnos al ec2

aws ec2 create-key-pair \
    --key-name acceso-ec2-localstack \
    --query 'KeyMaterial' \
    --output text | tee acceso-ec2-localstack.pem

AMI Imagen ID

  • desde consola:

listado AMI propietarias amazon

aws ec2 describe-images --owners amazon --query 'Images[*].[ImageId,Platform,Description,BlockDeviceMappings[0].Ebs.VolumeSize]' --output table

encontramos una AMI con id ami-04ab94c703fb30101 de us-east-1 y amd64

Tipo de instancia

en este caso t2.micro

Subnet ID

segun en la zona que estemos en la config de aws cli, mostrara diferentes zonas

aws ec2 describe-subnets --query "Subnets[*].[AvailabilityZone, SubnetId]" --output table

resultado:

-----------------------------------
|         DescribeSubnets         |
+-------------+-------------------+
|  us-east-1a |  subnet-84d8b3d1  |
|  us-east-1b |  subnet-f20d2c43  |
|  us-east-1c |  subnet-96dcee33  |
|  us-east-1d |  subnet-6102aa12  |
|  us-east-1e |  subnet-2f2ba7a7  |
|  us-east-1f |  subnet-0fca10a9  |
+-------------+-------------------+

por ejemplo usaremos el us-east-1a | subnet-84d8b3d1

Grupo de Seguridad ID

Los grupos de seguridad de AWS se pueden generar o asignar a grupos de seguridad ya existentes.

  • Generar un nuevo grupo de seguridad: Localstack solo permite el grupo default :( . En entorno mas real, el grupo se genera para asignarle reglas personalizadas que determinen el tráfico in/out. Para crear un nuevo grupo de seguridad, se usa el comando aws ec2 create-security-group.
  • Asignar un grupo de seguridad existente: Cuando asignas el grupo de seguridad, tambien asignas las reglas predefinidas en ese grupo. Si quieres añadirle mas reglas al grupo default utiliza aws ec2 authorize-security-group-ingress

De momento, localstack solo acepta el grupo default, solo hay 1, tiramos el comando y que liste todo:

aws ec2 describe-security-groups --output table
-------------------------------------------------
|            DescribeSecurityGroups             |
+-----------------------------------------------+
||               SecurityGroups                ||
|+--------------+------------------------------+|
||  Description |  default VPC security group  ||
||  GroupId     |  sg-3cd17e95ec9ce695e        ||
||  GroupName   |  default                     ||
||  OwnerId     |  000000000000                ||
||  VpcId       |  vpc-1888ed0e                ||
|+--------------+------------------------------+|
|||            IpPermissionsEgress            |||
||+-----------------------------+-------------+||
|||  IpProtocol                 |  -1         |||
||+-----------------------------+-------------+||
||||                IpRanges                 ||||
|||+-----------------+-----------------------+|||
||||  CidrIp         |  0.0.0.0/0            ||||
|||+-----------------+-----------------------+|||

nos quedamos el dato GroupId | sg-3cd17e95ec9ce695e

en el video abre un servidor web python, nos quedaria añadir regla para abrir puerto 8080:

aws ec2 authorize-security-group-ingress \
    --group-id default \
    --port 8080 \
    --protocol tcp \
    --cidr 0.0.0.0/0

resultado:

{
    "Return": true,
    "SecurityGroupRules": [
        {
            "SecurityGroupRuleId": "sgr-10c05653ea061a736",
            "GroupId": "sg-3cd17e95ec9ce695e",
            "GroupOwnerId": "000000000000",
            "IsEgress": false,
            "IpProtocol": "tcp",
            "FromPort": 8080,
            "ToPort": 8080,
            "CidrIpv4": "0.0.0.0/0",
            "Description": ""
        }
    ]
}

Keyname o Asociar la key SSH

en el esqueleto se utiliza el argumento --key-name para poder asociar la clave ssh al ec2. en nuestro caso, la key es acceso-ec2-localstack para acceder al ec2 atraves de ssh

Final

rellenamos datos:

aws ec2 run-instances \
  --image-id ami-04ab94c703fb30101 \
  --instance-type t2.micro \
  --subnet-id subnet-84d8b3d1 \
  --security-group-ids sg-3cd17e95ec9ce695e \
  --associate-public-ip-address \
  --key-name acceso-ec2-localstack

se podria usar --user-data para que al arrancar la maquina ejecute el archivo, pero el video no lo utiliza, se conecta atraves de ssh

resultado:

...
"Instances": [
{
  "AmiLaunchIndex": 0,
  "ImageId": "ami-04ab94c703fb30101",
  "InstanceId": "i-64cff8226e44dd23d",
  "InstanceType": "t2.micro",
  "Placement": {
      "AvailabilityZone": "us-east-1a",
      "GroupName": "",
      "Tenancy": "default"
  },
  "PrivateDnsName": "ip-172-31-0-4.ec2.internal",
  "PrivateIpAddress": "172.31.0.4",
  "PublicDnsName": "ec2-54-214-129-131.compute-1.amazonaws.com",
  "PublicIpAddress": "54.214.129.131",
  ...
aws ec2 describe-instance-status --instance-ids i-64cff8226e44dd23d --output table

resultado:

-----------------------------------------------
|           DescribeInstanceStatus            |
+---------------------------------------------+
||             InstanceStatuses              ||
|+-------------------+-----------------------+|
|| AvailabilityZone  |      InstanceId       ||
|+-------------------+-----------------------+|
||  us-east-1a       |  i-64cff8226e44dd23d  ||
|+-------------------+-----------------------+|
|||              InstanceState              |||
||+----------------+------------------------+||
|||      Code      |         Name           |||
||+----------------+------------------------+||
|||  16            |  running               |||
||+----------------+------------------------+||
|||             InstanceStatus              |||
||+-------------------------+---------------+||
|||  Status                 |  ok           |||
||+-------------------------+---------------+||
||||                Details                ||||
|||+-----------------------+---------------+|||
||||         Name          |    Status     ||||
|||+-----------------------+---------------+|||
||||  reachability         |  passed       ||||
|||+-----------------------+---------------+|||
|||              SystemStatus               |||
||+-------------------------+---------------+||
|||  Status                 |  ok           |||
||+-------------------------+---------------+||
||||                Details                ||||
|||+-----------------------+---------------+|||
||||         Name          |    Status     ||||
|||+-----------------------+---------------+|||
||||  reachability         |  passed       ||||
|||+-----------------------+---------------+|||

ahora nos queda conectarnos saber a que puerto nos conectamos, con la version PRO aparece el puerto mapeado listamos los ultimos 100 logs con:

docker logs --tail 100 localstack

resultado:

Instance i-64cff8226e44dd23d will be accessible via SSH at: 127.0.0.1:12862, 172.17.0.4:22
Instance i-64cff8226e44dd23d port mappings (container -> host): {'8080/tcp': 29043, '22/tcp': 12862}

conectamos al ec2:

ssh -p 12862 -i acceso-ec2-localstack.pem root@localhost

desde la shell lanzamos actualizacion, instalacion de python3, y lanzamos el servidor http

apt update; apt install python3 -y; python3 -m http.server 8000

para borrar la instancia

aws ec2 terminate-instances --instance-ids i-64cff8226e44dd23d
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment