Amazon S3 백킹 AMI를 EBS 백킹 AMI로 변환하기

Amazon S3 백킹 AMI를 EBS 백킹 AMI로 변환하기

소유하고 있는 Amazon S3 백킹 Linux AMI를 Amazon EBS 백킹 Linux AMI로 변환할 수 있어요. 이 절차는 AMI 번들, EBS 볼륨, 스냅샷, AMI 등록을 순서대로 다루는 큰 작업이에요.

출처: 문서

본문

중요 — 소유하지 않은 AMI는 변환할 수 없어요.

Amazon S3 백킹 AMI를 Amazon EBS 백킹 AMI로 변환하려면

  1. Amazon EBS 백킹 AMI에서 Amazon Linux 인스턴스를 실행하세요. 자세한 내용은 콘솔의 인스턴스 시작 마법사로 EC2 인스턴스 실행하기 문서를 참고하세요. Amazon Linux 인스턴스에는 AWS CLI와 AMI 도구가 미리 설치되어 있어요.
  2. S3 백킹 AMI를 번들링할 때 사용했던 X.509 프라이빗 키를 인스턴스에 업로드하세요. 이 키는 오직 사용자와 Amazon EC2만 AMI에 접근할 수 있게 보장하는 데 사용돼요.
  3. 인스턴스에 X.509 프라이빗 키용 임시 디렉터리를 만듭니다.
[ec2-user ~]$ mkdir /tmp/cert
  1. scp 같은 안전한 복사 도구를 사용해 컴퓨터의 X.509 프라이빗 키를 인스턴스의 /tmp/cert 디렉터리로 복사합니다. 다음 명령에서 my-private-key 파라미터는 SSH로 인스턴스에 접속할 때 사용하는 프라이빗 키예요.
you@your_computer:~ $ scp -i my-private-key.pem /path/to/pk-HKZYKTAIG2ECMXYIBH3HXV4ZBEXAMPLE.pem [email protected]:/tmp/cert/
pk-HKZYKTAIG2ECMXYIBH3HXV4ZBEXAMPLE.pem  100%  717     0.7KB/s   00:00
  1. AWS CLI를 사용하도록 환경 변수를 구성합니다. 자세한 내용은 환경 변수 문서를 참고하세요.
  2. (권장) AWS 액세스 키, 시크릿 키, 세션 토큰에 대한 환경 변수를 설정합니다.
[ec2-user ~]$ export AWS_ACCESS_KEY_ID=your_access_key_id
[ec2-user ~]$ export AWS_SECRET_ACCESS_KEY=your_secret_access_key
[ec2-user ~]$ export AWS_SESSION_TOKEN=your_session_token
  1. AWS 액세스 키와 시크릿 키에 대한 환경 변수를 설정합니다.
[ec2-user ~]$ export AWS_ACCESS_KEY_ID=your_access_key_id
[ec2-user ~]$ export AWS_SECRET_ACCESS_KEY=your_secret_access_key
  1. 새 AMI용 Amazon Elastic Block Store(Amazon EBS) 볼륨을 준비합니다.

  2. create-volume 명령을 사용해 인스턴스와 같은 가용 영역에 빈 EBS 볼륨을 만듭니다. 명령 출력에서 볼륨 ID를 기록해 두세요.

중요 — 이 EBS 볼륨은 원래 인스턴스 스토어 루트 볼륨과 같거나 더 커야 해요.

aws ec2 create-volume \
    --size 10 \
    --region us-west-2 \
    --availability-zone us-west-2b
  1. attach-volume 명령을 사용해 볼륨을 Amazon EBS 백킹 인스턴스에 연결합니다.
aws ec2 attach-volume \
    --volume-id vol-01234567890abcdef \
    --instance-id i-1234567890abcdef0 \
    --region us-west-2
  1. 번들을 저장할 폴더를 만듭니다.
[ec2-user ~]$ mkdir /tmp/bundle
  1. ec2-download-bundle 명령을 사용해 인스턴스 스토어 기반 AMI의 번들을 /tmp/bundle에 다운로드합니다.
[ec2-user ~]$ ec2-download-bundle -b amzn-s3-demo-bucket/bundle_folder/bundle_name -m image.manifest.xml -a $AWS_ACCESS_KEY_ID -s $AWS_SECRET_ACCESS_KEY --privatekey /path/to/pk-HKZYKTAIG2ECMXYIBH3HXV4ZBEXAMPLE.pem -d /tmp/bundle
  1. ec2-unbundle 명령을 사용해 번들에서 이미지 파일을 복원합니다.

  2. 번들 폴더로 디렉터리를 변경합니다.

[ec2-user ~]$ cd /tmp/bundle/
  1. ec2-unbundle 명령을 실행합니다.
[ec2-user bundle]$ ec2-unbundle -m image.manifest.xml --privatekey /path/to/pk-HKZYKTAIG2ECMXYIBH3HXV4ZBEXAMPLE.pem
  1. 언번들된 이미지의 파일을 새 EBS 볼륨에 복사합니다.
