问题
I wanted to fetch the latest ami id for AWS Linux machine while creating an ec2 instance for an autoscaling architecture.
I was trying the aws
cli to get the images types, but it would print out a lot of information if I used the describe-images
command.
My requirement was to get only the image id, so that I could use it to create a launch configuration or launch an instance with the latest ami-id.
回答1:
A little-known recent feature is the ability to Query for the latest Amazon Linux AMI IDs using AWS Systems Manager Parameter Store | AWS Compute Blog.
The namespace is made up of two parts:
- Parameter Store Prefix (tree):
/aws/service/ami-amazon-linux-latest/
- AMI name alias: (example) amzn-ami-hvm-x86_64-gp2
These:
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
can be changed into:
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
Plus, it can be used in a CloudFormation template:
# Use public Systems Manager Parameter
Parameters :
LatestAmiId :
Type : 'AWS::SSM::Parameter::Value'
Default: ‘/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2’
Resources :
Instance :
Type : 'AWS::EC2::Instance'
Properties :
ImageId : !Ref LatestAmiId
回答2:
AWS CLI
A way to filter the output and get the only the required attributes is using a combination of filters,queries on the aws describe-images
command as below:
aws ec2 describe-images \
--owners 'amazon' \
--filters 'Name=description,Values=Amazon Linux AMI*' \
--query 'sort_by(Images, &CreationDate)[-1].[ImageId]' \
--output 'text'
Command Explanation:
- owners : For images by amazon, use 'amazon'. To query your own images, use 'self'
- filters : You can use a list of filters to filter out the instance that you are looking for. I prefer description because I found the name filter missing for some images. Values support wildcards. More on filters
- query : Query can be used to filter only what is required from the output. You can also sort on fields that would be present in the output. I have sorted on the images and the creation date to get the last created image and filtered the ImageId
- output : Output can be json or text based on the way you plan to consume it.
Using Python
You can do the same using the below python script:
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']
Update:
You can use fine-grain filters to get a quicker response. The filters mentioned in @Jack's answer work.
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'
]
)
回答3:
I saw a similar script here
https://github.com/bwood/latest-ami/blob/master/latest-ami.py
however for some reason this when run, i get errors
来源:https://stackoverflow.com/questions/51611411/get-latest-ami-id-for-aws-instance