인스턴스 스토어 기반 인스턴스에서 AMI 생성 - Amazon Elastic Compute Cloud

인스턴스 스토어 기반 인스턴스에서 AMI 생성

다음은 인스턴스 스토어 기반 인스턴스에서 인스턴스 스토어 기반 AMI를 만드는 절차입니다. 시작하기 전에 먼저 사전 조건을 읽으십시오.

인스턴스 스토어 기반 Amazon Linux 인스턴스에서 AMI 생성

이 섹션에서는 Amazon Linux 인스턴스에서 AMI를 생성하는 방법을 살펴봅니다. 다음 절차는 다른 Linux 배포를 실행하는 인스턴스에서는 작동하지 않을 수 있습니다. Ubuntu 관련 절차는 인스턴스 스토어 기반 Ubuntu 인스턴스에서 AMI 생성 단원을 참조하세요.

AMI 도구 사용을 준비하려면(HVM 인스턴스에만 해당)
  1. AMI 도구를 올바르게 부팅하려면 GRUB Legacy가 필요합니다. 다음 명령을 사용하여 GRUB을 설치합니다.

    [ec2-user ~]$ sudo yum install -y grub
  2. 다음 명령을 사용하여 파티션 관리 패키지를 설치합니다.

    [ec2-user ~]$ sudo yum install -y gdisk kpartx parted
인스턴스 스토어 지원 Amazon Linux 인스턴스에서 AMI를 생성하려면

이 절차에서는 사전 조건의 사전 조건을 충족한다고 가정합니다.

