사용 중지 플랫폼에 대한 Amazon Machine Image(AMI)에 대한 액세스 보존하기 - AWS Elastic Beanstalk

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

사용 중지 플랫폼에 대한 Amazon Machine Image(AMI)에 대한 액세스 보존하기

Elastic Beanstalk는 브랜치에서 사용하는 운영 체제 또는 주 구성 요소가 수명 종료에 도달하면 플랫폼 브랜치 상태를 사용 중지됨으로 설정합니다. 플랫폼 브랜치용 기본 Elastic Beanstalk AMI를 프라이빗으로 설정하여 이 사용 중지된 AMI를 사용하지 않도록 할 수도 있습니다. 프라이빗으로 설정된 AMI를 사용하는 환경에서는 더 이상 인스턴스를 시작할 수 없습니다.

애플리케이션이 사용 중지되기 전에 지원되는 환경으로 마이그레이션할 수 없는 경우, 사용 중인 환경이 이러한 상황일 수 있습니다. 기본 Elastic Beanstalk AMI가 프라이빗으로 설정된 Beanstalk 플랫폼 브랜치에 대한 환경을 업데이트해야 할 수 있습니다. 다른 접근법을 사용할 수도 있습니다. 사용자 환경에서 사용하는 기본 Elastic Beanstalk AMI의 사본을 기반으로 기존 환경을 업데이트할 수 있습니다.

이 주제에서는 사용자 환경에서 사용하는 기본 Elastic Beanstalk AMI의 사본을 기반으로 기존 환경을 업데이트하는 몇 가지 단계와 독립 실행형 스크립트를 제공합니다. 애플리케이션을 지원되는 플랫폼으로 마이그레이션할 수 있게 되면 애플리케이션 및 지원되는 환경을 유지하기 위한 표준 절차를 계속 사용할 수 있습니다.

수동 단계

기본 Elastic Beanstalk AMI의 AMI 사본을 기반으로 환경을 업데이트하려면
  1. 환경에서 사용 중인 AMI를 확인합니다. 이 명령은 사용자가 파라미터에 입력한 Elastic Beanstalk 환경에서 사용하는 AMI를 반환합니다. 반환된 값은 다음 단계에서 source-ami-id로 사용할 수 있습니다.

    명령 창에서 명령을 다음과 같이 실행합니다. 자세한 내용은 AWS CLI 명령 참조에서 describe-configuration-settings를 참조하세요.

    복사할 소스 AMI를 저장하는 AWS 리전을 지정합니다. 애플리케이션 이름 및 환경 이름을 소스 AMI를 기반으로 하는 애플리케이션 이름 및 환경 이름으로 바꿉니다. 다음과 같이 쿼리 파라미터의 텍스트를 입력합니다.

    >aws elasticbeanstalk describe-configuration-settings \ --application-name my-application \ --environment-name my-environment \ --region us-east-2 \ --query "ConfigurationSettings[0].OptionSettings[?OptionName=='ImageId'] | [0].Value"
  2. AMI를 계정에 복사합니다. 이 명령은 이전 단계에서 반환된 source-ami-id를 복사하여 생성된 새 AMI를 반환합니다.

    참고

    이 명령으로 출력되는 새 AMI ID를 기록해 둡니다. 다음 단계에서는 예시 명령의 copied-ami-id를 바꾸어 입력해야 합니다.

    명령 창에서 명령을 다음과 같이 실행합니다. 자세한 내용은 AWS CLI 명령 참조copy-image를 참조하세요.

    복사할 소스 AMI의 AWS 리전(--source-region) 및 새 사용자 지정 AMI를 사용할 리전(--region)을 지정합니다. source-ami-id를 복사할 이미지의 AMI로 바꿉니다. 이전 단계의 명령에서 source-ami-id가 반환되었습니다. new-ami-name을 대상 리전의 새 AMI를 설명하는 이름으로 바꿉니다. 이 절차를 따르는 스크립트는 source-ami-id 이름 앞에 "Copy of" 문자열을 추가하여 새 AMI 이름을 생성합니다.

    >aws ec2 copy-image \ --region us-east-2 \ --source-image-id source-ami-id \ --source-region us-east-2 \ --name new-ami-name
  3. 복사한 AMI를 사용하도록 환경을 업데이트합니다. 명령이 실행되면 환경의 상태를 반환합니다.

    명령 창에서 명령을 다음과 같이 실행합니다. 자세한 내용은 AWS CLI 명령 참조update-environment를 참조하세요.

    업데이트해야 하는 환경 및 애플리케이션의 AWS 리전을 지정합니다. 애플리케이션 이름 및 환경 이름을 이전 단계의 copied-ami-id와 연결해야 하는 이름으로 바꿉니다. --option-setttings 파라미터의 경우 copied-ami-id를 이전 명령의 출력에서 기록해 둔 AMI ID로 바꿉니다.

    >aws elasticbeanstalk update-environment \ --application-name my-application \ --environment-name my-environment \ --region us-east-2 \ --option-settings "Namespace=aws:autoscaling:launchconfiguration,OptionName=ImageId,Value=copied-ami-id"
