web-dev-qa-db-ja.com

AWSインスタンスの最新のAMIIDを取得します

自動スケーリングアーキテクチャのec2インスタンスを作成しながら、AWSLinuxマシンの最新のAMIIDを取得したかったのです。

aws cliを使用して画像タイプを取得しようとしましたが、describe-imagesコマンドを使用すると、多くの情報が出力されます。

私の要件は、イメージIDのみを取得することでした。これを使用して、起動構成を作成したり、最新のAMI-idでインスタンスを起動したりできます。

4
Vaulstein

あまり知られていない最近の機能は、 AWS SystemsManagerパラメータストア| AWS ComputeBlogを使用して最新のAmazonLinux AMI IDをクエリする 機能です。

名前空間は2つの部分で構成されています。

  • パラメータストアプレフィックス(ツリー):/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

さらに、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
13
John Rotenstein

AWSCLI

出力をフィルタリングして必要な属性のみを取得する方法は、以下のように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'

コマンドの説明

  • 所有者:Amazonの画像の場合は、「Amazon」を使用します。自分の画像をクエリするには、「self」を使用します
  • フィルタ:フィルタのリストを使用して、探しているインスタンスを除外できます。一部の画像でnameフィルターが欠落していることがわかったため、descriptionを使用します。 はワイルドカードをサポートします。 フィルターの詳細
  • query:クエリを使用して、出力から必要なものだけをフィルタリングできます。出力に表示されるフィールドで並べ替えることもできます。最後に作成された画像を取得するために画像と作成日を並べ替え、ImageIdをフィルタリングしました
  • 出力:出力は、消費方法に基づいてjsonまたはtextになります。

Pythonの使用

以下の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'
  ]
)
7
Vaulstein

ここで同様のスクリプトを見ました

https://github.com/bwood/latest-AMI/blob/master/latest-AMI.py

しかし、何らかの理由でこれを実行すると、エラーが発生します

0
Jack