다음 명령에서는 자신의 정보로 각각의 사용자 입력 자리 표시자를 바꿉니다.

  1. 인스턴스에 자격 증명을 업로드합니다. 이러한 자격 증명은 사용자와 Amazon EC2만 사용자의 AMI에 액세스할 수 있음을 보장하는 데 사용됩니다.

    1. 다음과 같이 인스턴스에서 자격 증명에 대한 임시 디렉터리를 생성합니다.

      [ec2-user ~]$ mkdir /tmp/cert

      이렇게 하면 생성된 이미지에서 자격 증명을 제외할 수 있습니다.

    2. scp 등의 보안 복사 도구를 사용하여 컴퓨터의 X.509 인증서와 해당 프라이빗 키를 인스턴스의 /tmp/cert 디렉터리로 복사합니다. 다음 -i my-private-key.pem 명령의 scp 옵션은 X.509 프라이빗 키가 아니라 SSH를 사용하여 인스턴스에 연결하는 데 사용되는 프라이빗 키입니다. 예:

      you@your_computer:~ $ scp -i my-private-key.pem /path/to/pk-HKZYKTAIG2ECMXYIBH3HXV4ZBEXAMPLE.pem /path/to/cert-HKZYKTAIG2ECMXYIBH3HXV4ZBEXAMPLE.pem ec2-user@ec2-203-0-113-25.compute-1.amazonaws.com:/tmp/cert/ pk-HKZYKTAIG2ECMXYIBH3HXV4ZBEXAMPLE.pem 100% 717 0.7KB/s 00:00 cert-HKZYKTAIG2ECMXYIBH3HXV4ZBEXAMPLE.pem 100% 685 0.7KB/s 00:00

    또는 이들은 일반 텍스트 파일이므로 텍스트 편집기에서 인증서와 키를 열고 내용을 /tmp/cert의 새 파일로 복사할 수 있습니다.

  2. 인스턴스 내에서 ec2-bundle-vol 명령을 실행하여 Amazon S3로 업로드할 번들을 준비합니다. -e 옵션을 지정하여 자격 증명이 저장되어 있는 디렉터리를 제외해야 합니다. 기본적으로 번들 프로세스에는 중요 정보를 포함할 수 있는 파일이 제외됩니다. 값에는 *.sw, *.swo, *.swp, *.pem, *.priv, *id_rsa*, *id_dsa* *.gpg, *.jks, */.ssh/authorized_keys*/.bash_history가 포함됩니다. 이러한 파일을 모든 포함하려면 --no-filter 옵션을 사용합니다. 이러한 파일 중 일부만 포함하려면 --include 옵션을 사용합니다.

    중요

    기본적으로 AMI 번들링 프로세스에서는 루트 볼륨을 나타내는 /tmp 디렉터리에 압축 및 암호화된 파일 모음이 생성됩니다. /tmp에 사용 가능한 디스크 공간이 충분하지 않아서 번들을 저장할 수 없으면 -d /path/to/bundle/storage 옵션을 사용하여 번들을 저장할 다른 위치를 지정합니다. 일부 인스턴스의 /mnt 또는 /media/ephemeral0에 탑재된 임시 스토리지를 사용하거나 새 Amazon Elastic Block Store(Amazon EBS) 볼륨을 생성, 연결탑재하여 번들을 저장할 수도 있습니다.

    1. ec2-bundle-vol 명령을 루트로 실행해야 합니다. 대부분의 명령에 대해 sudo를 사용하여 승격된 권한을 얻을 수 있지만 이 경우 환경 변수를 유지하려면 sudo -E su를 실행해야 합니다.

      [ec2-user ~]$ sudo -E su

      이제 bash 프롬프트가 사용자를 루트 사용자로 식별하고 달러 기호가 해시 태그로 바뀌어 현재 위치가 루트 셸임을 표시합니다.

      [root ec2-user]#
    2. AMI 번들을 실행하려면 다음과 같이 ec2-bundle-vol 명령을 실행합니다.

      [root ec2-user]# ec2-bundle-vol -k /tmp/cert/pk-HKZYKTAIG2ECMXYIBH3HXV4ZBEXAMPLE.pem -c /tmp/cert/cert-HKZYKTAIG2ECMXYIBH3HXV4ZBEXAMPLE.pem -u 123456789012 -r x86_64 -e /tmp/cert --partition gpt
      참고

      중국(베이징) 및 AWS GovCloud(미국 서부) 리전의 경우 --ec2cert 파라미터를 사용하고 사전 조건에 따라 인증서를 지정합니다.

      이미지가 생성되는 데 몇 분 정도 걸릴 수 있습니다. 이 명령이 완료되면 /tmp(또는 기본값이 아닌) 디렉터리에 번들(image.manifest.xml과 여러 image.part.xx 파일)이 포함됩니다.

    3. 루트 셸을 종료합니다.

      [root ec2-user]# exit
  3. (선택 사항) 인스턴스 스토어 볼륨을 더 추가하려면 AMI의 image.manifest.xml 파일에서 블록 디바이스 매핑을 편집합니다. 자세한 내용은 블록 디바이스 매핑 섹션을 참조하세요.

    1. image.manifest.xml 파일의 백업을 만듭니다.

      [ec2-user ~]$ sudo cp /tmp/image.manifest.xml /tmp/image.manifest.xml.bak
    2. 읽고 편집하기 쉽도록 image.manifest.xml 파일의 서식을 다시 설정합니다.

      [ec2-user ~]$ sudo xmllint --format /tmp/image.manifest.xml.bak > /tmp/image.manifest.xml
    3. 텍스트 편집기로 image.manifest.xml에서 블록 디바이스 매핑을 편집합니다. 아래 예는 ephemeral1 인스턴스 스토어 볼륨의 새 항목을 보여 줍니다.

      참고

      제외 파일 목록은 ec2-bundle-vol 단원을 참조하세요.

      <block_device_mapping> <mapping> <virtual>ami</virtual> <device>sda</device> </mapping> <mapping> <virtual>ephemeral0</virtual> <device>sdb</device> </mapping> <mapping> <virtual>ephemeral1</virtual> <device>sdc</device> </mapping> <mapping> <virtual>root</virtual> <device>/dev/sda1</device> </mapping> </block_device_mapping>
    4. image.manifest.xml 파일을 저장하고 텍스트 편집기를 종료합니다.

  4. Amazon S3에 번들을 업로드하려면 다음과 같이 ec2-upload-bundle 명령을 실행합니다.

    [ec2-user ~]$ ec2-upload-bundle -b my-s3-bucket/bundle_folder/bundle_name -m /tmp/image.manifest.xml -a your_access_key_id -s your_secret_access_key
    중요

    US East (N. Virginia) 이외 리전에서 AMI를 등록하려면 --region 옵션이 있는 대상 리전과 대상 리전에 이미 존재하는 버킷 경로 또는 대상 리전에 생성할 수 있는 고유 버킷 경로를 모두 지정해야 합니다.

  5. (선택 사항) 번들을 Amazon S3에 업로드한 후에는 다음 /tmp 명령을 사용하여 인스턴스의 rm 디렉터리에서 번들을 제거할 수 있습니다.

    [ec2-user ~]$ sudo rm /tmp/image.manifest.xml /tmp/image.part.* /tmp/image
    중요

    -d /path/to/bundle/storage에서 단계 2 옵션과 함께 경로를 지정한 경우 /tmp 대신 해당 경로를 사용합니다.

  6. AMI를 등록하려면 다음과 같이 register-image 명령을 사용합니다.

    [ec2-user ~]$ aws ec2 register-image --image-location my-s3-bucket/bundle_folder/bundle_name/image.manifest.xml --name AMI_name --virtualization-type hvm
    중요

    이전에 ec2-upload-bundle 명령에 리전을 지정한 경우 이 명령에도 해당 리전을 다시 지정하세요.

