zl程序教程

您现在的位置是:首页 >  其他

当前栏目

在aws云将本地虚拟机镜像上传

2023-04-18 16:56:52 时间

参考:

VM Import/Export 要求 - VM Import/Export

使用 VM Import/Export 将 VM 作为映像导入 - VM Import/Export

创建镜像 - EC2 Image Builder

1.将vmdk等格式的镜像上传至S3

本地文档上传至S3参考:上传对象 - Amazon Simple Storage Service

我这里采用的使用 S3 控制台。 

 在官网给的案例为ova格式的镜像导入 VM,如下图:

但在实践中,执行aws ec2 import-image命令导入镜像会报错:

ClientError: Disk validation failed [OVF file parsing error: Unsupported non-ASCII characters found in OVF file path.]

具体原因并不清楚,只能猜测是镜像格式有问题,于是更换了镜像格式。vmdk、raw、qcow2格式的镜像都可试试,将其上传至S3。

2.创建命名为 vmimport 的 IAM 角色

参考:VM Import/Export 要求 - VM Import/Export (amazon.com)

1.赋予IAM 用户所需的权限

如果你以AWS Identity and Access Management(IAM) 用户,您的 IAM 策略中需要拥有操作S3桶test-image的权限,才能使用 VM Import/导出。在这里,因为我主要是测试步骤,所以给了S3桶的全部权限,将用户添加至策略组:arn:aws-cn:iam::aws:policy/AmazonS3FullAccess,策略json:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:*",
                "s3-object-lambda:*"
            ],
            "Resource": "*"
        }
    ]
}

2.创建所需的 vmimport  IAM 角色服务角色

1.创建角色

有两个方法。一个是使用命令行,一个是在控制台操作。

方法一:使用命令行

aws cli命令安装:https://docs.aws.amazon.com/zh_cn/cli/latest/userguide/getting-started-install.html

命令行操作首先在本机配置访问aws的账号

# 配置aws访问账号
[root@test opt]# aws configure
AWS Access Key ID [None]: AK......
AWS Secret Access Key [None]: 9wm......
Default region name [None]: cn-northwest-1
Default output format [None]:json 

在您的计算机上创建一个名为 trust-policy.json 的文件。将以下策略添加到该文件中:

[root@test aws-images]# vim trust-policy.json
[root@test aws-images]# cat trust-policy.json
{
   "Version": "2012-05-07",
   "Statement": [
      {
         "Effect": "Allow",
         "Principal": { "Service": "vmie.amazonaws.com" },
         "Action": "sts:AssumeRole",
         "Condition": {
            "StringEquals":{
               "sts:Externalid": "vmimport"
            }
         }
      }
   ]
}

使用create-role命令以创建名为的角色vmimport并授予虚拟机导入/导出访问权限。确保您已指定在上一步中创建的 trust-policy.json 文件的位置的完整路径,并包含 file:// 前缀,如下例所示:

[root@test aws-images]# aws iam create-role --role-name vmimport --assume-role-policy-document "file:///tmp/aws-images/trust-policy.json"

方法一:在控制台创建

2.配置角色策略

方法一:

 使用下面的 put-role-policy 命令将策略挂载到之前创建的角色。请务必指定 role-policy.json 文件位置的完整路径。但是如果已经存在了vmimport角色,推荐在控制台修改,以免误改了策略。

role-policy.json文件参考

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetBucketLocation",
                "s3:GetObject",
                "s3:ListBucket",
                "s3:PutObject",
                "s3:GetBucketAcl"
            ],
            "Resource": [
                "arn:aws-cn:s3:::test-image",
                "arn:aws-cn:s3:::test-image/*"      ##z这里是存放有vmdk镜像的桶
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "ec2:ModifySnapshotAttribute",
                "ec2:CopySnapshot",
                "ec2:RegisterImage",
                "ec2:Describe*"
            ],
            "Resource": "*"
        }
    ]
}

使用下面的 put-role-policy 命令将策略挂载到之前创建的角色。请务必指定 role-policy.json 文件位置的完整路径。

aws iam put-role-policy --role-name vmimport --policy-name vmimport --policy-document "file:///tmp/aws-images/role-policy.json"

方法二:

在控制台修改。

3.命令行操作,镜像导入 VM

使用单个磁盘导入映像,参考以下案例:

方式一:直接使用命令行


[root@test opt]# aws ec2 import-image --license-type aws --disk-containers Format=OVA,Url="S3://test-image/centos-7.9.2009-x86.vmdk"
{
    "ImportTaskId": "import-ami-07a9efca767ea18ca",
    "LicenseType": "AWS",
    "Progress": "1",
    "SnapshotDetails": [
        {
            "DiskImageSize": 0.0,
            "Format": "VMDK",
            "Url": "S3://test-image/centos-7.9.2009-x86.vmdk",
            "UserBucket": {
                "S3Bucket": "test-image",
                "S3Key": "centos-7.9.2009-x86.vmdk"
            }
        }
    ],
    "Status": "active",
    "StatusMessage": "pending"
}

方式二:使用json文件指定映像的文件

[root@test aws-images]# vim containers.json
[root@test aws-images]# cat containers.json
[
  {
    "Description": "My Server centos7.7.2009",
    "Format": "vmdk",
    "Url": "s3://test-image/centos-7.9.2009-x86.vmdk"
  }
]

[root@test aws-images]# aws ec2 import-image --description "My server VM centos7.7.2009" --disk-containers "file:///tmp/aws-images/containers.json"                                 {
    "Description": "My server VM centos7.7.2009",
    "ImportTaskId": "import-ami-0466f127a4314d52c",
    "Progress": "1",
    "SnapshotDetails": [
        {
            "Description": "My Server centos7.7.2009",
            "DiskImageSize": 0.0,
            "Format": "VMDK",
            "Url": "s3://test-image/centos-7.9.2009-x86.vmdk",
            "UserBucket": {
                "S3Bucket": "test-image",
                "S3Key": "centos-7.9.2009-x86.vmdk"
            }
        }
    ],
    "Status": "active",
    "StatusMessage": "pending"
}

查看上传进程,如果成功了会显示completed

[root@test aws-images]# aws ec2 describe-import-image-tasks --import-task-ids import-ami-0466f127a4314d52c
{
    "ImportImageTasks": [
        {
            "Architecture": "x86_64",
            "Description": "My server VM centos7.7.2009",
            "ImageId": "ami-010b7720b333800b5",
            "ImportTaskId": "import-ami-0466f127a4314d52c",
            "LicenseType": "BYOL",
            "Platform": "Linux",
            "SnapshotDetails": [
                {
                    "Description": "My Server centos7.7.2009",
                    "DeviceName": "/dev/sda1",
                    "DiskImageSize": 2160242688.0,
                    "Format": "VMDK",
                    "SnapshotId": "snap-015f43e47d0191c2d",
                    "Status": "completed",
                    "Url": "s3://test-image/centos-7.9.2009-x86.vmdk",
                    "UserBucket": {
                        "S3Bucket": "test-image",
                        "S3Key": "centos-7.9.2009-x86.vmdk"
                    }
                }
            ],
            "Status": "completed",
            "Tags": [],
            "BootMode": "legacy_bios"
        }
    ]
}