程序问答   发布时间:2022-06-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了如何使用 python boto3 从多个 AWS 账户生成 EC2 清单大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决如何使用 python boto3 从多个 AWS 账户生成 EC2 清单?

开发过程中遇到如何使用 python boto3 从多个 AWS 账户生成 EC2 清单的问题如何解决?下面主要结合日常开发的经验,给出你关于如何使用 python boto3 从多个 AWS 账户生成 EC2 清单的解决方法建议,希望对你解决如何使用 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 以从命令行获取它们。

配置文件方法很好,我广泛使用这种方法来编写跨帐户的报告和审计工具。但是,值得深入了解交叉帐户设置应该是什么样子。您有两个基本选项:

  • 通过每个账户中的 IAM 用户进行跨账户访问 - 每个账户都有一个拥有自己的密钥和秘密的唯一用户
  • 通过每个账户中的 IAM 角色进行跨账户访问 - 您在@H_801_45@一个账户(例如,一个中央“管理”账户)中创建一个唯一用户,并在目标账户中创建执行以下操作的角色实际工作。

我@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,请注明来意。