Amazon S3 기반 AMI 만들기

Amazon S3 기반 AMI 만들기 (Create an Amazon S3-backed AMI)

인스턴스를 시작할 때 지정하는 AMI가 루트 볼륨의 유형을 결정해요. Amazon S3 기반 Linux AMI를 만들려면 기존 Amazon S3 기반 Linux AMI에서 시작한 인스턴스를 사용해요. 인스턴스를 필요에 맞게 커스터마이즈한 뒤 볼륨을 번들(bundle)하고 새 AMI를 등록하면, 이 커스터마이즈가 적용된 인스턴스를 새로 시작할 수 있어요.

Windows AMI는 루트 볼륨에 대해 인스턴스 스토어를 지원하지 않으므로 Amazon S3 기반 Windows AMI는 만들 수 없어요.

중요 인스턴스 스토어 볼륨을 루트 볼륨으로 지원하고 Amazon S3 기반 AMI를 요구하는 인스턴스 유형은 C1, C3, D2, I2, M1, M2, M3, R3, X1뿐이에요. AMI 생성 과정은 Amazon EBS 기반 AMI와 다르므로, 자세한 내용은 'Create an Amazon EBS-backed AMI'를 참고하세요.

목차 (Contents)

  • AMI 생성 개요
  • 사전 준비 (Prerequisites)
  • Amazon Linux 인스턴스에서 AMI 만들기
  • Amazon EC2 AMI 도구 설정하기
  • Amazon EC2 AMI 도구 참조
  • Amazon S3 기반 AMI를 EBS 기반 AMI로 변환하기

AMI 생성 개요 (Overview of AMI creation)

다음 다이어그램은 인스턴스 스토어 루트 볼륨을 가진 인스턴스에서 AMI를 만드는 과정을 요약해요.

먼저 만들고 싶은 AMI와 비슷한 AMI에서 인스턴스를 시작해요. 인스턴스에 연결해 커스터마이즈할 수 있어요. 인스턴스가 원하는 대로 설정되면 번들할 수 있어요. 번들링 과정이 완료되는 데는 몇 분이 걸려요. 과정이 완료되면 이미지 매니페스트(image.manifest.xml)와 루트 볼륨 템플릿을 담고 있는 파일들(image.part.xx)로 구성된 번들이 생겨요. 다음으로 번들을 Amazon S3 버킷에 업로드한 뒤 AMI를 등록하면 돼요.

참고 Amazon S3 기반 Linux AMI용 S3 버킷에 객체를 업로드하려면 버킷에 ACL이 활성화되어 있어야 해요. 그렇지 않으면 Amazon EC2가 업로드할 객체에 ACL을 설정할 수 없어요. 대상 버킷이 S3 Object Ownership의 버킷 소유자 강제(bucket owner enforced) 설정을 사용한다면 ACL이 비활성화되어 있어서 동작하지 않아요. 자세한 내용은 'Controlling ownership of objects and disabling ACLs for your bucket'을 참고하세요.

새 AMI를 사용해 인스턴스를 시작하면, Amazon S3에 업로드한 번들을 사용해 인스턴스의 루트 볼륨이 만들어져요. Amazon S3에서 번들이 사용하는 스토리지 공간은 삭제할 때까지 계정에 요금이 부과돼요. 자세한 내용은 'Deregister an Amazon EC2 AMI'를 참고하세요.

루트 볼륨 외에 인스턴스 스토어 볼륨을 인스턴스에 추가하면 새 AMI의 블록 디바이스 매핑에 이 볼륨들에 대한 정보가 포함되고, 새 AMI에서 시작하는 인스턴스의 블록 디바이스 매핑에 자동으로 이 볼륨 정보가 포함돼요. 자세한 내용은 'Block device mappings for volumes on Amazon EC2 instances'를 참고하세요.

사전 준비 (Prerequisites)

