VM Import/Export를 사용하여 Amazon Machine Image(AMI) 기반 VM을 내보내려면 어떻게 해야 합니까?

최종 업데이트 날짜: 2021년 3월 3일

Amazon Machine Image(AMI) 복사본을 가상 머신(VM)으로 내보내 온사이트 가상화 환경에 배포하려고 합니다. VM Import/Export를 사용하여 이를 수행하려면 어떻게 해야 하나요?

간략한 설명

AWS 명령줄 인터페이스(AWS CLI)에서 VM Import/Export를 사용하여 이미지 내보내기 태스크를 시작할 수 있습니다. 그런 다음 VM 파일로 내보낸 Amazon Machine Image(AMI)가 Amazon Simple Storage Service(Amazon S3) 버킷에 기록됩니다. 내보낸 VM을 사용하여 온사이트 가상화 환경에 표준화된 새 인스턴스를 배포할 수 있습니다. 대부분의 AMI를 Citrix Xen, Microsoft Hyper-V 또는 VMware vSphere로 내보낼 수 있습니다.

참고: AWS CLI 명령을 실행할 때 오류가 발생하는 경우 최신 버전의 AWS CLI를 사용하고 있는지 확인하세요.

다음 해결 단계를 시작하기 전에 다음을 수행합니다.

해결 방법

1.    내보내려는 EC2 인스턴스에서 Amazon Elastic Block Store(Amazon EBS)-Backed AMI를 생성합니다.

Linux의 경우 Amazon EBS-Backed Linux AMI 생성을 참조하세요.

Windows의 경우 사용자 지정 Windows AMI 생성을 참조하세요.

2.    클라이언트 머신에 AWS CLI를 설치하고 IAM 사용자를 위해 생성된 AWS 자격 증명을 사용하여 구성합니다.

3.    내보낼 AMI와 동일한 AWS 리전에 새 S3 버킷을 생성합니다.

4.    필요한 서비스 역할을 생성합니다. 사전 조건으로, VM Import/Export를 사용하는 리전에서 AWS Security Token Service(AWS STS)를 활성화합니다.

서비스 역할을 생성하려면 먼저 컴퓨터에서 trust-policy.json이라는 파일을 생성한 후 다음 정책을 파일에 추가합니다.

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

create-role 명령을 실행하고 trust-policy.json 파일로 vmimport라는 역할을 생성하여 VM Import/Export에 역할에 대한 액세스 권한을 부여합니다.

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

참고: 앞의 예제에서 생성한 trust-policy.json 파일의 위치에 대한 전체 경로를 지정해야 합니다. file:// 접두사를 포함해야 합니다.

컴퓨터에서 role-policy.json이라는 다른 파일을 생성하고 파일에 다음 정책을 추가합니다. my-export-bucket을 해당하는 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": "*"
        }
    ]
}

put-role-policy 명령을 사용하여 role-policy.json 정책을 이전에 생성한 vmimport 역할에 연결합니다.

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

앞의 예제에서 role-policy.json 파일의 위치에 대한 전체 경로를 지정해야 합니다.

참고: 이후에 VM Import/Export를 업데이트하는 경우 vmimport 역할에 추가 권한이 필요할 수 있습니다. 필요한 사용 권한의 최신 예는 필요한 서비스 역할 설명서의 예제 정책을 참조하세요.

5.    AWS CLI를 설치한 클라이언트 머신에서 AWS CLI 명령 export-image를 실행하여 내보내기 태스크를 시작합니다.

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

참고: 앞의 예제에서 ami-id를 해당하는 AMI ID로 바꿉니다. 원하는 디스크 이미지 형식(VMDK, RAW 또는 VHD)을 선택합니다. my-export-bucket을 해당하는 S3 버킷 이름으로 바꿉니다. 내보낸 파일은 S3 키 prefixexport-ami-id.format(예: my-export-bucket/exports/export-ami-1234567890abcdef0.vmdk)을 사용하여 S3 버킷에 기록됩니다. 내보낸 파일에 접두사를 추가할 수 있습니다.

요청이 성공하면 다음 예제와 같이 export-image 명령 출력에서 이미지 내보내기 태스크 ID를 포함한 태스크 세부 정보가 반환됩니다.

{
    "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.    이미지 내보내기 태스크의 상태를 확인하려면 AWS CLI 명령 describe-export-image-tasks를 실행합니다.

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

참고: 앞의 예제에서 export-ami-idexport-image 명령 출력의 이미지 내보내기 태스크 ID로 바꿉니다.

describe-export-image-tasks 명령 출력은 태스크 진행률 및 전체 상태에 대한 세부 정보를 반환합니다. 다음은 active 상태이고 진행 중인 이미지 내보내기 태스크에 대한 예제 출력입니다.

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

7.    이미지 내보내기 태스크의 상태가 "completed"로 변경되면 내보낸 파일이 S3 버킷에서 객체로 준비됩니다. 다음 예제 출력은 완료된 이미지 내보내기 태스크를 보여줍니다. Amazon S3에 있는 내보낸 파일의 결과 파일은 my-export-bucket/exports/export-ami-1234567890abcdef0.vmdk입니다.

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

8.    Amazon S3 콘솔에서 S3 버킷에 액세스하여 객체를 찾고 다운로드합니다.