VMware 가상머신을 EC2로 이전하기

파아란곰탱이·2023년 5월 1일
1
post-thumbnail

개요

개인 프로젝트 진행 중 낮은 버전의 CentOS 이미지를 EC2에서 실행해야 하는 상황이 발생했다.

개인이 생성한 AMI도 있긴 했지만 이를 신뢰할 수 없었고, 마켓플레이스에도 적당한 AMI가 존재하지 않았기에 VMware 가상머신을 AWS로 가져와 EC2 인스턴스에서 실행했다.

그래서 본 포스트는 VMware 가상머신을 EC2 인스턴스로 실행하는 과정을 담았다.

참고로 필자는 VMware OVA 생성은 Windows에서 수행했고, AWS-CLI를 사용하는 작업은 전부 Linux 환경에서 수행했다.




참고자료

  1. AWS 공식문서 - VM Import/Export




전제 조건

  1. 본인의 환경에 AWS-CLI가 설치되어 있고, aws configure 명령을 통해 적절한 Access Key, Secret Key, Region을 설정되어 있다 가정한다.

  2. OVA 포맷을 사용하여 이전한다고 가정한다.
    Hyper-V등에서 사용하는 다른 포맷은 고려하지 않는다.
    만약 다른 포맷을 사용해야 한다면 위의 공식 문서를 참고할 것.

  3. 이전할 VMware 가상머신은 이미 만들어져 있다 가정한다.




주의사항

  1. VMware 가상머신에 SSH 연결 설정이 되어 있어야 한다.
    만약 SSH 서버가 구성되어 있지 않거나, 로그인이 불가능 하다면 EC2 인스턴스를 실행하더라도 접속할 수 없다.
    그래서 OVA로 Export 전 미리 SSH 접속 설정을 완료해야 한다.
    직렬콘솔 이라는 선택지가 있긴 하지만 이는 권장사항이 아니며, OS의 종류, 커널 버전 등에 따라 불가능한 경우가 있다.

  2. 다중 네트워크 인터페이스는 지원하지 않으며, DHCP를 사용하여 IP주소를 할당받도록 설정되야 한다.
    이를 수행하지 않으면, 생성된 인스턴스는 VPC내 Private IP를 할당받지 못한다.

  3. 64bit 시스템만 지원하며, 루트파티션과 MBR이 동일한 가상 디스크에 존재하지 않으면 부팅에 실패할 가능성이 있다.

  4. 듀얼부팅은 지원하지 않으며, 21개 이상의 디스크를 가상머신에서 사용중이라면 지원하지 않는다.
    다만, 추가 디스크는 ImportSnapshot API를 사용하여 개별적으로 가져올 수 있다.




작업 수행

1. VMware 가상머신 OVA로 Export

필자는 CentOS 6.8 minimal을 이용해서 VMware 가상머신을 생성 후, SSH 설정 및 계정 설정, 기본적인 패키지를 설치했다.

가상머신을 종료한 뒤 Export 해야한다.

가상머신을 선택 후 상단 바에서 File -> Export to OVF를 선택한다.

적절한 폴더 안에 Export를 수행하면 다음과 같이 파일들이 생성된다.

이제 해당 파일들을 OVA로 변환해야 한다.

OVA 변환 도구는 VMware가 설치된 경로에 있다.

설치 시 따로 경로 변경을 하지 않았다면 경로는 다음과 같다.

C:\Program Files (x86)\VMware\VMware Workstation\OVFTool\ovftool.exe

cmd를 실행하여 다음과 같이 명령을 수행한다.

ovftool.exe OVF저장경로\파일명.ovf 원하는경로\파일명.ova

Transfer Completed
Completed successfully
라고 출력되면 변환이 성공적으로 완료된 것이다.


2. OVA파일을 S3에 업로드

OVA 파일을 업로드할 S3 버킷을 하나 만든다. 기존에 있는 버킷을 활용해도 무방하다.
필자는 새로운 버킷을 하나 만들었다.

버킷에 생성된 OVA 파일을 업로드 한다. 업로드될 경로는 본인 자유이다.

버킷에 간편히 업로드 하기 위해서는 AWS 웹 콘솔을 이용하면 편하다.

하지만 필자의 체감상, 사이즈가 큰 파일은 중간에 오류로 인해 업로드 실패의 빈도가 매우 높다.

그렇기 때문에 사이즈가 큰 파일이라면 AWS-CLI를 이용해 업로드 하는것을 추천한다.

S3에 파일을 업로드 하는 명령어는 다음과 같다.

aws s3 cp 업로드할파일 s3://버킷명[/경로]

아래와 같이 S3에 OVA 파일이 업로드 되면 성공이다.



3. OVA를 AMI로 변환하기 위한 IAM 역할 생성

이 파트가 제일 중요한 부분이다. 필자가 처음 이 작업을 수행했을 때 제일 헷갈렸었고, 이해를 하는데 많은 시간이 들었다.

필자 본인의 지식과 실력이 부족하여 헤멨는데 다른 사람들은 헤메지 않았으면 한다.


필요한것은 적절한 정책이 연결된 IAM 역할이다.

IAM 역할

IAM 역할(Role)은 AWS 리소스에 대한 접근 권한을 부여하는 AWS Identity and Access Management(IAM) 개체입니다. IAM 역할은 AWS 서비스 또는 EC2 인스턴스와 같은 AWS 리소스에서 실행되는 애플리케이션, 서비스 또는 인스턴스 프로필에 연결됩니다.


IAM 역할을 사용하면 EC2 인스턴스 또는 다른 AWS 서비스에서 실행되는 애플리케이션에 대한 권한을 부여할 수 있습니다. 예를 들어 EC2 인스턴스에서 실행되는 애플리케이션이 S3 버킷에 대한 읽기/쓰기 권한을 필요로 하는 경우, 해당 애플리케이션에 대한 IAM 역할을 만들고 이 역할에 S3 버킷에 대한 액세스 권한을 부여할 수 있습니다.