AMI를 만들기 전에 다음 작업을 완료해야 해요.

  • AMI 도구를 설치하세요. 자세한 내용은 'Set up the Amazon EC2 AMI tools'를 참고하세요.
  • AWS CLI를 설치하세요. 자세한 내용은 'Getting started with the AWS CLI'를 참고하세요.
  • 번들용 S3 버킷이 있고 버킷에 ACL이 활성화되어 있는지 확인하세요. ACL 구성에 대한 자세한 내용은 'Configuring ACLs'를 참고하세요.
    • AWS Management Console로 S3 버킷을 만들려면 Amazon S3 콘솔을 https://console.aws.amazon.com/s3/ 에서 열고 Create Bucket을 선택하세요.
    • AWS CLI로 S3 버킷을 만들려면 mb 명령을 사용할 수 있어요. 설치된 AMI 도구 버전이 1.5.18 이상이면 ec2-upload-bundle 명령으로도 S3 버킷을 만들 수 있어요. 자세한 내용은 ec2-upload-bundle을 참고하세요.
  • 번들의 파일이 S3 버킷에서 암호화되지 않았는지 확인하세요. AMI에 암호화가 필요하면 대신 EBS 기반 AMI를 사용할 수 있어요. 자세한 내용은 'Use encryption with EBS-backed AMIs'를 참고하세요.
  • AWS 계정 ID가 있는지 확인하세요. 자세한 내용은 AWS Account Management Reference Guide의 'View AWS account identifiers'를 참고하세요.
  • AWS CLI를 사용할 자격 증명이 있는지 확인하세요. 자세한 내용은 AWS Command Line Interface User Guide의 'Authentication and access credentials for the AWS CLI'를 참고하세요.
  • X.509 인증서와 해당 개인 키가 있는지 확인하세요.
    • X.509 인증서를 만들어야 한다면 'Manage signing certificates'를 참고하세요. X.509 인증서와 개인 키는 AMI를 암호화/복호화하는 데 사용돼요.
    • [China (Beijing)] $EC2_AMITOOL_HOME/etc/ec2/amitools/cert-ec2-cn-north-1.pem 인증서를 사용하세요.
    • [AWS GovCloud (US-West)] $EC2_AMITOOL_HOME/etc/ec2/amitools/cert-ec2-gov.pem 인증서를 사용하세요.
  • 인스턴스에 연결해 커스터마이즈하세요. 예를 들어 소프트웨어와 애플리케이션을 설치하고, 데이터를 복사하고, 임시 파일을 삭제하고, Linux 구성을 수정할 수 있어요.

Amazon Linux 인스턴스에서 AMI 만들기

다음 절차는 Amazon Linux 1을 실행하는 인스턴스 스토어 루트 볼륨 인스턴스에서 AMI를 만드는 방법을 설명해요. 다른 Linux 배포판을 실행하는 인스턴스에서는 동작하지 않을 수 있어요.

AMI 도구 사용 준비 (HVM 인스턴스 전용)

  • AMI 도구는 GRUB Legacy가 있어야 제대로 부팅돼요. 다음 명령으로 GRUB을 설치하세요:
[ec2-user ~]$ sudo yum install -y grub
  • 다음 명령으로 파티션 관리 패키지를 설치하세요:
[ec2-user ~]$ sudo yum install -y gdisk kpartx parted

인스턴스 스토어 루트 볼륨을 가진 Amazon Linux 인스턴스에서 AMI를 만들려면

