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

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

1 comentario

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.

Sentilo user interface

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.


Error: Your Requested widget " ai_widget-6" is not in the widget list.
  • [do_widget_area above-nav-left]
    • [do_widget_area above-nav-right]
      • [do_widget_area footer-1]
        • [do_widget id="wpp-4"]
      • [do_widget_area footer-2]
        • [do_widget id="recent-posts-4"]
      • [do_widget_area footer-3]
        • [do_widget id="recent-comments-3"]
      • [do_widget_area footer-4]
        • [do_widget id="archives-4"]
      • [do_widget_area logo-bar]
        • [do_widget id="oxywidgetwpml-3"]
      • [do_widget_area menu-bar]
        • [do_widget id="search-3"]
      • [do_widget_area sidebar]
        • [do_widget id="search-4"]
        • [do_widget id="ai_widget-2"]
        • [do_widget id="categories-5"]
        • [do_widget id="ai_widget-3"]
        • [do_widget id="ai_widget-4"]
        • [do_widget id="ai_widget-5"]
      • [do_widget_area sub-footer-1]
        • [do_widget id="text-4"]
      • [do_widget_area sub-footer-2]
        • [do_widget_area sub-footer-3]
          • [do_widget_area sub-footer-4]
            • [do_widget_area upper-footer-1]
              • [do_widget id="search-2"]
              • [do_widget id="recent-posts-2"]
              • [do_widget id="recent-comments-2"]
              • [do_widget id="archives-2"]
              • [do_widget id="categories-2"]
              • [do_widget id="meta-2"]
            • [do_widget_area upper-footer-2]
              • [do_widget_area upper-footer-3]
                • [do_widget_area upper-footer-4]
                  • [do_widget_area widgets_for_shortcodes]
                    • [do_widget id="search-5"]
                    • [do_widget id="ai_widget-6"]
                  • [do_widget_area wp_inactive_widgets]
                    • [do_widget id="wpp-2"]
                    • [do_widget id="text-1"]
                    • [do_widget id="recent-posts-3"]
                    • [do_widget id="categories-3"]
                    • [do_widget id="archives-3"]
                    • [do_widget id="icl_lang_sel_widget-3"]

                  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.

                  Bucket S3 para imagen OVA de Sentilo 1.6

                  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:

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

                  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:::sentilo-test-daniloaz" 
                           ] 
                        }, 
                        { 
                           "Effect": "Allow", 
                           "Action": [ 
                              "s3:GetObject" 
                           ], 
                           "Resource": [ 
                              "arn:aws:s3:::sentilo-test-daniloaz/*" 
                           ] 
                        }, 
                        { 
                           "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

                  Error: Your Requested widget " ai_widget-6" is not in the widget list.
                  • [do_widget_area above-nav-left]
                    • [do_widget_area above-nav-right]
                      • [do_widget_area footer-1]
                        • [do_widget id="wpp-4"]
                      • [do_widget_area footer-2]
                        • [do_widget id="recent-posts-4"]
                      • [do_widget_area footer-3]
                        • [do_widget id="recent-comments-3"]
                      • [do_widget_area footer-4]
                        • [do_widget id="archives-4"]
                      • [do_widget_area logo-bar]
                        • [do_widget id="oxywidgetwpml-3"]
                      • [do_widget_area menu-bar]
                        • [do_widget id="search-3"]
                      • [do_widget_area sidebar]
                        • [do_widget id="search-4"]
                        • [do_widget id="ai_widget-2"]
                        • [do_widget id="categories-5"]
                        • [do_widget id="ai_widget-3"]
                        • [do_widget id="ai_widget-4"]
                        • [do_widget id="ai_widget-5"]
                      • [do_widget_area sub-footer-1]
                        • [do_widget id="text-4"]
                      • [do_widget_area sub-footer-2]
                        • [do_widget_area sub-footer-3]
                          • [do_widget_area sub-footer-4]
                            • [do_widget_area upper-footer-1]
                              • [do_widget id="search-2"]
                              • [do_widget id="recent-posts-2"]
                              • [do_widget id="recent-comments-2"]
                              • [do_widget id="archives-2"]
                              • [do_widget id="categories-2"]
                              • [do_widget id="meta-2"]
                            • [do_widget_area upper-footer-2]
                              • [do_widget_area upper-footer-3]
                                • [do_widget_area upper-footer-4]
                                  • [do_widget_area widgets_for_shortcodes]
                                    • [do_widget id="search-5"]
                                    • [do_widget id="ai_widget-6"]
                                  • [do_widget_area wp_inactive_widgets]
                                    • [do_widget id="wpp-2"]
                                    • [do_widget id="text-1"]
                                    • [do_widget id="recent-posts-3"]
                                    • [do_widget id="categories-3"]
                                    • [do_widget id="archives-3"]
                                    • [do_widget id="icl_lang_sel_widget-3"]

                                  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": "sentilo-test-daniloaz", 
                                          "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": "import-ami-ffi5ogxz" 
                                  }

                                  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 import-ami-ffi5ogxz
                                  { 
                                      "ImportImageTasks": [ 
                                          { 
                                              "StatusMessage": "pending", 
                                              "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": "completed", 
                                              "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:

                                  Imagen AMI de Sentilo 1.6 en AWS EC2
                                  Lanzamiento de AMI EC2 en AWS

                                  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

                                   

                                  Sobre el autor

                                  Daniel López Azaña
                                  Arquitecto de soluciones Cloud AWS & Linux Sysadmin Freelance

                                  Emprendedor, generador de ideas y mente inquieta. Apasionado de las nuevas tecnologías, especialmente de los sistemas Linux y del software libre. Me gusta escribir además sobre actualidad tecnológica, Cloud Computing, AWSi, DevOps, DevSecOps, seguridad, desarrollo web y programación, SEO, ciencia, innovación, emprendimiento, etc.

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

                                  Artículos relacionados

                                  1 comentario

                                  Unirte a la conversación
                                  • abraham moises linares oscco - 31/07/2018 responder

                                    gracias por el post, ha estado muy claro y me resolvio muchas dudas.

                                  Deja una respuesta

                                  Tu dirección de correo electrónico no será publicada.