保留已淘汰平台的 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 的名稱。依循此程序的指令碼會將字串 "Copy of" 附加到 source-ami-id 名稱的開頭,產生新的 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"
注意

為將儲存成本降至最低,當不再需要使用自訂 AMI 來啟動 Elastic Beanstalk 環境時,請考慮將其清除。如需更多詳細資訊,請參閱 清理自訂 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
注意

為將儲存成本降至最低,當不再需要使用自訂 AMI 來啟動 Elastic Beanstalk 環境時,請考慮將其清除。如需更多詳細資訊,請參閱 清理自訂 AMI