이 절차는 '사전 준비(Prerequisites)'의 요구 사항을 충족했다고 가정해요. 다음 명령에서 각 사용자 입력 자리 표시자를 자신의 정보로 바꾸세요.

  1. 자격 증명을 인스턴스에 업로드하세요. 이 자격 증명은 본인과 Amazon EC2만 AMI에 액세스할 수 있도록 보장하는 데 사용돼요.

    • 인스턴스에 자격 증명용 임시 디렉토리를 다음과 같이 만드세요:

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

      이렇게 하면 생성되는 이미지에서 자격 증명을 제외할 수 있어요.

    • scp 같은 안전한 복사 도구를 사용해 X.509 인증서와 해당 개인 키를 컴퓨터에서 인스턴스의 /tmp/cert 디렉토리로 복사하세요. 다음 scp 명령의 -i my-private-key.pem 옵션은 SSH로 인스턴스에 연결할 때 사용하는 개인 키이지 X.509 개인 키가 아니에요. 예:

      you@your_computer:~ $ scp -i my-private-key.pem /path/to/pk-HKZYKTAIG2ECMXYIBH3HXV4ZBEXAMPLE.pem /path/to/cert-HKZYKTAIG2ECMXYIBH3HXV4ZBEXAMPLE.pem [email protected]:/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 EBS 볼륨을 만들고 연결·마운트할 수도 있어요. 자세한 내용은 Amazon EBS User Guide의 'Create an Amazon EBS volume'을 참고하세요.

  • ec2-bundle-vol 명령은 root로 실행해야 해요. 대부분의 명령에서 sudo로 높은 권한을 얻을 수 있지만, 이 경우에는 환경 변수를 유지하려면 sudo -E su를 실행해야 해요.

    [ec2-user ~]$ sudo -E su
    

    이제 bash 프롬프트가 사용자를 root로 식별하고, 달러 기호가 해시 태그로 바뀌어 root 셸에 있음을 알려줘요:

    [root ec2-user]#
    
  • 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
    

참고 China (Beijing) 및 AWS GovCloud (US-West) 리전에서는 --ec2cert 매개변수를 사용하고 사전 준비 단계에 따라 인증서를 지정하세요. 이미지를 만드는 데 몇 분이 걸릴 수 있어요. 이 명령이 완료되면 /tmp(또는 기본이 아닌 디렉토리)에 번들(image.manifest.xml과 여러 개의 image.part.xx 파일)이 생성돼요.

  • root 셸에서 나가세요.

    [root ec2-user]# exit
    
  1. (선택) 인스턴스 스토어 볼륨을 더 추가하려면 AMI의 image.manifest.xml 파일에서 블록 디바이스 매핑을 편집하세요. 자세한 내용은 'Block device mappings for volumes on Amazon EC2 instances'를 참고하세요.
    • image.manifest.xml 파일의 백업을 만드세요.

      [ec2-user ~]$ sudo cp /tmp/image.manifest.xml /tmp/image.manifest.xml.bak
      
    • 읽고 편집하기 쉽도록 image.manifest.xml 파일을 다시 포맷하세요.

      [ec2-user ~]$ sudo xmllint --format /tmp/image.manifest.xml.bak > /tmp/image.manifest.xml
      
    • 텍스트 편집기로 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>
  • image.manifest.xml 파일을 저장하고 텍스트 편집기를 닫으세요.
  1. 번들을 Amazon S3에 업로드하려면 ec2-upload-bundle 명령을 다음과 같이 실행하세요.
[ec2-user ~]$ ec2-upload-bundle -b amzn-s3-demo-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 옵션으로 대상 리전을 지정하고, 대상 리전에 이미 존재하는 버킷 경로나 대상 리전에서 생성할 수 있는 고유한 버킷 경로를 모두 지정해야 해요.

  1. (선택) 번들이 Amazon S3에 업로드된 후 다음 rm 명령으로 인스턴스의 /tmp 디렉토리에서 번들을 제거할 수 있어요:
[ec2-user ~]$ sudo rm /tmp/image.manifest.xml /tmp/image.part.* /tmp/image

중요 2단계에서 -d /path/to/bundle/storage 옵션으로 경로를 지정했다면 /tmp 대신 그 경로를 사용하세요.

  1. AMI를 등록하려면 register-image 명령을 다음과 같이 실행하세요.
[ec2-user ~]$ aws ec2 register-image --image-location amzn-s3-demo-bucket/bundle_folder/bundle_name/image.manifest.xml --name AMI_name --virtualization-type hvm

중요 ec2-upload-bundle 명령에 이전에 리전을 지정했다면 이 명령에도 해당 리전을 다시 지정하세요.

더 알아보기 (Learn more)