VM을 AWS로 Migration 하기

soo·2023년 12월 20일
0

AWS

목록 보기
9/9
post-thumbnail

VM을 AWS로 Migration 하는법

VMware 환경에서 사용하던 VM을 AWS로 옮길 수 있을까?

쿠버네티스 공부겸 cka 시험을 준비하면서 데스크탑에 VMware를 설치하고 쿠버네티스 환경을 구성했다.
하지만 사람 일이란게 스터디카페 등 다른 곳에서 공부해야하는 상황이 생길 수 밖에 없었고, 그렇다고 데스크탑을 들고 다닐 수 없었기에 늘 아쉬움이 있었다.
그래서 생각한 방안들이 외장 하드 디스크에 VM을 설치해서 사용하기, 노트북에 설치하기, Google Chrome의 Remote Control Desktop을 이용해 데스크탑에 원격으로 접속하는 방법 등을 고려했었다.
하지만 데스크탑(램: 32 GB, CPU: i7-6700k)에 설치된 가상 환경은 각각 2GB의 램과 2개의 CPU 코어를 사용하는 7개의 VM을 운영 중이었고, 내 램 8GB짜리 M2 MacBook Air로는 이를 구현하기 어려웠다. 원격 접속은 데스크탑을 계속 켜둬야 하고, 이 경우 다른 사람이 사용하기 어려워 이 방법도 버려야 했다.
그러다 VM을 AWS로 마이그레이션해서 사용할 수 없을까? 라는 생각을 했고, AWS VMware import 방법을 발견했다. 이번 글은 VM import 과정을 적어볼까 한다.

사전 준비

일단, 당연하게도 VM 환경과 AWS cli 설치가 필요하다. 여기서는 Windows 10, CMD, AWS CLIv2, VMware Workstation을 기준으로 작성하였다.
또한, 사용하려는 AWS 계정에 S3와 EC2에 대한 권한 역시 필요하다. root 계정인 경우는 상관 없지만, 사용자를 생성해서 사용하는 경우, 아래 권한을 추가해야한다. ({{대상 버킷}}을 사용하려는 버킷의 이름으로 변경 필요)
S3 관련 권한: 특정 S3 버킷과 그 안의 객체에 대한 읽기 및 쓰기 작업 허용
EC2 관련 권한: 인스턴스 및 이미지 작업 취소, 생성, 설명, 태그 생성, 이미지 가져오기 및 내보내기, 인스턴스 상태 제어(시작, 중지, 종료) 등

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:GetBucketLocation",
        "s3:GetObject",
        "s3:PutObject"
      ],
      "Resource": ["arn:aws:s3:::{{대상 버킷}}","arn:aws:s3:::{{대상 버킷}}/*"]
    },
    {
      "Effect": "Allow",
      "Action": [
        "ec2:CancelConversionTask",
        "ec2:CancelExportTask",
        "ec2:CreateImage",
        "ec2:CreateInstanceExportTask",
        "ec2:CreateTags",
        "ec2:DescribeConversionTasks",
        "ec2:DescribeExportTasks",
        "ec2:DescribeExportImageTasks",
        "ec2:DescribeImages",
        "ec2:DescribeInstanceStatus",
        "ec2:DescribeInstances",
        "ec2:DescribeSnapshots",
        "ec2:DescribeTags",
        "ec2:ExportImage",
        "ec2:ImportInstance",
        "ec2:ImportVolume",
        "ec2:StartInstances",
        "ec2:StopInstances",
        "ec2:TerminateInstances",
        "ec2:ImportImage",
        "ec2:ImportSnapshot",
        "ec2:DescribeImportImageTasks",
        "ec2:DescribeImportSnapshotTasks",
        "ec2:CancelImportTask"
      ],
      "Resource": "*"
    }
  ]
}


VM 내보내기(VM Export)

VM을 AWS로 가져오기(Import)를 하려면, 먼저 해당 VM의 OVA 파일이 필요하다. 따라서 VM을 OVA 파일로 Export하는 과정이 필요하다. 이 과정에서 주의할 점은 확장자를 OVA로 지정해주지 않는 경우 OVF 파일로 Export 되기 때문에 확장자를 OVA로 지정해줘야한다는 점이다. 물론 OVF 파일로 다운 받아도 OVA 파일로 패키징하면 되지만, 단계가 하나 더 생기는거라 매우 귀찮아진다.

1-1. VM Export

내보내기할 VM 선택 -> File -> Export to OVF... 클릭


파일 이름 및 확장자 지정 후 설치


