提供最新 amazon-ecs-optimized image 的 ami-id 的脚本或 api

Posted

技术标签:

【中文标题】提供最新 amazon-ecs-optimized image 的 ami-id 的脚本或 api【英文标题】:Script or api to provide the ami-id of the latest amazon-ecs-optimized image 【发布时间】:2017-09-04 00:33:38 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

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

以下脚本返回区域 ap-northeast-1 中最新的 amazon-ecs 优化图像 ID。

name=$(aws --region ap-northeast-1 ec2 describe-images \
     --owners 591542846629| awk -F ': ' '/"Name"/  print $2 | "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 $2 ' | tr -d '",')

echo $ami_id

【讨论】:

【参考方案2】:

我安装了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

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

【讨论】:

【参考方案3】:

打印出所有 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

【讨论】:

【参考方案4】:

另外一个纯粹使用 AWS CLI,因为前面的所有示例都依赖于 jq 和/或管道。主要取自 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

【讨论】:

【参考方案5】:

这现在可以通过 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

【讨论】:

【参考方案6】:

结合@romaninsh 和@Derek 的答案

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

【讨论】:

【参考方案7】:

这是使用 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。干杯!

【讨论】:

【参考方案8】:

一个只获取要在脚本中使用的 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'

【讨论】:

【参考方案9】:

这一行仅打印指定区域的最新 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'

【讨论】:

以上是关于提供最新 amazon-ecs-optimized image 的 ami-id 的脚本或 api的主要内容,如果未能解决你的问题,请参考以下文章

领域 sumOfProperty 不提供最新更新

将为我提供每个 senderId 的最新 messageContent 帖子的 SQL 查询是啥?

sh 从Terraform存储库下载最新的提供程序

有关给定日期的sql查询,如果不存在,请提供最新日期

微软开源项目提供企业级可扩展推荐系统最新实践指南

根据表单字段中提供的日期查询 MS Access 中的最新记录