自動スケーリングアーキテクチャのec2インスタンスを作成しながら、AWSLinuxマシンの最新のAMIIDを取得したかったのです。
aws
cliを使用して画像タイプを取得しようとしましたが、describe-images
コマンドを使用すると、多くの情報が出力されます。
私の要件は、イメージIDのみを取得することでした。これを使用して、起動構成を作成したり、最新のAMI-idでインスタンスを起動したりできます。
あまり知られていない最近の機能は、 AWS SystemsManagerパラメータストア| AWS ComputeBlogを使用して最新のAmazonLinux AMI IDをクエリする 機能です。
名前空間は2つの部分で構成されています。
/aws/service/AMI-Amazon-linux-latest/
これら:
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
さらに、CloudFormationテンプレートで使用できます:
# 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
出力をフィルタリングして必要な属性のみを取得する方法は、以下のように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'
]
)
ここで同様のスクリプトを見ました
https://github.com/bwood/latest-AMI/blob/master/latest-AMI.py
しかし、何らかの理由でこれを実行すると、エラーが発生します