Я использую модуль Python boto3 и «щелкните» библиотеку, чтобы создать интерфейс командной строки, который управляет экземплярами EC2.
Code: < /p>
Код: Выделить всё
@click.group()
@cli.group('instances')
def instances():
pass
@instances.command('list')
@click.option('--project', default=None,help='List instances by project tag, e.g. -project =
')
def list_instances(project):
'List EC2 instances'
instances = filter_project_instances(project)
for i in instances:
print(', '.join((
i.id,
i.instance_type,
)))
return
@cli.group('volumes')
#Details of this 'volumes' command are omitted for simplification
Such a command line:
shotty.py instances list --project Valkyrie
can list instances that are tagged with the name 'Valkyrie' < /p>
Теперь мне нужно добавить опцию в эту командную строку, чтобы указать профиль AWS, который я хочу использовать для входа. Список
Первоначально я резко кодировал имя профиля и использовал session и ec2 как глобальные переменные, которые могут использовать любые другие функции.
Код: Выделить всё
import boto3
import botocore
import click
session = boto3.Session(profile_name='Dan')
ec2 = session.resource('ec2')
< /code>
Несмотря на реализацию вышеуказанного требования, на основе документов «щелкнуть», мне пришлось сделать следующее, чтобы добавить такую опцию «-профиля»: < /p>
@click.group()
@click.option('--profile', default=None,help='Select the AWS profile')
def cli(profile):
session = boto3.Session(profile_name=profile)
ec2 = session.resource('ec2')
Код: Выделить всё
if __name__ == '__main__':
cli()
< /code>
Мой единственный подход, о котором я мог придумать, было создание отдельной функции < /p>
def session(profile):
session = boto3.Session(profile_name=profile)
ec2 = session.resource('ec2')
return ec2
Код: Выделить всё
def filter_project_instances(project, profile):
'Filter EC2 instances'
ec2 = session(profile)
instances = ec2.instances.all()
return instances
Подробнее здесь: https://stackoverflow.com/questions/631 ... -functions