인스턴스 스토어 기반 Ubuntu 인스턴스에서 AMI 생성

이 섹션에서는 인스턴스 스토어 볼륨을 루트 볼륨으로 사용하여 Ubuntu Linux 인스턴스에서 AMI를 생성하는 방법에 대해 설명합니다. 다음 절차는 다른 Linux 배포를 실행하는 인스턴스에서는 작동하지 않을 수 있습니다. Amazon Linux 관련 절차는 인스턴스 스토어 기반 Amazon Linux 인스턴스에서 AMI 생성 단원을 참조하세요.

AMI 도구 사용을 준비하려면(HVM 인스턴스에만 해당)

AMI 도구를 올바르게 부팅하려면 GRUB Legacy가 필요합니다. 하지만 Ubuntu는 GRUB 2를 사용하도록 구성됩니다. 인스턴스에 GRUB Legacy가 사용되는지 확인하고 사용되지 않는 경우 설치하고 구성해야 합니다.

HVM 인스턴스에서도 AMI 도구가 올바르게 작동하려면 파티셔닝 도구를 설치해야 합니다.

  1. 인스턴스에 GRUB Legacy(버전 0.9x 이하)가 설치되어 있어야 합니다. GRUB Legacy가 존재하는지 확인하고 필요하면 설치합니다.

    1. GRUB 설치의 버전을 확인합니다.

      ubuntu:~$ grub-install --version grub-install (GRUB) 1.99-21ubuntu3.10

      이 예에서는 GRUB 버전이 0.9x 이상이므로 GRUB Legacy를 설치해야 합니다. 단계 2 항목으로 이동합니다. GRUB Legacy가 이미 존재하는 경우 단계 2으로 건너뛸 수 있습니다.

    2. 다음 명령을 사용하여 grub 패키지를 설치합니다.

      ubuntu:~$ sudo apt-get install -y grub
  2. 배포용 패키지 관리자를 사용하여 다음 파티션 관리 패키지를 설치합니다.

    • gdisk(일부 배포에서는 이 gptfdisk 패키지를 대신 호출할 수 있음)

    • kpartx

    • parted

    다음 명령을 사용합니다.

    ubuntu:~$ sudo apt-get install -y gdisk kpartx parted
  3. 인스턴스용 커널 파라미터를 확인합니다.

    ubuntu:~$ cat /proc/cmdline BOOT_IMAGE=/boot/vmlinuz-3.2.0-54-virtual root=UUID=4f392932-ed93-4f8f-aee7-72bc5bb6ca9d ro console=ttyS0 xen_emul_unplug=unnecessary

    커널 및 루트 디바이스 파라미터인 ro, console=ttyS0xen_emul_unplug=unnecessary 뒤에 이어지는 옵션을 메모해 둡니다. 옵션이 이와 다를 수도 있습니다.

  4. /boot/grub/menu.lst의 커널 항목을 확인합니다.

    ubuntu:~$ grep ^kernel /boot/grub/menu.lst kernel /boot/vmlinuz-3.2.0-54-virtual root=LABEL=cloudimg-rootfs ro console=hvc0 kernel /boot/vmlinuz-3.2.0-54-virtual root=LABEL=cloudimg-rootfs ro single kernel /boot/memtest86+.bin

    console 파라미터가 hvc0 대신 ttyS0을 가리키고 있으며 xen_emul_unplug=unnecessary 파라미터가 없습니다. 앞에서 말했듯이, 옵션이 이와 다를 수도 있습니다.

  5. 주로 사용하는 텍스트 편집기(예: /boot/grub/menu.lst 또는 vim)에서 nano 파일을 편집하여 콘솔을 변경하고 앞에서 식별한 파라미터를 부팅 항목에 추가합니다.

    title Ubuntu 12.04.3 LTS, kernel 3.2.0-54-virtual root (hd0) kernel /boot/vmlinuz-3.2.0-54-virtual root=LABEL=cloudimg-rootfs ro console=ttyS0 xen_emul_unplug=unnecessary initrd /boot/initrd.img-3.2.0-54-virtual title Ubuntu 12.04.3 LTS, kernel 3.2.0-54-virtual (recovery mode) root (hd0) kernel /boot/vmlinuz-3.2.0-54-virtual root=LABEL=cloudimg-rootfs ro single console=ttyS0 xen_emul_unplug=unnecessary initrd /boot/initrd.img-3.2.0-54-virtual title Ubuntu 12.04.3 LTS, memtest86+ root (hd0) kernel /boot/memtest86+.bin
  6. 이제 커널 항목에 올바른 파라미터가 들어 있는지 확인합니다.

    ubuntu:~$ grep ^kernel /boot/grub/menu.lst kernel /boot/vmlinuz-3.2.0-54-virtual root=LABEL=cloudimg-rootfs ro console=ttyS0 xen_emul_unplug=unnecessary kernel /boot/vmlinuz-3.2.0-54-virtual root=LABEL=cloudimg-rootfs ro single console=ttyS0 xen_emul_unplug=unnecessary kernel /boot/memtest86+.bin
  7. [Ubuntu 14.04 이상에만 해당] Ubuntu 14.04부터는 /boot/efi에 탑재된 별도의 EFI 파티션과 GPT 파티션 테이블이 인스턴스 스토어 기반 Ubuntu AMI에 사용됩니다. ec2-bundle-vol 명령은 이 부팅 파티션을 번들링할 수 없으므로, 아래 예와 같이 EFI 파티션에 대한 /etc/fstab 항목을 주석으로 처리해야 합니다.

    LABEL=cloudimg-rootfs / ext4 defaults 0 0 #LABEL=UEFI /boot/efi vfat defaults 0 0 /dev/xvdb /mnt auto defaults,nobootwait,comment=cloudconfig 0 2
