提供最新 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的主要内容,如果未能解决你的问题,请参考以下文章