Export VM to AWS
Updated at: 31/08/2017


Questi dovrebbero essere i passi per esportare una macchina virtuale create in locale (ad esempio per sfruttare i vantaggi di una configurazione LVM) su Amazon. Questa è la guida ufficiale di riferimento di Amazon, con tutti i vari link che si inseguono: https://aws.amazon.com/ec2/vm-import/ Nella macchina virtuale, installiamo i componenti pre-requisiti:
cd /opt/source
wget https://bootstrap.pypa.io/get-pip.py
sudo python get-pip.py

pip install awscli --upgrade --user
Configuriamo l'accesso solo tramite chiave ssh: http://wiki.sinergo.it/?p=403 Quindi spegniamo la VM e convertiamo il disco in .ova Da VirtualBox: File -> export appliance -> [selezionare la VM] -> Format: OVF 1.0 Carichiamo il file ottenuto nel bucket S3 (nel nostro esmpio, ipotizziamo che il bucket si chiami vm-container) Quindi creiamo una cartella sul nostro PC in cui metteremo alcuni file per interagire con AWS: creiamo il file trust-policy.json (così come segue, non servono modifiche)
{
   "Version": "2012-10-17",
   "Statement": [
      {
         "Effect": "Allow",
         "Principal": { "Service": "vmie.amazonaws.com" },
         "Action": "sts:AssumeRole",
         "Condition": {
            "StringEquals":{
               "sts:Externalid": "vmimport"
            }
         }
      }
   ]
}
Se è la prima volta che usiamo li IAM role, eseguiamo (le volte successive non serve):
~/.local/bin/aws/aws iam create-role --role-name vmimport --assume-role-policy-document file://trust-policy.json
Quindi creaiamo il file role-policy.json
{
   "Version": "2012-10-17",
   "Statement": [
      {
         "Effect": "Allow",
         "Action": [
            "s3:ListBucket",
            "s3:GetBucketLocation"
         ],
         "Resource": [
            "arn:aws:s3:::vm-container"
         ]
      },
      {
         "Effect": "Allow",
         "Action": [
            "s3:GetObject"
         ],
         "Resource": [
            "arn:aws:s3:::vm-container/*"
         ]
      },
      {
         "Effect": "Allow",
         "Action":[
            "ec2:ModifySnapshotAttribute",
            "ec2:CopySnapshot",
            "ec2:RegisterImage",
            "ec2:Describe*"
         ],
         "Resource": "*"
      }
   ]
}
Quindi:
~/.local/bin/aws iam put-role-policy --role-name vmimport --policy-name vmimport --policy-document file://role-policy.json
Infine creiamo il file containers.json
[
  {
    "Description": "Debian 9 ScriptServer",
    "Format": "ova",
    "UserBucket": {
        "S3Bucket": "vm-container",
        "S3Key": "Debian-9-script.ova"
    }
}]
E lanciamo il comando di importazione:
~/.local/bin/aws ec2 import-image --description "Debian 9 ScriptServer" --license-type BYOL --disk-containers file://containers.json
Che ci restituirà un json di cui dobbiamo appuntarci il codice (qualcosa del tipo: "ImportTaskId": "import-ami-fh7oq8qf") Questo codice ci serve per controllare lo stato di avanzamento tramite il comando:
~/.local/bin/aws ec2 describe-import-image-tasks --import-task-ids import-ami-fh7oq8qf
Una volta terminato dobbiamo creare un'istanza nel modo classico dalla console di AWS, scegliendo l'immagine opportuna tre le proprie AMIs