如何使用 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"""])
AWS 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 等价物。
我正在尝试在 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"""])
AWS System Manager 在 /aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2
这是 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 等价物。