참고

스토리지 비용을 최소화하려면, Elastic Beanstalk 환경을 실행하는 데 필요하지 않은 사용자 지정 AMI를 정리하는 것이 좋습니다. 자세한 내용은 사용자 지정 AMI 정리 섹션을 참조하세요.

독립 실행형 스크립트

다음 스크립트는 이전 수동 단계와 동일한 결과를 제공합니다. copy_ami_and_update_env.zip 링크를 선택하여 스크립트를 다운로드합니다.

#!/bin/bash set -ue USAGE="This script is used to copy an AMI used by your Elastic Beanstalk environment into your account to use in your environment.\n\n" USAGE+="Usage:\n\n" USAGE+="./$(basename $0) [OPTIONS]\n" USAGE+="OPTIONS:\n" USAGE+="\t--application-name <application-name>\tThe name of your Elastic Beanstalk application.\n" USAGE+="\t--environment-name <environment-name>\tThe name of your Elastic Beanstalk environment.\n" USAGE+="\t--region <region> \t\t\tThe AWS region your Elastic Beanstalk environment is deployed to.\n" USAGE+="\n\n" USAGE+="Script Usage Example(s):\n" USAGE+="./$(basename $0) --application-name my-application --environment-name my-environment --region us-east-1\n" if [ $# -eq 0 ]; then echo -e $USAGE exit fi while [[ $# -gt 0 ]]; do case $1 in --application-name) APPLICATION_NAME="$2"; shift ;; --environment-name) ENVIRONMENT_NAME="$2"; shift ;; --region) REGION="$2"; shift ;; *) echo "Unknown option $1" ; echo -e $USAGE ; exit ;; esac shift done aws_cli_version="$(aws --version)" if [ $? -ne 0 ]; then echo "aws CLI not found. Please install it: https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html. Exiting." exit 1 fi echo "Using aws CLI version: ${aws_cli_version}" account=$(aws sts get-caller-identity --query "Account" --output text) echo "Using account ${account}" environment_ami_id=$(aws elasticbeanstalk describe-configuration-settings \ --application-name "$APPLICATION_NAME" \ --environment-name "$ENVIRONMENT_NAME" \ --region "$REGION" \ --query "ConfigurationSettings[0].OptionSettings[?OptionName=='ImageId'] | [0].Value" \ --output text) echo "Image associated with environment ${ENVIRONMENT_NAME} is ${environment_ami_id}" owned_image=$(aws ec2 describe-images \ --owners self \ --image-ids "$environment_ami_id" \ --region "$REGION" \ --query "Images[0]" \ --output text) if [ "$owned_image" != "None" ]; then echo "${environment_ami_id} is already owned by account ${account}. Exiting." exit fi source_image_name=$(aws ec2 describe-images \ --image-ids "$environment_ami_id" \ --region "$REGION" \ --query "Images[0].Name" \ --output text) if [ "$source_image_name" = "None" ]; then echo "Cannot find ${environment_ami_id}. Please contact AWS support if you need additional help: https://aws.amazon.com/support." exit 1 fi copied_image_name="Copy of ${source_image_name}" copied_ami_id=$(aws ec2 describe-images \ --owners self \ --filters Name=name,Values="${copied_image_name}" \ --region "$REGION" \ --query "Images[0].ImageId" \ --output text) if [ "$copied_ami_id" != "None" ]; then echo "Detected that ${environment_ami_id} has already been copied by account ${account}. Skipping image copy." else echo "Copying ${environment_ami_id} to account ${account} with name ${copied_image_name}" copied_ami_id=$(aws ec2 copy-image \ --source-image-id "$environment_ami_id" \ --source-region "$REGION" \ --name "$copied_image_name" \ --region "$REGION" \ --query "ImageId" \ --output text) echo "New AMI ID is ${copied_ami_id}" echo "Waiting for ${copied_ami_id} to become available" aws ec2 wait image-available \ --image-ids "$copied_ami_id" \ --region "$REGION" echo "${copied_ami_id} is now available" fi echo "Updating environment ${ENVIRONMENT_NAME} to use ${copied_ami_id}" environment_status=$(aws elasticbeanstalk update-environment \ --application-name "$APPLICATION_NAME" \ --environment-name "$ENVIRONMENT_NAME" \ --option-settings "Namespace=aws:autoscaling:launchconfiguration,OptionName=ImageId,Value=${copied_ami_id}" \ --region "$REGION" \ --query "Status" \ --output text) echo "Environment ${ENVIRONMENT_NAME} is now ${environment_status}" echo "Waiting for environment ${ENVIRONMENT_NAME} update to complete" aws elasticbeanstalk wait environment-updated \ --application-name "$APPLICATION_NAME" \ --environment-names "$ENVIRONMENT_NAME" \ --region "$REGION" echo "Environment ${ENVIRONMENT_NAME} update complete"
참고

