脚本或 api 以提供最新的 amazon-ecs-optimized 图像的 ami-id

Script or api to provide the ami-id of the latest amazon-ecs-optimized image

我 运行 进入一个要求,我需要获取特定区域的最新 amazon-ecs-optimized 图像的 EC2 ami id。是否有任何脚本或 api 可用于选择他们在创建新集群时提供的 ami-id?

这样一旦他们用最新的 ami 更新了控制台,我就不需要更新我的脚本了。

我们可以使用 AWS 命令​​行界面 (CLI) 来获取 ami-id。 api describe-images 描述了您可以使用的图像。发现amazon-ecs-optimized镜像的owner id是591542846629

以下脚本returns 区域ap-northeast-1 中最新的amazon-ecs-optimized 图像id。

name=$(aws --region ap-northeast-1 ec2 describe-images \
     --owners 591542846629| awk -F ': ' '/"Name"/ { print  | "sort" }' \
     | tr -d '",' | grep -v rc |tail -1)

ami_id=$(aws --region ap-northeast-1 ec2 describe-images --owners 591542846629 \
        --filters Name=name,Values="$name" \
    | awk -F ': ' '/"ImageId"/ { print  }' | tr -d '",')

echo $ami_id

我安装了 jq,使搜索和排序更容易、更可靠:

aws --region ap-northeast-1 ec2 describe-images \
    --owners 591542846629 | \
    jq '.Images[] | {Name, ImageId} | select(.Name | contains("amazon-ecs-optimized") )' | \
    jq -s 'sort_by(.Name) | reverse | .[0].ImageId' -r

我也在使用基本名称匹配,以防该所有者添加更多图像类型。

打印出所有 AMI 及其元数据和日期,然后进行选择会更安全。 AWS CLI 限制返回的 AMI 数量。

这是我的,和上面的差不多,但是有一些过滤器,我也替换了一些选项。

# Owners
owners=amazon
owners=aws-marketplace
owners=591542846629  # AMZN ECS
owners=microsoft

# AMI Regions
region=us-west-2
region=eu-central-1

# Amazon AMI - ECS
owners=591542846629
type="amazon-ecs-optimized"
aws ec2 describe-images \
 --region ${region} \
 --filters "Name=virtualization-type,Values=hvm" "Name=root-device-type,Values=ebs" \
 --owners "${owners}" | jq -r '.Images[] | "\(.CreationDate) \(.Name) \(.ImageId)"' | grep "${type}" | sort -r | head

还有一个纯粹使用 AWS CLI 的示例,因为之前的所有示例都依赖于 jq and/or 管道。大部分摘自 Jason Haines 的评论 here.

aws ec2 describe-images --owner amazon --filters 'Name=name,Values=amzn-ami-????.??.?-amazon-ecs-optimized'  'Name=state,Values=available' --query 'sort_by(Images, &CreationDate) | [-1].ImageId' --output text

现在可以通过 SSM Parameter Store 完成此操作 API

https://aws.amazon.com/about-aws/whats-new/2018/04/amazon-ecs-provides-ecs-optimized-ami-metadata-via-ssm-parameter/

例如:

aws ssm get-parameters --names /aws/service/ecs/optimized-ami/amazon-linux/recommended

结合@romaninsh 和@Derek 的回答

aws ssm get-parameters --names /aws/service/ecs/optimized-ami/amazon-linux/recommended | \
    jq -r .Parameters[].Value | jq -r .image_id

这是使用 boto3 可以完成的方法

from operator import itemgetter
# ECS Optimized AMI to use, different per region. ID changes when an updated AMI is released.
# https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-optimized_AMI.html
AMI_NAME = 'amzn-ami-????.??.?-amazon-ecs-optimized'

session = boto3.Session()
ec2_client = self.session.client('ec2', region_name='ca-central-1')

ecs_amis = ec2_client.describe_images(
    Filters=[
        {'Name': 'name', 'Values': [AMI_NAME, ]},
        {'Name': 'state', 'Values': ['available', ]}
    ]
)
ecs_amis = ecs_amis.get('Images')
ecs_amis = sorted(ecs_amis, key=itemgetter('CreationDate'), reverse=True)
ami_id = ecs_amis[0]['ImageId']

并且 ami_id 现在包含根据 CreationDate 的最新 ami。干杯!

仅获取要在脚本中使用的 AMI ID 的衬里:

aws ssm get-parameters --names /aws/service/ecs/optimized-ami/amazon-linux/recommended/image_id --region us-east-1 --query 'Parameters[0].Value'

这一行仅打印出指定区域的最新 ECS 优化 AMI ID。

aws ssm get-parameters --names /aws/service/ecs/optimized-ami/amazon-linux/recommended --query "Parameters[].Value" --output text --region us-west-1 | jq -r '.image_id'