이를 위해서 우리는 AWS-CLI를 이용해 IAM 역할을 생성할 것이다.

우선 vmimport-role.json 파일을 생성한다.

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

내용을 해석하자면 아래와 같다.

vmie.amazonaws.com 이라는 서비스가 해당 역할을 수행한다.
sts:AssumeRole 이라는 동작을 수행할 수 있는데 이는 권한 상승을 의미한다.
이 역할을 수행하는데 vmimport이라는 Externalid를 가진 대상만 허가한다. 즉, AWS VM Import/Export 서비스만 이 역할을 사용하여 권한을 얻는것을 허가한다.

이 json을 이용하여 IAM 역할을 생성한다. 이를 위해 아래의 명령을 수행한다.

aws iam create-role --role-name vmimport --assume-role-policy-document "file://[vmimport-role.json의 절대경로]"



IAM 역할의 생성이 완료되면 해당 역할에 정책을 할당해야 한다. 필요한 정책은 S3와 EC2에 관련된 정책들이다.

vmimport-policy.json 파일을 생성한다.

{
	"Version": "2012-10-17",
	"Statement": [
		{
			"Effect": "Allow",
			"Action": [
				"s3:ListBucket",
				"s3:GetBucketLocation",
				"s3:getObject"
			],
			"Resource": [
				"arn:aws:s3:::[생성한 S3 버킷 이름]",
				"arn:aws:s3:::[생성한 S3 버킷 이름]/*"
			]
		},
		{
			"Effect": "Allow",
			"Action":[
				"ec2:ModifySnapshotAttribute",
				"ec2:CopySnapshot",
				"ec2:RegisterImage",
				"ec2:Describe*"
			],
			"Resource": "*"
		}
	]
}

이 정책은 S3와 EC2에 관련된 권한을 부여하는 정책이다. S3에 업로드된 OVA에 접근하고 이를 스냅샷으로 복사한뒤, 스냅샷 기반으로 AMI를 만드는 작업을 위해서 필요하다.

아래의 명령을 통해 IAM 역할에 해당 정책을 연결한다.

aws iam put-role-policy --role-name vmimport --policy-name vmimport --policy-document "file://[vmimport-policy.json의 절대경로]"

이 명령을 수행하면 별다른 결과값은 나오지 않는다.

제대로 명령이 수행되었는지 확인하기 위해 AWS 웹 콘솔을 이용해 생성된 IAM 역할을 조회하여 다음과 같이 설정되어 있다면 성공이다.



4. OVA를 AMI로 변환 수행

권한 설정을 마쳤다면 이제 OVA 파일을 AMI로 변환할 수 있다.

disk-containers.json 파일을 생성한다.

[
  {
    "Description": "Base CentOS 6.8 Image",
    "Format": "ova",
    "UserBucket": {
        "S3Bucket": "[생성한 S3 버킷 이름]",
        "S3Key": "CentOS_6.8_64bit.ova"
    }
  }
]

이후, 아래의 명령을 실행하여 OVA를 AMI로 변환을 수행한다.

aws ec2 import-image --description "[추가 설명]" --disk-containers "file://[disk-containers.json 파일의 절대경로]"

변환 작업은 어느정도 시간이 소요된다. 작업 도중 상황을 알고 싶다면 다음 명령을 수행하면 된다.

aws ec2 describe-import-image-tasks --import-task-ids [ImportTaskId]

ImportTaskId는 aws ec2 import-image 명령 수행 결과에 있다.

변환 작업의 상태, Status는 다음과 같다.

active : 가져오기 작업이 진행 중입니다.
deleting : 가져오기 작업이 취소되고 있습니다.
deleted : 가져오기 작업이 취소되었습니다.
updating : 가져오기 상태가 업데이트 중입니다.
validating : 가져온 이미지를 검증하는 중입니다.
validated : 가져온 이미지가 검증되었습니다.
converting : 가져온 이미지가 AMI로 변환되고 있습니다.
completed : 가져오기 작업이 완료되고 AMI를 사용할 준비가 되었습니다.

AMI 생성이 완료되면 Status가 completed로 출력되며 AWS 웹 콘솔로 AMI를 확인할 수 있다.



5. 생성된 AMI를 사용하여 EC2 인스턴스 생성

AMI를 선택한 뒤 상단의 AMI로 인스턴스 시작 버튼을 눌러 EC2 인스턴스를 생성하면 된다.

이 과정은 다른 EC2 인스턴스를 생성할 때 과정과 동일하다.

다만, 인스턴스 스토어가 아닌 EBS 볼륨을 사용해야 하기 때문에 EBS 볼륨과 EC2 인스턴스의 수명 주기를 같게 하고 싶다면 EC2 인스턴스 생성 시 스토리지(볼륨) 에서 종료시 삭제 옵션을 로 설정한다.




추가정보

필자가 Import 한 OS는 CentOS 6.8 버전이다.

CentOS 6은 상당히 오래된 리눅스 배포판이기 때문에 AWS에서 제공하는 다양한 기능을 활용하기 어렵다.

따라서 인스턴스를 생성 시 여러가지 제약이 걸린다.

대표적인 것이 AWS에서 개발한 ENA(Elastic Network Adapter) 드라이버를 지원하지 않기 때문에 몇몇 인스턴스 클래스는 지원하지 않는다.

그래서 t2로는 EC2 인스턴스를 생성할 수 있지만, t3는 불가능하다.

이 외에도 여러가지 제약사항이 걸릴 수 있으니 잘 찾아봐야 할 듯 하다.




profile
파아란곰탱이

0개의 댓글