保持能够访问适用于已停用平台的亚马逊机器映像(AMI)的方法 - Amazon Elastic Beanstalk
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

保持能够访问适用于已停用平台的亚马逊机器映像(AMI)的方法

当分支使用的操作系统或主要组件达到生命周期终点时,Elastic Beanstalk 将平台分支状态设置为停用。平台分支的基础 Elastic Beanstalk AMI 也可以私有化,以防止使用过时的 AMI。使用已私有化的 AMI 的环境将无法再启动实例。

如果无法在应用程序停用之前将其迁移到受支持的环境,则您的环境可能就会出现这种情况。可能需要更新 Beanstalk 平台分支的环境,在这个环境中,基础 Elastic Beanstalk AMI 已私有化。可以采用另一种方法。您可以根据环境使用的基础 Elastic Beanstalk AMI 副本更新现有环境。

本主题提供了一些步骤和一个独立脚本,用于根据环境使用的基础 Elastic Beanstalk AMI 副本更新现有环境。一旦将应用程序迁移到受支持的平台,您就可以继续使用标准过程来维护您的应用程序和受支持的环境。

手动步骤

要基于基础 Elastic Beanstalk AMI 的 AMI 副本更新环境
  1. 确定环境使用的 AMI。此命令返回您在参数中提供的 Elastic Beanstalk 环境使用的 AMI。返回的值将在下一步中用作 source-ami-id

    在命令窗口中,运行以下命令。有关更多信息,请参阅《Amazon CLI 命令参考》中的 describe-configuration-settings

    指定存储您要复制的源 AMI 的 Amazon 区域。将应用程序名称和环境名称替换为基于源 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 复制到您的账户。此命令将返回新的 AMI,该 AMI 是通过复制上一步中返回的 source-ami-id 得到的。

    注意

    请务必记下此命令输出的新 AMI id。您需要在下一步中输入此 id,替换示例命令中的 copied-ami-id

    在命令窗口中,运行以下命令。有关更多信息,请参见《Amazon CLI 命令参考》中的 copy-image

    指定要复制的源 AMI 的 Amazon 区域(--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。该命令运行后,将返回环境的状态。

    在命令窗口中,运行以下命令。有关更多信息,请参阅《Amazon CLI 命令参考》中的 update-environment

    指定需要更新的环境和应用程序的 Amazon 区域。将应用程序名称和环境名称替换为需要与上一步中的 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"
注意

必须安装 Amazon CLI 才能执行脚本。有关安装说明,请参见《Amazon Command Line Interface 用户指南》中的安装或更新最新版本的 Amazon CLI

安装 Amazon CLI 后,还必须将其配置为使用拥有该环境的 Amazon 账户。有关更多信息,请参阅《Amazon Command Line Interface 用户指南》中的配置 Amazon 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