윈도우 환경에서 파일 확장자 확인하는법
파일 탐색기 화면 상단 보기 클릭 -> 오른쪽 '표시/숨기기' 항목들 중 '파일 확장명' 체크 표시.


1-2. 변환 (위 과정에서 OVA로 export한 경우 생략)

만약 OVF 파일로 Export 했다면, ovftool을 이용해서 OVA 파일로 패키징하는 과정이 필요하다. VMware Workstation의 경우에는 ovftool이 자동으로 설치되기 때문에 따로 설치할 필요는 없지만(ovftool이 없는 경우 설치 필요), 대신 변수 설정이 안되어 있다면 cmd 창에서 사용시 ovftool 응용프로그램이 설치된 파일로 위치를 이동하거나 경로를 지정해줘야한다. 보통 C:\Program Files (x86)\VMware\VMware Workstation\OVFTool 에 위치한다.

cmd 창에서 ovftool [원본 OVF 파일 경로] [대상 OVA 파일 경로]를 입력하면 ovf 파일을 ova 파일로 변환 해준다.



S3 생성

2-1. 버킷 생성

S3 -> 버킷 만들기 선택


이름 설정(버킷 이름은 고유해야되므로 안겹치게 만들어야됨) 및 옵션 선택 -> 버킷 만들기


생성한 버킷으로 이동 -> 업로드 클릭 -> 파일 추가 클릭 후 ova 파일 업로드


업로드 후 모습



필요한 IAM 권한 설정

AWS에서 OVA 파일을 실행하려면, 해당 파일을 AWS EC2 인스턴스로 변환하고 실행해야한다.
하지만 VM Import/Export 작업을 수행하려면 적절한 IAM(Identity and Access Management) 역할과 권한이 필요하므로, AWS cli 또는 AWS Management Console을 통해 이를 설정해야 한다.

3-1. IAM 역할 생성

IAM -> 역할 -> 역할 생성 클릭


엔터티 유형 AWS 서비스 선택 -> 서비스 또는 사용 사례 EC2 선택 -> 다음 클릭


권한 추가 선택 X(권한은 나중에 직접 생성할 예정) -> 다음 클릭


역할 이름 설정 -> 역할 생성 클릭


3-2. 역할에 권한 추가

IAM -> 역할 -> 생성한 IAM 역할 검색


대상 IAM 역할 클릭 -> 권한 -> 인라인 정책 생성(Inline Policies)


권한 지정 -> 정책 편집기 JSON 선택 -> 내용 입력 -> 다음 클릭

JSON 내용({{대상 버킷}}을 사용하려는 버킷 이름으로 변경 필요)

{
	"Version": "2012-10-17",
	"Statement": [
		{
			"Effect": "Allow",
			"Action": [
				"s3:GetBucketLocation",
				"s3:GetObject",
				"s3:ListBucket"
			],
			"Resource": [
				"arn:aws:s3:::{{디스크 이미지용 버킷}}",
				"arn:aws:s3:::{{디스크 이미지용 버킷}}/*"
			]
		},
		{
			"Effect": "Allow",
			"Action": [
				"s3:GetBucketLocation",
				"s3:GetObject",
				"s3:ListBucket",
				"s3:PutObject",
				"s3:GetBucketAcl"
			],
			"Resource": [
				"arn:aws:s3:::{{내보낸 이미지용 버킷}}",
				"arn:aws:s3:::{{내보낸 이미지용 버킷}}/*"
			]
		},
		{
			"Effect": "Allow",
			"Action": [
				"ec2:ModifySnapshotAttribute",
				"ec2:CopySnapshot",
				"ec2:RegisterImage",
				"ec2:Describe*"
			],
			"Resource": "*"
		}
	]
}

고객 관리형 정책(Customer Managed Policies)을 생성하고 역할에 해당 정책을 부여해도 되지만, 개인이 쓸거고 특정 IAM에 특정 버킷에 대한 접근 권한을 부여할 생각이었기 때문에 인라인 정책을 생성했다. 재사용이 필요한 경우 관리형 정책을 생성하는 것이 좋다.

인라인 정책이란?
단일 IAM 자격 증명(사용자, 그룹 또는 역할)에 대해 생성되는 정책입니다. 인라인 정책은 정책과 자격 증명을 정확히 1대 1 관계로 유지합니다. 이는 자격 증명을 삭제하면 삭제됩니다. 자격 증명을 생성하거나 이후에 생성할 때 정책을 생성하여 자격 증명에 삽입할 수 있습니다. 정책이 둘 이상의 엔터티에 적용될 수 있는 경우 관리형 정책을 사용하는 것이 좋습니다.
출처: https://docs.aws.amazon.com/ko_kr/IAM/latest/UserGuide/access_policies_managed-vs-inline.html#customer-managed-policies


