OVF 파일을 사용한 AWS AMI 생성

신동수·2024년 11월 4일
0

AWS

목록 보기
26/26

개요

  • 낮은 버전의 CentOS 이미지를 AWS EC2에서 실행해야 하는 상황이 발생했다. 개인이 생성한 AMI도 있긴 했지만 이를 신뢰할 수 없었고, 마켓플레이스에도 적당한 AMI가 존재하지 않았기에 VMware 가상머신을 AWS로 가져와 EC2 인스턴스에서 실행할 수 있도록 하는 과정을 포스팅한다.

IAM

# OVA 파일을 통해 AMI 를 만들기 위한 IAM Policy
{
	"Version": "2012-10-17",
	"Statement": [
		{
			"Effect": "Allow",
			"Action": [
				"s3:ListAllMyBuckets"
			],
			"Resource": "*"
		},
		{
			"Effect": "Allow",
			"Action": [
				"s3:CreateBucket",
				"s3:DeleteBucket",
				"s3:DeleteObject",
				"s3:GetBucketLocation",
				"s3:GetObject",
				"s3:ListBucket",
				"s3:PutObject",
				"s3:PutObjectAcl",
				"s3:PutBucketAcl"
			],
			"Resource": [
				"arn:aws:s3:::<S3 Bucket>",
				"arn:aws:s3:::<S3 Bucket>/*"
			]
		},
		{
			"Effect": "Allow",
			"Action": [
				"ec2:CancelConversionTask",
				"ec2:CancelExportTask",
				"ec2:CreateImage",
				"ec2:CreateInstanceExportTask",
				"ec2:CreateTags",
				"ec2:DeleteTags",
				"ec2:DescribeConversionTasks",
				"ec2:DescribeExportTasks",
				"ec2:DescribeExportImageTasks",
				"ec2:DescribeImages",
				"ec2:DescribeInstanceAttribute",
				"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": "*"
		}
	]
}

일단 AWS 에서 명령을 실행할 User 또는 Role 에 대한 권한이 위와 같이 있어야 한다.
S3 는 ova 가 위치할 버킷이며, EC2 는 AMI 를 생성하기 위함이다.

OVF to OVA 변환

작성자는 ovftool을 사용하여 OVF 파일을 OVA 파일로 변환해보도록 하겠다.
ovftool 다운로드 링크를 통해 ovftool을 다운로드 받으실 수 있다.

OVF 파일 구성

$ ls
pbiinfra1-disk1.vmdk
pbiinfra1-file1.nvram
pbiinfra1-file1.mf
pbiinfra1-file1.ovf
config.json

OVF(Open Virtualization Format) 파일과 OVA(Open Virtual Appliance) 파일은 가상 머신 및 가상화 환경에서 가상 머신 이미지를 배포, 공유 및 관리하는 데 사용되는 포맷이다.
OVF는 여러 파일을 패키지로 포함하며 .ovf.mf.vmdk.nvram 파일 등으로 구성된다.
config.json 은 ovf 파일 변환이 완료된 ova 파일의 이미지를 만들기 위한 정보들이 기입되어 있다.

OVF 파일 OVA 변환

$ ovftool.exe .\pbiinfra1.ovf .\pbiinfra1.ova
Opening OVF source: .\pbiinfra1.ovf
The manifest validates
Opening OVA target: .\pbiinfra1.ova
Writing OVA package: .\pbiinfra1.ova
Transfer Completed
Completed successfully

ovftool을 사용하여 OVF 파일을 OVA 파일로 변환한다.
참고로 ovftool 명령어 사용 시 환경 변수 경로가 잡혀있지 않다면, 추가적으로 잡아주도록 하자!

$ ls
pbiinfra1-disk1.vmdk
pbiinfra1-file1.nvram
pbiinfra1-file1.mf
pbiinfra1-file1.ovf
pbiinfra1-file1.ova
config.json

완료 시 위와 같이 Completed successfully을 확인하실 수 있고, 지정한 이름으로 ova 파일을 생성을 완료 하였다.

OVA to AMI 변환

$ aws ec2 import-image --description "My server VM" --disk-containers "file://C:\Users\admin\Desktop\import\config.json"

{
    "Description": "My server VM",
    "ImportTaskId": "import-ami-036b5bxxxxxxxxxx",
    "Progress": "1",
    "SnapshotDetails": [
        {
            "Description": "pbiinfra1",
            "DiskImageSize": 0.0,
            "Format": "OVA",
            "UserBucket": {
                "S3Bucket": "<S3 Bucket>",
                "S3Key": "pbiinfra1.ova"
            }
        }
    ],
    "Status": "active",
    "StatusMessage": "pending"
}

사용할 명령어는 위와 같으며, 파일을 사용하여 disk-containers 매개 변수에는 아래와 같은 json 파일을 읽어 AMI 로 생성을 하게 된다.

# config.json 예시
[
    {
      "Description": "pbiinfra1",
      "Format": "ova",
      "UserBucket": {
          "S3Bucket": "<S3 Bucket>",
          "S3Key": "<file.ova>"
      }
    }
]

# 다른 예시
[
  {
    "Description": "My Server OVA",
    "Format": "ova",
    "Url": "s3://amzn-s3-demo-import-bucket/vms/my-server-vm.ova"
  }
]

좀 더 자세한 내용은 아래 링크를 통해 확인할 수 있다.
링크 : VM을 이미지로 가져오기

여기서 추가적으로 진행되는 상태를 확인하고자 하신다면 아래와 같이 입력하여 상태를 확인할 수 있다.

$ aws ec2 describe-import-image-tasks --import-task-ids import-ami-036b5bxxxxxxxxxx

# 생성중
{
    "ImportImageTasks": [
        {
            "Description": "My server VM",
            "ImportTaskId": "import-ami-036b5bxxxxxxxxxx",
            "Progress": "19",
            "SnapshotDetails": [
                {
                    "DiskImageSize": 13853794816.0,
                    "Format": "VMDK",
                    "Status": "active",
                    "UserBucket": {
                        "S3Bucket": "<S3 Bucket>",
                        "S3Key": "pbiinfra1.ova"
                    }
                }
            ],
            "Status": "active",
            "StatusMessage": "converting",
            "Tags": []
        }
    ]
}

# Status 상태에서 "completed" 시 완료
{
    "ImportImageTasks": [
        {
            "Architecture": "x86_64",
            "Description": "pbiinfra1 VM",
            "ImageId": "ami-0c1cf4xxxxxxxx",
            "ImportTaskId": "import-ami-036b5bxxxxxxxxxx",
            "LicenseType": "BYOL",
            "Platform": "Linux",
            "SnapshotDetails": [
                {
                    "DeviceName": "/dev/sda1",
                    "DiskImageSize": 13853794816.0,
                    "Format": "VMDK",
                    "SnapshotId": "snap-04fac1257xxxxxxx",
                    "Status": "completed",
                    "UserBucket": {
                        "S3Bucket": "<S3 Bucket>",
                        "S3Key": "pbiinfra1.ova"
                    }
                }
            ],
            "Status": "completed",
            "Tags": []
        }
    ]
}

결과


완료가 되었다면 AMI 이름에서 import-ami-xxxxx 으로 확인을 할 수 있으며, 해당 AMI 를 통해 EC2를 생성할 수 있다.

profile
조금씩 성장하는 DevOps 엔지니어가 되겠습니다. 😄

0개의 댓글