大佬教程收集整理的这篇文章主要介绍了如何使用 python boto3 从多个 AWS 账户生成 EC2 清单,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在尝试从 AWS 账户生成清单并将其写入单个 CSV 文件。
我有 5 个帐户,例如 Dev、Test、DevOps、Prepared 和 Prod。通常我使用下面的 bash 脚本生成,这又需要一些手动任务;
#!/bin/bash
reg="ap-south-1"
input="profile.txt" ##This file contain all the profile name which configured on ~/.aws/credentials file
while IFS= read -r line
do
aws ec2 describe-instances --profile ${linE} --region ${reg} --query "Reservations[*].Instances[*].[Tags[?Key=='name']|[0].Value,InstancEID,InstanCEType,PrivateIpaddress,State.name,Platform,Placement.AvailabilityZone]" --output text >> ec2_inventory.csv
done < "$input"
所以,这里我写了一个python boto3脚本来生成ec2库存;
它在单个 AWS 配置文件中按预期工作。下面的脚本;
import boto3
session = boto3.Session(profile_name='dev')
ec2 = session.clIEnt('ec2',region_name='ap-south-1')
response = ec2.describe_instances()
import datetiR_335_11845@e
import csv
time = datetiR_335_11845@e.datetiR_335_11845@e.Now().strftime ('%Y-%m-%d-%H-%M-%s')
filename_describe_instances = ('ec2_inventory_me-south-1_' + time + '.csv')
fIEldnames = ['Instance_name','ImagEID','InstancEID','InstanCEType','Availability_Zone','Platform','PrivateIpaddress','PublicIpaddress','State','subnetID','VpcID','Environment','AccountID']
with open(filename_describe_instances,'w',newline='') as csvfile:
writer = csv.writer(csvfile,dialect='excel')
writer.writerow(fIEldnames)
for Reserv in response['Reservations']:
for Insta in Reserv['Instances']:
instance_imagEID = Insta.get('ImagEID','NulL')
instance_InstancEID = Insta.get('InstancEID','NulL')
instance_InstanCEType = Insta.get('InstanCEType','NulL')
instance_Availability_Zone = Insta['Placement'].get('AvailabilityZone','NulL')
instance_Platform = Insta.get('Platform','linux')
instance_Private_IP = Insta.get('PrivateIpaddress','NulL')
instance_Public_IP = Insta.get('PublicIpaddress','NulL')
instance_State = Insta['State'].get('name','NulL')
instance_subnet = Insta.get('subnetID','NulL')
instance_VPCID = Insta.get('VpcID','NulL')
instance_ownerID = Reserv.get('ownerID','NulL')
Tags_List = []
for n in Insta.get('Tags','NulL'):
if n.get('Key','NulL') == 'name':
instance_name = n.get('Value','NulL')
if n.get('Key','NulL') == 'Environment':
instance_Environment = n.get('Value','NulL')
raw = [instance_name,instance_imagEID,instance_InstancEID,instance_InstanCEType,instance_Availability_Zone,instance_Platform,instance_Private_IP,instance_Public_IP,instance_State,instance_subnet,instance_VPCID,instance_Environment,instance_ownerID]
writer.writerow(raw)
for o in raw:
o = 'NulL'
raw = []
csvfile.close()
那么,有人可以帮助我使用此脚本从多个 AWS 账户生成库存并将其写入单个 CSV 文件吗?
编辑 - 修改一些基本细节。
如果您已经配置了配置文件,最简单的事情就是循环它们,并使用 boto3 Session
对象在循环中获取您的实例详细信息。
# set up your .csv writer,etc outside the loop
# iterate over your profiles
profiles = ['Dev','Test','DevOps','Prepared','Prod']
for name in profiles:
session = boto3.Session(profile_name=Name)
ec2 = session.client('ec2')
response = ec2.describe_instances()
#format your row and write to the .csv
您可以对配置文件列表进行硬编码,或查看 argparse
以从命令行获取它们。
配置文件方法很好,我广泛使用这种方法来编写跨帐户的报告和审计工具。但是,值得深入了解交叉帐户设置应该是什么样子。您有两个基本选项:
我@H_801_45@强烈推荐后者作为更安全和灵活的替代方案(除非您的组织已经在使用某种形式的 SSO,这在概念上是相似的,但超出了本答案的范围)。使用角色更安全,因为您只需提供/管理单个凭据,并设置自己从中央身份验证存储库管理所有帐户。
为此,SDK 支持通过引用 @H_801_45@other 配置文件隐式调用 sts:AssumeRole
的配置文件。例如:
在~/.aws/credentials
中:
[management]
region=us-West-2
aws_access_key_id=...
aws_secret_access_key=...
在~/.aws/config
中:
[profile foo-account]
source_profile=management
role_arn=arn:aws:iam::[foo-account-id]:role/Inventory
(注意两个文件之间节头名称的区别 - 这是故意的)
鉴于上述情况,如果您运行 aws --profile foo-account ec2 describe-instances
,CLI 将使用配置文件 @H_644_9@management 下的密钥/秘密来调用 sts:AssumeRole
,以 Inventory
角色为目标。如果设置 AWS_PROFILE
环境变量,则可以省略 --profile
标志。使用 profile_name
的参数 Session
该角色在您要与之合作的每个帐户中定义(具有相应的配置文件),具有读取所需 EC2 数据的足够权限,@H_801_45@并且必须具有 AssumeRolePolicyDocument
允许您的 IAM 用户对 Inventory 角色调用 sts:AssumeRole
。
{
"Version": "2012-10-17","Statement": [
{
"Effect": "Allow","Principal": {
"AWS": "arn:aws:iam::[foo-account-id]:user/[your-user]"
},"Action": "sts:AssumeRole"
}
]
}
IAM 用户同样需要一个允许其调用 sts:AssumeRole
的策略:
{
"Version": "2012-10-17","Action": "sts:AssumeRole","resource": "*"
}
]
}
您可以使用角色 ARN 列表替换 "*"
资源引用。 AssumeRolePolicyDocument
让指定的主体承担角色;用户策略允许用户针对指定的资源调用 AssumeRole。这似乎有点违反直觉,但请记住,授权需要回答两个问题:用户是否可以这样做,资源是否允许这样做。
最后,随着您变得更高级,一旦您进行了基本的帐户/角色设置,您实际上可以省略配置文件,而只需使用帐户列表直接调用 sts:AssumeRole
。
accounts = ['123...789','234...890',]
sts = boto3.client('sts') #assumes you have a default profile set
for id in accounts:
role_arn = f'arn:aws:iam::{iD}:role/Inventory'
creds = sts.assume_role(role_arn=role_arn,role_session_name='some-name')
session = boto3.Session(aws_access_key_id=creds['AccessKeyId'],...)
ec2 = session.client('ec2')
如果你需要做很多跨账户的工作,花时间思考和配置中央身份验证绝对是值得的。副作用是,一旦您拥有跨账户@H_801_45@角色,您可以通过在管理账户的 Lambda 函数中运行它来自动执行此操作,并对该执行角色执行相同的权限设置(编写.csv 到 S3)。
,有一个云管理平台可以做到这一点。它使用户能够从单个仪表板管理多个 AWS 账户,并提供 AWS 库存管理和成本优化。免费: https://cloudplexo.com。
,以下是我开发的自定义解决方案,它将以 csv 格式和 HTML 格式为您提供跨区域、跨 aws 帐户的 ec2 实例数据。 https://gandharkhaladkar.medium.com/get-the-basic-details-of-all-ec2-instances-across-aws-accounts-across-all-regions-a4a0a7080b68
以上是大佬教程为你收集整理的如何使用 python boto3 从多个 AWS 账户生成 EC2 清单全部内容,希望文章能够帮你解决如何使用 python boto3 从多个 AWS 账户生成 EC2 清单所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。