AWS cli 사용하는경우

  1. trust-policy.json 파일 생성 - 역할 생성에 필요
{
   "Version": "2012-10-17",
   "Statement": [
      {
         "Effect": "Allow",
         "Principal": { "Service": "vmie.amazonaws.com" },
         "Action": "sts:AssumeRole",
         "Condition": {
            "StringEquals":{
               "sts:Externalid": "vmimport"
            }
         }
      }
   ]
}
  1. 역할 생성
    aws iam create-role --role-name {{역할 이름}} --assume-role-policy-document "file://{{trust-policy.json 파일의 절대 경로}}"

  2. role-policy.json 파일 생성 - 정책 생성에 필요. 내용은 AWS Console 사용 방법에서 쓴 json 파일과 동일

  3. 정책을 역할에 연결
    aws iam put-role-policy --role-name {{역할 이름}} --policy-name {{정책 이름}} --policy-document "file://{{role-policy.json 파일의 절대 경로}}"



OVA 파일 AMI로 변환

자, OVA 파일도 준비가 됐고 역할에 권한도 부여했으니 이제 S3에 저장된 OVA 파일을 AMI로 변환하는 과정만 진행하면 된다.

4-1. JSON 파일 작성

OVA 포맷의 가상 머신 이미지를 EC2 AMI로 변환하기 위해서는 구체적인 설정이 필요하다. 즉, '어디'에 있는 '어떤 형식'의 '무슨 파일'을 변환할 것인가에 대한 정보가 필요한데, 이를 위해서 변환하고자하는 OVA 파일에 대한 정보를 JSON 파일을 통해 제공해야한다.

JSON 파일 내용

[
	{ 
		"Description": "{{변환될 이미지에 대한 설명}}", 
		"Format": "ova", 
		"UserBucket": { 
			"S3Bucket": "{{대상 버킷}}", 
			"S3Key": "{{변환할 OVA파일 이름}}.ova" 
		} 
	}
]

작성한 json 파일들. 여러개의 VM을 변환할 것이었기에 VM당 하나의 JSON 파일을 작성했다.


4-2. OVA 파일 AMI로 변환

이제 아래 AWS CLI 명령어로 파일을 변환해주면 된다.
aws ec2 import-image --disk-containers "file://{{4-1.에서 작성한 json파일의 경로}}" --role-name {{역할 이름}}
명령어를 입력하면 다음과 같은 출력과 함께 변환이 시작된다.

이미지로의 변환 과정 현황은 다음 명령어를 통해 모니터링 할 수 있다. AMI ID 값은 위에서 출력된 값을 입력하면 된다.
aws ec2 describe-import-image-tasks {{import 중인 AMI의 ID값}}


4-3. 다수의 OVA 파일 변환

필자의 경우 총 7개의 VM을 변환해야했는데 aws cli 명령어를 일일이 치기 귀찮아서 윈도우의 bat 파일을 이용했다.
txt 파일에 변환할 VM에 대응하는 JSON 파일 이름들을 저장하고, bat 파일에 반복문을 사용해서 모두 실행하도록 만들었다.

목록 작성

bat 파일 작성(txt로 작성 후 bat로 확장자 변경)

@echo off
for /f %%i in (ovafiles.txt) do (
    set FILENAME=%%i
    aws ec2 import-image --description "Imported from %%i" --disk-containers "file://%%i.json" --role-name {{역할 이름}}
)

모든 이미지의 변환 모니터링 명령어
aws ec2 describe-import-image-tasks


4-3. 변환 확인

변환된 이미지는 AWS Management Console에서 확인이 가능하다.

EC2 -> 이미지 -> AMI -> 목록 확인

TMI 1.) OVA 파일 변환은 OVA 파일을 EBS 스냅샷으로 변환하고, 이 스냅샷에서 AMI를 생성하는 과정을 거치게 된다. 따라서 EBS 스냅샷 목록에서도 변환된 목록을 확인할 수 있다.

EC2 -> Elastic Block Store -> 스냅샷

TMI 2.) aws ec2 import-image 명령어를 사용할 때 직접적으로 스냅샷과 AMI의 이름을 지정하는 옵션은 제공되지 않는다. 따라서 Name 항목은 따로 입력하는 과정이 필요하다.

profile
이것저것 공부하는

0개의 댓글