Develop/AWS

[AWS] Custom AMI

Gr00t 2021. 2. 13. 14:20
해당 포스팅은 A Cloud Guru 서비스에서 제공하는 예제를 포함하고 있습니다.

Custom AMI

AWS에서 사용하던 인스턴스를 그대로 이미지로 만들 수 있다. 그런 이미지를 Custom AMI이라고 하며 자신이 구축한 인스턴스 환경을 그대로 이미지화 할 수 있다는 점에서 클라우드 환경에서 반드시 필요한 기능이다.

장점

이미지를 만드는 것뿐만아니라 만들어진 이미지를 바탕으로 새로운 인스턴스를 생성할수도 있는데 이런 특징은 클라우드 환경에서 몇가지 장점으로 작용하게 된다.

  • Scale Out

    AWS는 Auto Scaling기능을 지원한다. Auto Scaling 그룹에 구축이 완료된 이미지를 추가하면 Scale Out 이벤트가 발생할 경우, Custom 이미지를 바탕으로 동일 환경의 인스턴스가 추가되어 빠르게 일관성있는 서비스를 제공할 수 있게된다.

  • region 변경

    분산 환경의 장점 중 하나는 각 지역(region)별로 환경을 구성해 보다 빠르고 안정적으로 접근이 가능하게 만드는 것이다. 그러기 위해서는 동일한 환경을 각 지역에 구축해야하는데 이때도 Custom AMI를 가지고 각 지역별로 동일한 인스턴스를 생성하는 것이 가능해 지역을 바꾸거나 추가하는 것도 편리해진다.

  • Backup

    Custom AMI을 통해서 구축한 환경에 대한 백업(backup)을 진행할수도 있다. 현재까지 구축된 환경을 이미지로 만들어두고 문제가 생기면 만들어둔 이미지를 바탕으로 언제든 다시 인스턴스를 생성할 수 있다. 따라서 각 단계별로 Custom AMI를 생성하고 이전 이미지를 삭제하면서 진행한다면 인스턴스가 갑자기 작동을 멈추나 환경 구성을 되돌리고 싶을때 용이할 것이다.

출처 : AWS 공식 홈페이지

생성과정

  1. Base AMI로 VPC에 인스턴스를 생성한다.
  1. 생성된 인스턴스에 환경을 구축한다.
  1. 구축이 완료된 인스턴스를 Custom AMI로 만든다.
  1. Custom AMI로 인스턴스를 생성한다.

다른 region에서 Custom AMI기반 인스턴스를 생성하려면 인스턴스를 복사하는 과정을 거쳐야 한다. 자세한 설명은 밑에 예제를 따라하면서 하도록 한다.
출처 : A Cloud Guru 이미지

Apache-PHP 이미지 생성해보기

학습을 위해서 A Cloud Guru에 있는 Hands-on Labs 예제를 따라서 Custom AMI를 생성해보도록 한다.

Amazon Linux 이미지 기반 인스턴스 생성

AWS 인스턴스를 생성하는 과정은 이전에 자세히 다뤘음으로 필요한 설정만 확인하도록 한다.

  • Amazon Linux 이미지
  • t2.micro
  • Public IP 자동 할당
  • 보안 그룹(Security Group)에 SSH와 HTTP 추가 (소스를 내 IP로 설정)

위에 몇가지 주의해서 볼 것들만 확인하고 인스턴스를 생성하도록 한다.

인스턴스에서 Apache와 PHP 설치

SSH 접속 도구(여기서는 MobaXterm)를 사용해서 인스턴스에 접속해 Apache와 PHP를 설치한다.

여기서는 웹 서버를 설치하고 해당 환경이 Custom AMI로 만들고 인스턴스를 재생성해도 유지되는지 확인하는 것이 목적이다. 따라서 다른 프로그램을 설치하고 환경을 구축해도 된다.

sudo yum update -y
sudo yum install -y httpd php
sudo systemctl start httpd
sudo systemctl enable httpd

