Comment utiliser VM Import/Export pour exporter une machine virtuelle basée sur mon Amazon Machine Image (AMI) ?

Dernière mise à jour : 03/03/2021

Je souhaite exporter une copie de mon Amazon Machine Image (AMI) en tant que machine virtuelle (VM) pour la déployer dans mon environnement de virtualisation sur site. Comment utiliser VM Import/Export pour cela ?

Brève description

Vous pouvez utiliser l'interface de ligne de commande AWS (AWS CLI) pour lancer une tâche d'exportation d'images à l'aide de VM Import/Export. Ensuite, une copie de votre Amazon Machine Image (AMI) est exportée sous forme de fichier de machine virtuelle et écrite dans un compartiment Amazon Simple Storage Service (Amazon S3). Vous pouvez utiliser la machine virtuelle exportée pour déployer une nouvelle instance standardisée dans votre environnement de virtualisation sur site. Vous pouvez exporter la plupart des AMI vers Citrix Xen, Microsoft Hyper-V ou VMware vSphere.

Remarque : si vous recevez des erreurs lors de l'exécution de commandes AWS CLI, assurez-vous que vous utilisez la version la plus récente d'AWS CLI.

Avant de commencer les étapes de résolution suivantes, procédez comme suit :

Résolution

1.    Créez une AMI basée sur Amazon Elastic Block Store (Amazon EBS) à partir de l'instance EC2 que vous souhaitez exporter.

Pour Linux, consultez Création d'une AMI Linux basée sur Amazon EBS.

Pour Windows, consultez Création d'une AMI Windows personnalisée.

2.    Installez l'AWS CLI sur une machine cliente et configurez-la avec les informations d'identification AWS générées pour votre utilisateur IAM.

3.    Créez un nouveau compartiment S3 dans la même région AWS que l'AMI que vous envisagez d'exporter.

4.     Créez le rôle de service requis. Comme condition préalable, assurez-vous d' activer le service AWS Security Token Service (AWS STS) dans la région où vous utilisez VM Import/Export.

Pour créer le rôle de service, créez d'abord un fichier nommé trust-policy.json sur votre ordinateur, puis ajoutez la stratégie suivante au fichier :

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

Exécutez la commande create-role pour créer un rôle nommé vmimport en utilisant le fichier trust-policy.json pour accorder à VM Import/Export l'accès au rôle :

aws iam create-role --role-name vmimport --assume-role-policy-document "file://C:\import\trust-policy.json"

Remarque : dans l'exemple précédent, assurez-vous de spécifier le chemin complet vers l'emplacement du fichier trust-policy.json que vous avez créé. Assurez-vous d'inclure le préfixe file://.

Créez un autre fichier nommé role-policy.json sur votre ordinateur et ajoutez la stratégie suivante au fichier. Remplacez my-export-bucket par votre nom de compartiment S3.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetBucketLocation",
                "s3:GetObject",
                "s3:ListBucket",
                "s3:PutObject",
                "s3:GetBucketAcl"
            ],
            "Resource": [
                "arn:aws:s3:::my-export-bucket",
                "arn:aws:s3:::my-export-bucket/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "ec2:ModifySnapshotAttribute",
                "ec2:CopySnapshot",
                "ec2:RegisterImage",
                "ec2:Describe*"
            ],
            "Resource": "*"
        }
    ]
}

Utilisez la commande put-role-policy pour attacher la stratégie role-policy.json au rôle vmimport que vous avez créé précédemment :

aws iam put-role-policy --role-name vmimport --policy-name vmimport --policy-document "file://C:\import\role-policy.json"

Dans l'exemple précédent, assurez-vous de spécifier le chemin d'accès complet vers l'emplacement du fichier role-policy.json.

Remarque : les futures mises à jour de VM Import/Export peuvent nécessiter des autorisations supplémentaires dans le rôle vmimport. Reportez-vous à l'exemple de stratégie dans la documentation du rôle de service requis pour obtenir l'exemple le plus récent des autorisations requises.

5.    Depuis l'ordinateur client sur lequel vous avez installé AWS CLI, exécutez la commande AWS CLI export-image pour lancer la tâche d'exportation d'image :

aws ec2 export-image --image-id ami-id --disk-image-format VMDK --s3-export-location S3Bucket=my-export-bucket,S3Prefix=exports/

Remarque : dans l'exemple précédent, remplacez ami-id par votre ID AMI. Choisissez le format d'image disque souhaité (VMDK, RAW ou VHD). Remplacez my-export-bucket par votre nom de compartiment S3. Le fichier exporté est écrit dans le compartiment S3 que vous avez spécifié en utilisant la clé S3 prefixexport-ami-id.format (par exemple, my-export-bucket/exports/export-ami-1234567890abcdef0.vmdk). Vous pouvez ajouter un préfixe au fichier exporté.

Si la demande est réussie, la sortie de la commande export-image renvoie des détails sur la tâche, y compris un ID de tâche d'exportation d'image, comme le montre l'exemple suivant :

{
    "DiskImageFormat": "vmdk",
    "ExportImageTaskId": "export-ami-1234567890abcdef0"
    "ImageId": "ami-1234567890abcdef1",
    "RoleName": "vmimport",
    "Progress": "0",
    "S3ExportLocation": {
        "S3Bucket": "my-export-bucket",
        "S3Prefix": "exports/"
    },
    "Status": "active",
    "StatusMessage": "validating"
}

6.    Pour vérifier l'état de votre tâche d'exportation d'image, exécutez la commande AWS CLI describe-export-image-tasks.

Exemple

aws ec2 describe-export-image-tasks --export-image-task-id export-ami-id

Remarque : dans l'exemple précédent, remplacez export-ami-id par l'ID de la tâche d'exportation d'image de la sortie de la commande export-image.

La sortie de la commande describe-export-image-tasks renvoie des détails sur la progression et l'état général de la tâche. L'exemple de sortie suivant concerne une tâche d'exportation d'image en état actif et en cours :

{
    "ExportImageTasks": [
        {
            "ExportImageTaskId": "export-ami-1234567890abcdef0"
            "Progress": "21",
            "S3ExportLocation": {
                "S3Bucket": "my-export-bucket",
                "S3Prefix": "exports/"
            },
            "Status": "active",
            "StatusMessage": "updating"
        }
    ]
}

7.    Lorsque l'état de votre tâche d'exportation d'image devient « terminé », le fichier exporté est prêt dans votre compartiment S3 en tant qu'objet. L'exemple de sortie suivant montre une tâche d'exportation d'image terminée. Le fichier exporté résultant dans Amazon S3 est my-export-bucket/exports/export-ami-1234567890abcdef0.vmdk.

{
    "ExportImageTasks": [
        {
            "ExportImageTaskId": "export-ami-1234567890abcdef0"
            "S3ExportLocation": {
                "S3Bucket": "my-export-bucket",
                "S3Prefix": "exports/"
            },
            "Status": "completed"
        }
    ]
}

8.    Accédez à votre compartiment S3 à l'aide de la console Amazon S3 pour localiser et télécharger l'objet.