如何使用 python 和 boto3 在 AWS 中获取免费层 AMI

How to get free-tier AMI in AWS using python with boto3

我正在尝试在 python 中构建一个函数,在特定区域创建一个新的 ec2 实例。 为了使函数正常工作,我需要指定这个新实例的 AMI。 问题是同一个 AMI(例如 Amazon Linux)在不同区域有不同的 ID,我不能在另一个区域实例中使用一个区域的图像。

我不明白如何在这个特定区域获得这个 AMI id

def create_instance(region):
        ec2 = boto3.resource('ec2', region)
        instances = ec2.create_instances(InstanceType='t2.micro',
                                         MinCount=1, MaxCount=1,
                                         ImageId='AMI-id') # What do I put here?

目前,除了 AMI 是 Linux 和免费层之外,AMI 是什么并不重要,因此搜索特定的已知免费层 Linux AMI 可能会起作用。

我知道您可以使用 describe_images() 函数获取所有 AMI,但我如何只过滤那些 Linux(可能是特定版本)和 free-等级

boto3.client('ec2').describe_images(Filters["""What do I write here to get only linux free-tier AMI"""])

A​​WS System Manager 在 /aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2

维护 AWS Linux 2 个 AMI 的精选列表

这是 CLI 调用:

$ aws ssm get-parameters --names /aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2 --region us-east-1

{
    "Parameters": [
        {
            "Name": "/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2",
            "Type": "String",
            "Value": "ami-0323c3dd2da7fb37d",
            "Version": 27,
            "LastModifiedDate": 1586395100.713,
            "ARN": "arn:aws:ssm:us-east-1::parameter/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2"
        }
    ],
    "InvalidParameters": []
}

您应该可以在 Python 和 SSM BOTO3 API 中执行相同的操作。

肖恩,试试这个...

ec2_client= session.client('ec2', region_name=region_name)
print(f'***region_name: {region_name}')
response= ec2_client.describe_instance_types(  
#InstanceTypes=['t2.micro']
Filters=[
    {
        'Name': 'free-tier-eligible',
        'Values': ['true']
        }
    ]
) 
#pprint(response['InstanceTypes'][0]['InstanceType'])

instance_type= response['InstanceTypes'][0]['InstanceType']
response= ec2_client.describe_images(
   Filters=[{'Name': 'name', 'Values': [instance_type]},]   
)
#pprint(response)

for image in response['Images']:
     print(image['ImageId'])

 Result:**************************************
 ***region_name: ap-south-1
 ami-0e84c461
 ami-1154187e
 ami-2f0e7540
 ami-4d8aca22
 ami-50aeed3f
 ami-77a4e718
 ami-cce794a3

希望对您有所帮助...
r0ck

这是我想出的脚本:

import boto3
from typing import Optional, List


def get_ami_ids(names: Optional[List[str]]=None) -> List[str]:
    if names is None:
        names = [
            '/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2'
        ]
    ssm = boto3.client('ssm')
    response = ssm.get_parameters(Names=names)
    metadata: dict = response['ResponseMetadata']
    if metadata['HTTPStatusCode'] == 200:
        params: List[dict] = response['Parameters']
        amis: List[str] = [p.get('Value') for p in params]

    return amis

print(get_ami_ids())

这应该会为您提供 AMI id 列表(如果响应中有的话)。但是,在 anton 提供的答案中,我看不到在哪里指定 AWS 区域,例如 AWS CLI 等价物。