스크립트를 실행하려면 AWS CLI가 설치되어 있어야 합니다. 설치 지침은 AWS Command Line Interface 사용 설명서AWS CLI의 최신 버전 설치 또는 업데이트를 참조하세요.

AWS CLI를 설치한 후에는 환경을 소유한 AWS 계정도 사용하도록 구성해야 합니다. 자세한 내용은 AWS Command Line Interface 사용 설명서AWS CLI 구성을 참조하세요. 또한 계정에 AMI를 생성하고 Elastic Beanstalk 환경을 업데이트할 수 있는 권한도 있어야 합니다.

이 단계에서는 스크립트가 따르는 프로세스를 설명합니다.

  1. 사용 중인 계정을 인쇄합니다.

  2. 환경(소스 AMI)에서 사용하는 AMI를 확인합니다.

  3. 소스 AMI를 이미 해당 계정이 소유하고 있는지 확인합니다. 계정을 소유하고 있다면 종료합니다.

  4. 새 AMI 이름에 사용할 수 있는지 소스 AMI의 이름을 확인합니다. 이는 소스 AMI에 대한 액세스를 확인하는 역할도 수행합니다.

  5. 소스 AMI가 이미 계정에 복사되었는지 확인합니다. 이는 계정이 소유하고 있는 복사된 AMI의 이름으로 AMI를 검색하여 수행됩니다. 스크립트 실행 사이에 AMI 이름이 변경된 경우 이미지를 다시 복사합니다.

  6. 소스 AMI가 아직 복사되지 않은 경우, 소스 AMI를 계정에 복사하고 새 AMI를 사용할 수 있을 때까지 기다립니다.

  7. 새 AMI를 사용하도록 환경 구성을 업데이트합니다.

  8. 환경 업데이트가 완료될 때까지 기다립니다.

copy_ami_and_update_env.zip 파일에서 스크립트를 추출한 후 다음 예시를 실행하여 실행합니다. 예시의 애플리케이션 이름과 환경 이름을 사용자의 값으로 바꿉니다.

>sh copy_ami_and_update_env.sh \ --application-name my-application \ --environment-name my-environment \ --region us-east-1
참고

스토리지 비용을 최소화하려면, Elastic Beanstalk 환경을 실행하는 데 필요하지 않은 사용자 지정 AMI를 정리하는 것이 좋습니다. 자세한 내용은 사용자 지정 AMI 정리 섹션을 참조하세요.