인스턴스 스토어 기반 Ubuntu 인스턴스에서 AMI를 생성하려면

이 절차에서는 사전 조건의 사전 조건을 충족한다고 가정합니다.

다음 명령에서는 자신의 정보로 각각의 사용자 입력 자리 표시자를 바꿉니다.

  1. 인스턴스에 자격 증명을 업로드합니다. 이러한 자격 증명은 사용자와 Amazon EC2만 사용자의 AMI에 액세스할 수 있음을 보장하는 데 사용됩니다.

    1. 다음과 같이 인스턴스에서 자격 증명에 대한 임시 디렉터리를 생성합니다.

      ubuntu:~$ mkdir /tmp/cert

      이렇게 하면 생성된 이미지에서 자격 증명을 제외할 수 있습니다.

    2. scp 등의 보안 복사 도구를 사용하여 컴퓨터의 X.509 인증서와 프라이빗 키를 인스턴스의 /tmp/cert 디렉터리로 복사합니다. 다음 -i my-private-key.pem 명령의 scp 옵션은 X.509 프라이빗 키가 아니라 SSH를 사용하여 인스턴스에 연결하는 데 사용되는 프라이빗 키입니다. 예:

      you@your_computer:~ $ scp -i my-private-key.pem /path/to/pk-HKZYKTAIG2ECMXYIBH3HXV4ZBEXAMPLE.pem /path/to/cert-HKZYKTAIG2ECMXYIBH3HXV4ZBEXAMPLE.pem ec2-user@ec2-203-0-113-25.compute-1.amazonaws.com:/tmp/cert/ pk-HKZYKTAIG2ECMXYIBH3HXV4ZBEXAMPLE.pem 100% 717 0.7KB/s 00:00 cert-HKZYKTAIG2ECMXYIBH3HXV4ZBEXAMPLE.pem 100% 685 0.7KB/s 00:00

    또는 이들은 일반 텍스트 파일이므로 텍스트 편집기에서 인증서와 키를 열고 내용을 /tmp/cert의 새 파일로 복사할 수 있습니다.

  2. 인스턴스에서 ec2-bundle-vol 명령을 실행하여 Amazon S3로 업로드할 번들을 준비합니다. -e 옵션을 지정하여 자격 증명이 저장되어 있는 디렉터리를 제외해야 합니다. 기본적으로 번들 프로세스에는 중요 정보를 포함할 수 있는 파일이 제외됩니다. 값에는 *.sw, *.swo, *.swp, *.pem, *.priv, *id_rsa*, *id_dsa* *.gpg, *.jks, */.ssh/authorized_keys*/.bash_history가 포함됩니다. 이러한 파일을 모든 포함하려면 --no-filter 옵션을 사용합니다. 이러한 파일 중 일부만 포함하려면 --include 옵션을 사용합니다.

    중요

    기본적으로 AMI 번들링 프로세스에서는 루트 볼륨을 나타내는 /tmp 디렉터리에 압축 및 암호화된 파일 모음이 생성됩니다. /tmp에 사용 가능한 디스크 공간이 충분하지 않아서 번들을 저장할 수 없으면 -d /path/to/bundle/storage 옵션을 사용하여 번들을 저장할 다른 위치를 지정합니다. 일부 인스턴스의 /mnt 또는 /media/ephemeral0에 탑재된 임시 스토리지를 사용하거나 새 Amazon Elastic Block Store(Amazon EBS) 볼륨을 생성, 연결탑재하여 번들을 저장할 수도 있습니다.

    1. ec2-bundle-vol 명령을 루트로 실행해야 합니다. 대부분의 명령에 대해 sudo를 사용하여 승격된 권한을 얻을 수 있지만 이 경우 환경 변수를 유지하려면 sudo -E su를 실행해야 합니다.

      ubuntu:~$ sudo -E su

      이제 bash 프롬프트가 사용자를 루트 사용자로 식별하고 달러 기호가 해시 태그로 바뀌어 현재 위치가 루트 셸임을 표시합니다.

      root@ubuntu:#
    2. AMI 번들을 실행하려면 다음과 같이 ec2-bundle-vol 명령을 실행합니다.

      root@ubuntu:# ec2-bundle-vol -k /tmp/cert/pk-HKZYKTAIG2ECMXYIBH3HXV4ZBEXAMPLE.pem -c /tmp/cert/cert-HKZYKTAIG2ECMXYIBH3HXV4ZBEXAMPLE.pem -u your_aws_account_id -r x86_64 -e /tmp/cert --partition gpt
      중요

      Ubuntu 14.04 이상 HVM 인스턴스의 경우 부팅 명령을 제대로 번들링하려면 --partition mbr 플래그를 추가합니다. 그렇지 않으면 새로 생성된 AMI가 부팅되지 않습니다.

      이미지가 생성되는 데 몇 분 정도 걸릴 수 있습니다. 이 명령이 완료되면 tmp 디렉터리에 번들(image.manifest.xml과 여러 image.part.xx 파일)이 포함됩니다.

    3. 루트 셸을 종료합니다.

      root@ubuntu:# exit
  3. (선택 사항) 인스턴스 스토어 볼륨을 더 추가하려면 AMI의 image.manifest.xml 파일에서 블록 디바이스 매핑을 편집합니다. 자세한 내용은 블록 디바이스 매핑 섹션을 참조하세요.

    1. image.manifest.xml 파일의 백업을 만듭니다.

      ubuntu:~$ sudo cp /tmp/image.manifest.xml /tmp/image.manifest.xml.bak
    2. 읽고 편집하기 쉽도록 image.manifest.xml 파일의 서식을 다시 설정합니다.

      ubuntu:~$ sudo xmllint --format /tmp/image.manifest.xml.bak > /tmp/image.manifest.xml
    3. 텍스트 편집기로 image.manifest.xml에서 블록 디바이스 매핑을 편집합니다. 아래 예는 ephemeral1 인스턴스 스토어 볼륨의 새 항목을 보여 줍니다.

      <block_device_mapping> <mapping> <virtual>ami</virtual> <device>sda</device> </mapping> <mapping> <virtual>ephemeral0</virtual> <device>sdb</device> </mapping> <mapping> <virtual>ephemeral1</virtual> <device>sdc</device> </mapping> <mapping> <virtual>root</virtual> <device>/dev/sda1</device> </mapping> </block_device_mapping>
    4. image.manifest.xml 파일을 저장하고 텍스트 편집기를 종료합니다.

  4. Amazon S3에 번들을 업로드하려면 다음과 같이 ec2-upload-bundle 명령을 실행합니다.

    ubuntu:~$ ec2-upload-bundle -b my-s3-bucket/bundle_folder/bundle_name -m /tmp/image.manifest.xml -a your_access_key_id -s your_secret_access_key
    중요

    US East (N. Virginia) 이외 리전에서 AMI를 등록하려면 --region 옵션이 있는 대상 리전과 대상 리전에 이미 존재하는 버킷 경로 또는 대상 리전에 생성할 수 있는 고유 버킷 경로를 모두 지정해야 합니다.

  5. (선택 사항) 번들을 Amazon S3에 업로드한 후에는 다음 /tmp 명령을 사용하여 인스턴스의 rm 디렉터리에서 번들을 제거할 수 있습니다.

    ubuntu:~$ sudo rm /tmp/image.manifest.xml /tmp/image.part.* /tmp/image
    중요

    -d /path/to/bundle/storage에서 단계 2 옵션과 함께 경로를 지정한 경우 /tmp 대신 아래 동일 경로를 사용합니다.

  6. AMI를 등록하려면 다음과 같이 register-image AWS CLI 명령을 사용합니다.

    ubuntu:~$ aws ec2 register-image --image-location my-s3-bucket/bundle_folder/bundle_name/image.manifest.xml --name AMI_name --virtualization-type hvm
    중요

    이전에 ec2-upload-bundle 명령에 리전을 지정한 경우 이 명령에도 해당 리전을 다시 지정하세요.

  7. [Ubuntu 14.04 이상에 해당] /etc/fstab에서 EFI 항목의 주석 처리를 제거합니다. 그렇지 않으면 실행 중인 인스턴스를 재부팅할 수 없습니다.