我有一个python脚本试图获取我拥有的每个AWS账户中的每个EC2
实例ID。我正在使用自定义库(nwmaws
),它将为我列出每个帐户ID。我正在使用一个生成sts
令牌的函数,并提取每个帐户ID并插入id以动态构建ARN
,这样我就可以在每个帐户中担任角色并获取实例ID。我能够生成sts
令牌,但我没有在响应中获取实例ID。只需一个HTTP 200
状态代码。以下是我的代码和回复。
CODE:
import boto3
import nwmaws
client = boto3.client('ec2')
accounts = nwmaws.Accounts().list()
def get_sts_token(**kwargs):
role_arn = kwargs['RoleArn']
region_name = kwargs['RegionName']
sts = boto3.client(
'sts',
region_name=region_name,
)
token = sts.assume_role(
RoleArn=role_arn,
RoleSessionName='GetInstances',
DurationSeconds=900,
)
return token["Credentials"]
def get_all_instances():
for i in accounts:
account_list = i.account_id
role_arn = "arn:aws:iam::{}:role/ADFS-
GlobalAdmins".format(account_list)
get_sts_token(RoleArn=role_arn, RegionName="us-east-1")
response = client.describe_instances()
print(response)
get_all_instances()
RESPONSE:
{'Reservations': [], 'ResponseMetadata': {'RequestId': '5c1e8326-5a36-
4866-9cfd-bd83bff62d05', 'HTTPStatusCode': 200, 'HTTPHeaders':
{'content-type': 'text/xml;charset=UTF-8', 'transfer-encoding':
'chunked', 'vary': 'Accept-Encoding', 'date': 'Sun, 13 May 2018
21:23:25 GMT', 'server': 'AmazonEC2'}, 'RetryAttempts': 0}}
{'Reservations': [], 'ResponseMetadata': {'RequestId': '1e165d98-0b5c-
4172-8917-bf688afbad7c', 'HTTPStatusCode': 200, 'HTTPHeaders':
{'content-type': 'text/xml;charset=UTF-8', 'content-length': '230',
'date': 'Sun, 13 May 2018 21:23:25 GMT', 'server': 'AmazonEC2'},
'RetryAttempts': 0}}
{'Reservations': [], 'ResponseMetadata': {'RequestId': 'e18526d5-c7e9-
465f-a1fd-87e1d652e95c', 'HTTPStatusCode': 200, 'HTTPHeaders':
{'content-type': 'text/xml;charset=UTF-8', 'transfer-encoding':
'chunked', 'vary': 'Accept-Encoding', 'date': 'Sun, 13 May 2018
21:23:25 GMT', 'server': 'AmazonEC2'}, 'RetryAttempts': 0}} etc. etc...
DESIRED RESPONSE:
i-xxxxxx
i-xxxxxx
i-xxxxxx
i-xxxxxx
i-xxxxxx
etc etc
答案 0 :(得分:1)
正如@Michael - sqlbot所提到的,您没有使用assume_role API调用生成的令牌。使用获取的凭据创建EC2客户端对象。使用以下行替换代码中的get_sts_token(RoleArn=role_arn, RegionName="us-east-1")
行以检索临时凭证并使用它来列出实例:
credentials = get_sts_token(RoleArn=role_arn, RegionName="us-east-1")
access_key = credentials['AccessKeyId']
secret_key = credentials['SecretAccessKey']
token = credentials['SessionToken']
session = boto3.session.Session(
aws_access_key_id=access_key,
aws_secret_access_key=secret_key,
aws_session_token=token
)
client = session.client('ec2', region_name='us-east-1')
response = client.describe_instances()
print(response)
这将返回us-east-1中的所有实例。如果您需要所有区域中的实例列表,请调用describe_regions API并遍历列表。
参考文献:
答案 1 :(得分:0)
print(response)
的输出是正确的。
但是你可以试试这个来获得你想要的输出:
client = boto3.client('ec2')
instances = ec2.instance.filter(Filters=[{'Name': 'instance-state-name',
'Values' ": ['running']}])
for instance in instances:
print(instance.id, instance.instance_type)