我想要在创建用于自动缩放架构的ec2实例时获取AWS Linux机器的最新ami id。
我尝试使用aws
cli获取镜像类型,但如果我使用describe-images
命令,它会打印出大量信息。
我的要求是仅获取映像ID,以便我可以使用它创建启动配置或启动具有最新ami-id的实例。
我想要在创建用于自动缩放架构的ec2实例时获取AWS Linux机器的最新ami id。
我尝试使用aws
cli获取镜像类型,但如果我使用describe-images
命令,它会打印出大量信息。
我的要求是仅获取映像ID,以便我可以使用它创建启动配置或启动具有最新ami-id的实例。
/aws/service/ami-amazon-linux-latest/
- AMI名称别名:(示例)amzn-ami-hvm-x86_64-gp2
它们:aws ec2 describe-images --owners amazon --filters "Name=name,Values=amzn*" --query 'sort_by(Images, &CreationDate)[].Name'
Get-EC2ImageByName -Name amzn* | Sort-Object CreationDate | Select-Object Name
可以转换为:
aws ssm get-parameters --names /aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2 --region us-east-1
Get-SSMParameter -Name /aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2 -region us-east-1
# Use public Systems Manager Parameter
Parameters :
LatestAmiId :
Type : 'AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>'
Default: ‘/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2’
Resources :
Instance :
Type : 'AWS::EC2::Instance'
Properties :
ImageId : !Ref LatestAmiId
describe-images
方法,完整名称包括版本,因此使用通配符 *
来避免指定特定版本。 - John Rotensteingp2
是Amazon EBS的一种卷类型。我认为它已经包含在AMI标识符中,以区分它与基于Instance Store支持的AMI,后者从临时Instance Store磁盘引导(这不是Amazon EBS)。 - John RotensteinImageId
是一个查询路径,创建了几个月。而且启动模板具有特定的旧ami-0...镜像ID,因此每个新的EC2实例都将使用该固定AMI。更新CloudFormation模板可能什么也做不了,因为模板及其参数没有更改。那么如何触发基于最新AMI查询结果创建EC2实例的过程呢? - MarnixKlooster ReinstateMonica使用过滤器和查询的组合可以在aws describe-images
命令中筛选输出并仅获取所需的属性,示例如下:
aws ec2 describe-images \
--owners 'amazon' \
--filters 'Name=description,Values=Amazon Linux AMI*' \
--query 'sort_by(Images, &CreationDate)[-1].[ImageId]' \
--output 'text'
命令说明:
您可以使用以下Python脚本执行相同操作:
import boto3
from operator import itemgetter
client = boto3.client('ec2')
response = client.describe_images(
Filters=[
{
'Name': 'description',
'Values': [
'Amazon Linux AMI*',
]
},
],
Owners=[
'amazon'
]
)
# Sort on Creation date Desc
image_details = sorted(response['Images'],key=itemgetter('CreationDate'),reverse=True)
ami_id = image_details[0]['ImageId']
更新:
您可以使用细粒度的过滤器来获得更快的响应。@Jack回答中提到的过滤器可用。
filters = [ {
'Name': 'name',
'Values': ['amzn-ami-hvm-*']
},{
'Name': 'description',
'Values': ['Amazon Linux AMI*']
},{
'Name': 'architecture',
'Values': ['x86_64']
},{
'Name': 'owner-alias',
'Values': ['amazon']
},{
'Name': 'owner-id',
'Values': ['137112412989']
},{
'Name': 'state',
'Values': ['available']
},{
'Name': 'root-device-type',
'Values': ['ebs']
},{
'Name': 'virtualization-type',
'Values': ['hvm']
},{
'Name': 'hypervisor',
'Values': ['xen']
},{
'Name': 'image-type',
'Values': ['machine']
} ]
# Use above filters
response = client.describe_images(
Filters=filters,
Owners=[
'amazon'
]
)
Vaulstein和John Rotenstein的回答帮助我理解了这个解决方案。谢谢!
在我的情况下,我们有很多不同所有者(大约有2-3个)发布的私有AMI,其中混合了以CentOS或AmazonLinux2为基础创建的自定义私有AMI。任务是找到适用于x86架构且基于AmazonLinux2的最新AMI。
请注意,我没有使用--owner,因为在我的情况下,AMI由不同的团队发布,并且具有不同的Owner ID。但是,如果您有单个所有者/团队发布这些内容,则建议包括此选项以过滤掉所有其他不需要的AMI。
以下是我们所使用的方法:
aws ec2 describe-images \
--query 'sort_by(Images, &CreationDate)[-1].Name' \
--region eu-west-1 \
--no-include-deprecated \
--executable-users self \
--output text \
--filters "Name=name,Values=here-ami-amzn2-*" \
"Name=architecture,Values=x86_64" \
"Name=image-type,Values=machine" \
"Name=state,Values=available" \
"Name=virtualization-type,Values=hvm" \
"Name=root-device-type,Values=ebs"
解释: 我们在做的是:
按照CreationDate对结果进行排序。我们从结果中获取最后一个/最新的项目名称。
--query 'sort_by(Images, &CreationDate)[-1].Name'
--region eu-west-1 \
--no-include-deprecated \
--executable-users self \
这是可选项。如果是文本,则返回AMI名称而不带双引号。
--output text \
过滤器用于缩小结果范围和排除不需要的结果。幸运的是,我们的组织已经以易于区分amzn2或CentOS的方式命名了AMI名称。我们想要的是Amazon Linux 2 AMI。
--filters "Name=name,Values=org-name-ami-amzn2-*" \
我们有ARM和x86_64版本的AMI,而我的团队的代码只在X86_64上进行了测试。因此,请选择它:
"Name=architecture,Values=x86_64" \
这个值可能会有所不同,但我认为对大多数人来说,这将是机器。
"Name=image-type,Values=machine" \
只选择可用状态的 AMI:
"Name=state,Values=available" \
"Name=virtualization-type,Values=hvm" \
"Name=root-device-type,Values=ebs"
来自Ref:
特别针对AWS CloudFormation:
该文章介绍了如何使用AWS Systems Manager Parameter Store查询最新的Amazon Linux AMI ID。在AWS CloudFormation中,可以使用该方法获取AMI ID并将其用于创建EC2实例。# Use public Systems Manager Parameter
Parameters:
LatestAmiId:
Type: 'AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>'
Default: '/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2'
Resources:
Instance:
Type: 'AWS::EC2::Instance'
Properties:
ImageId: !Ref LatestAmiId
使用 AWS CLI:
aws ssm get-parameters-by-path --path "/aws/service/ami-amazon-linux-latest" --region us-east-1
Powershell:
Get-SSMParametersByPath -Path "/aws/service/ami-amazon-linux-latest" -region us-east-1
我在这里看到了类似的脚本
https://github.com/bwood/latest-ami/blob/master/latest-ami.py
然而由于某些原因,当运行时,我会遇到错误。data "aws_ami" "base_ami" {
most_recent = true
owners = ["amazon"]
filter {
name = "name"
values = ["al2023-ami-2023.*-x86_64"]
}
filter {
name = "architecture"
values = ["x86_64"]
}
filter {
name = "virtualization-type"
values = ["hvm"]
}
}
*架构刚刚添加了额外的内容
resource "aws_instance" "ec2_instance" {
ami = data.aws_ami.base_ami.id
count = "1"
subnet_id = "<your subnet>"
instance_type = "<instance type>"
key_name = "<private_key>"
}