Daniel López Azaña

Tema

Social Media

Blog

GNU/Linux, Open Source, Cloud Computing, DevOps y más...

Cómo crear en AWS una instancia EC2 de Sentilo desde un fichero OVA

Sentilo logo

Sentilo es una plataforma de código abierto diseñada por openTrends para el intercambio y procesamiento de información procedente de miles de sensores y actuadores , y servir de interfaz entre éstos y las distintas aplicaciones que quieran hacer uso de ellos y de dicha información. Se encuadra así dentro de la arquitectura de ciudades inteligentes o Smart Cities y tiene a la ciudad de Barcelona como principal impulsor. Pero Sentilo no sólo está hecho por y para las ciudades, sino también para cualquier organización que deseé implantar una aplicación IoT que requiera desplegar un número más reducido de sensores y actuadores, como por ejemplo dentro de edificios o en campo abierto.

En este artículo voy a detallar cómo desplegar un servidor de Sentilo 1.6 en un entorno de Cloud Computing como Amazon Web Services creando una instancia EC2 a partir de una AMI que generaremos importando la imagen en formato Open Virtual Appliance (OVA) que se puede descargar de la propia web de Sentilo en https://www.sentilo.io/xwiki/bin/view/Sentilo.Community.Documentation/Use+a+Virtual+Machine.

Dado que el formato OVA es abierto, este procedimiento puede seguirse también para importar en AWS cualquier otra imagen de servidor virtual que no tenga nada que ver con Sentilo.

1. Crear un bucket en S3 y subir el fichero OVA

Para poder importar el fichero OVA es necesario primero subirlo a un bucket existente en Amazon S3 o crear uno nuevo específicamente para este cometido. Ten la precaución de crearlo en la misma región donde quieras que esté disponible la nueva AMI que se va a generar como resultado de este procedimiento.

2. Crear rol IAM llamado vmimport

Se necesita un rol IAM que permita realizar algunas operaciones que vamos a necesitar hacer, como descargar nuestra imagen desde el bucket S3 creado anteriormente. Para ello crearemos el siguiente fichero trust-policy.json en una máquina donde hayamos instalado previamente la herramienta de línea de comandos AWS CLI :

<code class="nohighlight">{
   "Version": "2012-10-17",
   "Statement": [
      {
         "Effect": "Allow",
         "Principal": { "Service": "vmie.amazonaws.com" },
         "Action": "sts:AssumeRole",
         "Condition": {
            "StringEquals":{
               "sts:Externalid": "vmimport"
            }
         }
      }
   ]
}</code>

Para crear este rol en el servicio IAM de nuestra cuenta de AWS ejecutaremos el siguiente comando:

$ aws iam create-role --role-name vmimport --assume-role-policy-document file:///var/tmp/trust-policy.json

Es importante poner el prefijo file:// antes de la ruta completa al fichero que hayamos creado, ya que si no obtendremos un confuso mensaje de error que nos alertará de un inexistente problema de sintaxis en nuestro JSON:

A client error (MalformedPolicyDocument) occurred when calling the CreateRole operation: This policy contains invalid Json

3. Crear fichero con las políticas IAM necesarias y asignárselas al rol vmimport

Para ello crearemos un fichero role-policy.json con el siguiente contenido, aunque sustituyendo el nombre que hayas utilizado para tu propio bucket:

{ 
   "Version": "2012-10-17", 
   "Statement": [ 
      { 
         "Effect": "Allow", 
         "Action": [ 
            "s3:ListBucket", 
            "s3:GetBucketLocation" 
         ], 
         "Resource": [ 
            "arn:aws:s3:::<strong>sentilo-test-daniloaz</strong>" 
         ] 
      }, 
      { 
         "Effect": "Allow", 
         "Action": [ 
            "s3:GetObject" 
         ], 
         "Resource": [ 
            "arn:aws:s3:::<strong>sentilo-test-daniloaz</strong>/*" 
         ] 
      }, 
      { 
         "Effect": "Allow", 
         "Action":[ 
            "ec2:ModifySnapshotAttribute", 
            "ec2:CopySnapshot", 
            "ec2:RegisterImage", 
            "ec2:Describe*" 
         ], 
         "Resource": "*" 
      } 
   ] 
}

Asignaremos estas políticas a nuestro rol vmimport con el siguiente comando:

$ aws iam put-role-policy --role-name vmimport --policy-name vmimport --policy-document file:///var/tmp/role-policy.json

4. Crear fichero con la descripción de la imagen OVA de Sentilo y generar AMI

Crearemos un fichero containers.json con la información de la imagen de Sentilo con el siguiente formato, de nuevo poniendo el nombre de tu bucket S3:

[ 
  { 
    "Description": "Sentilo OVA", 
    "Format": "ova", 
    "UserBucket": { 
        "S3Bucket": "<strong>sentilo-test-daniloaz</strong>", 
        "S3Key": "Sentilo_160.ova" 
    } 
}]

A continuación importaremos la imagen OVA con el siguiente comando:

$ aws ec2 import-image --description "Sentilo" --license-type BYOL --disk-containers file:///var/tmp/containers.json
{ 
    "StatusMessage": "pending", 
    "Description": "Sentilo", 
    "Progress": "2", 
    "LicenseType": "BYOL", 
    "SnapshotDetails": [ 
        { 
            "UserBucket": { 
                "S3Bucket": "sentilo-test-daniloaz", 
                "S3Key": "Sentilo_160.ova" 
            }, 
            "Format": "OVA", 
            "DiskImageSize": 0.0 
        } 
    ], 
    "Status": "active", 
    "ImportTaskId": "<strong>import-ami-ffi5ogxz</strong>" 
}

Esto lanzará una tarea que tardará unos 15 ó 20 minutos en completarse en el caso de Sentilo, con una imagen que ocupa 1,4 GB. Podemos comprobar el progreso de dicha tarea con este otro comando, sustituyendo el identificador de la tarea que muestra la salida del anterior comando y que he resaltado en negrita:

$ aws ec2 describe-import-image-tasks --import-task-ids <strong>import-ami-ffi5ogxz
</strong>{ 
    "ImportImageTasks": [ 
        { 
            "StatusMessage": "<strong>pending</strong>", 
            "LicenseType": "BYOL", 
            "SnapshotDetails": [ 
                { 
                    "DiskImageSize": 0.0, 
                    "Format": "OVA", 
                    "UserBucket": { 
                        "S3Bucket": "sentilo-test-daniloaz", 
                        "S3Key": "Sentilo_160.ova" 
                    } 
                } 
            ], 
            "Status": "active", 
            "Description": "Sentilo", 
            "ImportTaskId": "import-ami-ffi5ogxz", 
            "Progress": "2" 
        } 
    ] 
}

La tarea permenecerá en estado active con StatusMessage: «pending» hasta que finalice. El atributo Progress nos indicará el porcentaje de progreso que se ha llevado a cabo hasta ese momento. La tarea habrá terminado cuando el estado pase a completed y el comando anterior muestre información adicional sobre la imagen ya transformada a formato AMI:

$ aws ec2 describe-import-image-tasks --import-task-ids import-ami-ffi5ogxz 
{ 
    "ImportImageTasks": [ 
        { 
            "LicenseType": "BYOL", 
            "ImportTaskId": "import-ami-ffi5ogxz", 
            "SnapshotDetails": [ 
                { 
                    "Format": "VMDK", 
                    "UserBucket": { 
                        "S3Key": "Sentilo_160.ova", 
                        "S3Bucket": "sentilo-test-daniloaz" 
                    }, 
                    "DiskImageSize": 1518814208.0, 
                    "SnapshotId": "snap-04b129e4803099b8b", 
                    "DeviceName": "/dev/sda1" 
                } 
            ], 
            "Architecture": "x86_64", 
            "Status": "<strong>completed</strong>", 
            "ImageId": "ami-d3706fb5", 
            "Platform": "Linux", 
            "Description": "Sentilo" 
        } 
    ] 
}

A partir de ese momento dispondremos de una nueva AMI disponible en la misma región en la que creamos el bucket de S3 y ya estará lista para ser usada para lanzar una nueva instancia EC2 basada en ella:

Como se ve en la anterior captura, es posible lanzar cualquier tipo de instancia EC2, incluso una t2.nano, por lo que podremos montar un entorno de desarrollo/pruebas de Sentilo mínimo con unos costes muy reducidos.

5. Acceder a la nueva instancia de Sentilo

Para finalizar, una vez lanzada la instancia podremos acceder fácilmente a ella mediante SSH, pero teniendo en cuenta que aunque a la hora de lanzar la instancia se nos haya pedido seleccionar el par de claves RSA de AWS que usaremos para conectarnos a ella, en realidad la imagen de Sentilo viene preparada para conectar usando usuario/contraseña en lugar de claves. Las credenciales de acceso son las siguientes:

  • Usuario: sentilo
  • Contraseña: sentilo

Para acceder como root usaremos el comando « sudo su -« y a continuación introduciremos la misma contraseña: sentilo

