python - Cloudwatch API:如何使用多个 AWS 账户
问题描述
我正在尝试获取帐户的 ec2 实例的 cpu 利用率。我的代码如下。
def GetRegions():
return array of regions
def getEC2InstanceID(RegionName):
cloudwatch = boto3.client('cloudwatch', region_name=RegionName)
response = cloudwatch.get_metric_statistics(
.
.
.)
returns array of ec2instanceID
def EC2_Average_Utilization(InstanceID, RegionName):
returns avg cpuusage
def main():
regions= GetRegions()
for i in range(len(regions)):
print(regions[i])
instance_id = getEC2InstanceID(regions[i])
print(instance_id) # prints all the instances if there is any
if (type(instance_id)==list):
for j in range(len(instance_id)):
print(instance_id[j])
print ("For InstanceID "+ instance_id[j] + ":")
EC2_Average_Utilization(instance_id[j], regions[i])
此代码仅在一个帐户下对所有区域完美执行。如果我想为多个 AWS 账户做同样的事情,程序是什么?
nb 我已经看到通过在 .aws/credentials 中的每个帐户下创建多个配置文件来配置 .aws/config,但是当我在代码中生成区域时,我不想指定它们。
解决方案
您将需要使用 boto3Session
对象、“安全令牌服务 (STS)”以及assume_role
对每个帐户/区域组合的调用。效果与命名配置文件相同 - 您需要在每个账户中拥有一个具有足够权限的角色来调用 API 方法(EC2、CloudWatch 等)。此外,目标角色需要与原始帐户凭据建立信任关系。
sts = boto3.client('sts')
#this is called with your default credentials. Target roles need to trust this identity
creds = sts.assume_role(RoleArn='...', RoleSessionName='...')
# set up a session w/ the temporary credentials
session = boto3.Session(
aws_access_key_id=creds['Credentials']['AccessKeyId'],
aws_secret_access_key=creds['Credentials']['SecretAccessKey'],
aws_session_token=creds['Credentials']['SessionToken']
region_name='...')
# all subsequent clients/resources should be instantiated from the session object
cloudwatch = session.client('cloudwatch')
希望这可以帮助。
推荐阅读
- docker - 部署在 docker swarm 中用于 REST 通信的微服务的 URL
- swift - Swift 4 使用泛型作为返回值
- react-native - 如何在 react-native-copilot 的 Copilot 步骤中传递已经实现的组件
- firebase - TypeError:无法读取 null 的属性“uid”
- jquery - 如何为数据表搜索栏创建特定的 html 结构?
- regex - CMake 正则表达式匹配
- java - 如何将 JSON 对象转换为 DBObject?
- r - 在闪亮的应用程序中传递数据和输入
- spring - Thymeleaf 即时从数据库加载模板
- elasticsearch - 为 2 个映射创建范围的弹性搜索查询