[ec2-user bundle]$ sudo dd if=/tmp/bundle/image of=/dev/sdb bs=1M
  1. 언번들되면서 생긴 새 파티션이 있는지 볼륨을 검사합니다.
[ec2-user bundle]$ sudo partprobe /dev/sdb1
  1. 마운트할 디바이스 이름을 찾기 위해 블록 디바이스를 나열합니다.
[ec2-user bundle]$ lsblk
NAME         MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
/dev/sda    202:0    0   8G  0 disk
└─/dev/sda1 202:1    0   8G  0 part /
/dev/sdb    202:80   0  10G  0 disk
└─/dev/sdb1 202:81   0  10G  0 part

이 예시에서 마운트할 파티션은 /dev/sdb1이지만, 여러분의 디바이스 이름은 다를 수 있어요. 볼륨이 파티션으로 나뉘어 있지 않다면 마운트할 디바이스는 /dev/sdb처럼 보일 거예요(파티션 번호가 붙지 않은 형태).

  1. 새 EBS 볼륨의 마운트 지점을 만들고 볼륨을 마운트합니다.
[ec2-user bundle]$ sudo mkdir /mnt/ebs
[ec2-user bundle]$ sudo mount /dev/sdb1 /mnt/ebs
  1. 좋아하는 텍스트 편집기(vim, nano 등)로 EBS 볼륨의 /etc/fstab 파일을 열고 인스턴스 스토어(임시) 볼륨에 대한 항목을 제거합니다. EBS 볼륨이 /mnt/ebs에 마운트되어 있으므로 fstab 파일은 /mnt/ebs/etc/fstab에 있어요.
[ec2-user bundle]$ sudo nano /mnt/ebs/etc/fstab
#
LABEL=/     /           ext4    defaults,noatime  1   1
tmpfs       /dev/shm    tmpfs   defaults        0   0
devpts      /dev/pts    devpts  gid=5,mode=620  0   0
sysfs       /sys        sysfs   defaults        0   0
proc        /proc       proc    defaults        0   0
/dev/sdb        /media/ephemeral0       auto    defaults,comment=cloudconfig    0       2

이 예시에서는 마지막 줄을 제거하면 돼요.

  1. 볼륨을 마운트 해제하고 인스턴스에서 분리합니다.
[ec2-user bundle]$ sudo umount /mnt/ebs
[ec2-user bundle]$ aws ec2 detach-volume --volume-id vol-01234567890abcdef --region us-west-2
  1. 새 EBS 볼륨에서 AMI를 만듭니다.

  2. 새 EBS 볼륨의 스냅샷을 만듭니다.

[ec2-user bundle]$ aws ec2 create-snapshot --region us-west-2 --description "your_snapshot_description" --volume-id vol-01234567890abcdef
  1. 스냅샷이 완료되었는지 확인합니다.
[ec2-user bundle]$ aws ec2 describe-snapshots --region us-west-2 --snapshot-id snap-0abcdef1234567890
  1. describe-images 명령으로 원래 AMI에 사용된 프로세서 아키텍처, 가상화 유형, 커널 이미지(aki)를 확인합니다. 이 단계에서는 원래 Amazon S3 백킹 AMI의 AMI ID가 필요해요.
[ec2-user bundle]$ aws ec2 describe-images --region us-west-2 --image-id ami-0abcdef1234567890 --output text
IMAGES	x86_64	amazon/amzn-ami-pv-2013.09.2.x86_64-s3	ami-8ef297be	amazon	available	public	machine	aki-fc8f11cc	instance-store	paravirtual	xen

이 예시에서 아키텍처는 x86_64, 커널 이미지 ID는 aki-fc8f11cc예요. 다음 단계에서 이 값을 사용하세요. 위 명령 출력에 ari ID도 나온다면 그것도 기록해 두세요.

  1. 새 EBS 볼륨의 스냅샷 ID와 이전 단계의 값을 사용해 새 AMI를 등록합니다. 이전 단계에서 ari ID가 나왔다면 다음 명령에 --ramdisk-id ari_id 형태로 포함하세요.
[ec2-user bundle]$ aws ec2 register-image --region us-west-2 --name your_new_ami_name --block-device-mappings DeviceName=device-name,Ebs={SnapshotId=snap-0abcdef1234567890} --virtualization-type paravirtual --architecture x86_64 --kernel-id aki-fc8f11cc --root-device-name device-name
  1. (선택) 새 AMI에서 인스턴스를 실행할 수 있는지 테스트한 뒤, 이 절차를 위해 만든 EBS 볼륨을 삭제할 수 있습니다.
aws ec2 delete-volume --volume-id vol-01234567890abcdef

더 알아보기

  • AMI 도구 참조
  • Windows Sysprep을 사용해 AMI 만들기