위에 명령을 쭉 입력하고 인스턴스의 Public IP를 브라우저에 입력해 접속하면 아래와 같이 Test page를 볼 수 있다.

php는 제대로 깔린 것 같으니 phpinfo 페이지를 만들어본다.

sudo usermod -aG apache ec2-user
sudo chown -R ec2-user:apache /var/www
echo "<?php phpinfo(); ?>" > /var/www/html/phpinfo.php

위에 명령을 입력하고 좀전에 입력한 IP뒤에 /phpinfo.php를 붙여 reqeust를 보내면 아래와 같이 phpinfo 페이지를 볼 수 있다.

이제 인스턴스에 대한 환경 구축은 모두 마쳤다. 구축된 인스턴스를 이미지로 생성해보자.

Custom AMI 생성

인스턴스 대시보드에서 환경구축한 인스턴스를 선택하고 '작업' → '이미지 및 템플릿' → '이미지생성'을 클릭한다.

* 파일 시스템의 무결성 보장을 위해서는 인스턴스를 종료 → 볼륨 스냅샷 캡처 → 이미지 생성의 과정을 거치는 것이 권장된다고 한다.

이미지 생성창에서 이미지 이름과 설명을 넣어주고 다른 부분은 기본값으로 둔 뒤 이미지를 생성한다.

이미지를 생성하는 것 자체는 굉장히 간단하고 쉽다.

추가적으로 볼륨에 따라서 루트 볼륨, EBS 볼륨, 스토어 볼륨을 필요에 맞게 수정할 수 있다고 한다.

이미지가 생성되면 처음에 몇분은 pending 상태로 되어있지만 조금 지나면 available 상태가 되면서 사용할 수 있게 된다.

Custom AMI 기반 인스턴스 생성 (같은 region)

이제 인스턴스 생성에서 '나의 AMI'을 선택하면 아래와 같이 생성한 이미지를 볼 수 있다.

아까와 같은 방식으로 인스턴스를 생성하면 이제 인스턴스 대시보드에서 2개의 인스턴스를 확인할 수 있다. 나의 경우, Name태그를 붙여 구분했다. (My가 붙은 것이 Custom AMI로 만든 것이다)

이제 생성된 인스턴스가 이전 환경을 그대로 가지고 있는지 확인하기 위해서 SSH 접속 도구를 활용해 브라우저에서 호출해보자. 나는 MobaXterm을 사용해서 두개의 세션을 만들고 각각 public IP로 접속했다.

왼쪽이 base이미지로 만든 인스턴스고, 오른쪽이 custom 이미지로 만든 인스턴스에 접속한 결과이다. 분명 custom 이미지 기반 인스턴스에는 apache도 php도 설치하지 않았고 phpinfo.php파일도 생성하지 않았지만 접속이 가능한 것을 볼 수 있다. (url창을 보면 IP가 다름을 볼 수 있다)

Custom AMI 기반 인스턴스 생성 (다른 region)

같은 region이 아닌 다른 region에 Custom AMI을 사용해 인스턴스를 생성하려면 위에 언급했던 것처럼 AMI를 복사해서 다른 region으로 옮겨주어야 한다.

'이미지' → 'AMI' 탭에 들어가서 생성한 Custom AMI를 선택하고 '작업' → '이미지 복사'를 클릭한다.

원하는 region을 선택하고 필요하다면 이름과 설명을 수정한 다음 'AMI복사'를 클릭해 Custom AMI를 복사한다.

복사가 정상적으로 진행된다면 아래와 같은 화면이 뜨고 '완료'를 눌러서 넘어가면 된다.

‼️만약 해당 리전에 대한 권한이 없을 경우 다음과 같은 오류를 만날 수 있다.

복사를 완료한 후에 region을 변경해서 AMI를 확인해보면 이미지가 제대로 복사된 것을 확인할 수 있다. 👍🏻