$ ssh sentilo@ec2-54-246-129-172.eu-west-1.compute.amazonaws.com 
sentilo@ec2-54-246-129-172.eu-west-1.compute.amazonaws.com's password:  
Welcome to Ubuntu 14.04.2 LTS (GNU/Linux 3.16.0-30-generic i686) 
 
 * Documentation:  https://help.ubuntu.com/ 
 
  System information as of Tue Jun 13 15:43:02 BST 2017 
 
  System load:  0.18              Processes:           84 
  Usage of /:   50.0% of 4.51GB   Users logged in:     0 
  Memory usage: 68%               IP address for eth0: 172.31.36.204 
  Swap usage:   0% 
 
  Graph this data and manage this system at: 
    https://landscape.canonical.com/ 
 
New release '16.04.2 LTS' available. 
Run 'do-release-upgrade' to upgrade to it. 
 
Last login: Tue Jun 13 15:43:03 2017 from 21.red-79-151-30.dynamicip.rima-tde.net 
sentilo@sentilo:~$
sentilo@sentilo:~$ sudo su - 
[sudo] password for sentilo:  
root@sentilo:~#

Más información sobre cómo importar una máquina virtual a una AMI de Amazon EC2 aquí:

https://docs.aws.amazon.com/vm-import/latest/userguide/vmimport-image-import.html

AWS EC2 IAM IoT Sentilo
Daniel López Azaña

Sobre el autor

Daniel López Azaña

Emprendedor tecnológico y arquitecto cloud con más de 20 años de experiencia transformando infraestructuras y automatizando procesos.

Especialista en integración de IA/LLM, desarrollo con Rust y Python, y arquitectura AWS & GCP. Mente inquieta, generador de ideas y apasionado por la innovación tecnológica y la IA.

Artículos relacionados

Volumen raíz de AWS EBS más pequeño y dividido en particiones

Particionar y cambiar el tamaño del volumen raíz EBS de una instancia AWS EC2

Una de las pocas cosas que no me gustan del servicio EC2 de Amazon Web Services es que todas las imágenes o AMI’s disponibles a partir de las cuales lanzar una nueva instancia requieren un volumen raíz o root volume de un mínimo de 8 ó 10 GB y todos ellos cuentan además con una única partición donde se monta el sistema de ficheros raíz con todos sus directorios.En mi artículo La importancia de particionar correctamente un disco en Linux ya discutí por qué este enfoque no me parece adecuado y en este artículo voy a abordar cómo dividir dichos volúmenes en varias particiones conservando el tamaño base de 8-10 GB o haciéndolos incluso más pequeños para ahorrar costes en caso de que queramos montar servidores más pequeños que no necesiten tanto espacio de almacenamiento.

8 de julio de 2017
AWS security groups

Cómo actualizar automáticamente todos nuestros grupos de seguridad EC2 de AWS cuando nuestra IP dinámica cambia

Uno de los mayores fastidios cuando trabajamos con AWS y nuestra conexión a Internet tiene IP dinámica es que cuándo ésta cambia, automáticamente dejamos de tener acceso a todos los servidores y servicios que habíamos protegido mediante un grupo de seguridad EC2 cuyas reglas sólo permiten el tráfico a ciertas IP’s específicas en lugar de abrir las conexiones a todo el mundo (0.0.0.0/0).Ciertamente lo más sencillo es siempre indicar en el grupo de seguridad que permitimos el tráfico en un puerto a todo el mundo, de modo que aunque tengamos IP dinámica en nuestra conexión a Internet siempre podremos continuar accediendo aunque ésta cambie. Pero abrir el tráfico a un puerto a todo el mundo no es la forma correcta de proceder desde el punto de vista de la seguridad, pues entonces cualquier atacante podrá tener acceso a ese puerto sin restricciones, y eso no es lo que queremos.

12 de enero de 2021
Script para cambiar automáticamente todos los volúmenes gp2 a gp3 con aws-cli

Script para cambiar automáticamente todos los volúmenes gp2 a gp3 con aws-cli

El pasado diciembre Amazon anunció sus nuevos volúmenes EBS gp3, los cuales ofrecen mejores prestaciones y un ahorro en el coste del 20% respecto a los que se venían utilizando hasta ahora, los gp2. Pues bien, tras probar satisfactoriamente estos nuevos volúmenes en varios clientes, no puedo hacer otra cosa más que recomendar su utilización, pues son todo ventajas y en estos 2 meses y medio que han transcurrido desde el anuncio no he apreciado ningún problema ni efecto secundario.

16 de febrero de 2021

Comentarios

abraham moises linares oscco 31 de julio de 2018
gracias por el post, ha estado muy claro y me resolvio muchas dudas.

Enviar comentario