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
- desde consola:
listado AMI propietarias amazon
aws ec2 describe-images --owners amazon --query 'Images[*].[ImageId,Platform,Description,BlockDeviceMappings[0].Ebs.VolumeSize]' --output table
- desde web: AMI ID ubuntu https://cloud-images.ubuntu.com/locator/ec2/ mas info de encontrar AMI: https://docs.aws.amazon.com/es_es/AWSEC2/latest/UserGuide/finding-an-ami.html
encontramos una AMI con id ami-04ab94c703fb30101
de us-east-1 y amd64
en este caso t2.micro
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
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 comandoaws 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
utilizaaws 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": ""
}
]
}
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
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