跳转到主要内容

为您的所有AWS资源提供一个平坦的地址空间。

项目描述

skew

Skew 是一个用于识别和枚举云资源的包。名称与SKU(库存单位)同音。Skew 允许您定义不同的SKU 方案,这是SKU的特定编码。然后,Skew 允许您使用此方案模式及其基于方案模式的正则表达式来识别和枚举资源或资源集。

目前,唯一可用的 方案ARN 方案。ARN 方案使用 Amazon Resource Names (ARNs) 的基本结构为每个AWS资源分配一个唯一的标识符。

一个示例 ARN 模式会是

arn:aws:ec2:us-west-2:123456789012:instance/i-12345678

此模式识别在 us-west-2 区域运行的具体 EC2 实例,其账户 ID 为 123456789012。账户 ID 是特定 AWS 账户的 12 位唯一标识符,如 此处 所述。为了让 skew 找到您的账户号码,您需要创建一个 skew YAML 配置文件。默认情况下,skew 将在 ~/.skew 中查找您的配置文件,但您可以使用 SKEW_CONFIG 环境变量告诉 skew 在其他位置查找您的配置文件。skew 配置文件的基本格式是

---
  accounts:
    "123456789012":
      profile: dev
    "234567890123":
      profile: prod

accounts 部分中,您创建以您的12位账户ID(作为字符串)命名的密钥。在其中,您必须有一个名为 profile 的条目,该条目列出此账户在AWS凭证文件中映射到的配置文件名称。

倾斜的主要目的是识别跨服务、区域和账户的资源或资源集,并快速、轻松地返回与这些资源关联的数据。例如,如果您想返回上面示例ARN关联的数据

from skew import scan

arn = scan('arn:aws:ec2:us-west-2:123456789012:instance/i-12345678')
for resource in arn:
    print(resource.data)

scan 调用返回一个实现了 迭代器模式 的ARN对象,并为每个与提供的ARN模式匹配的AWS资源返回一个 Resource 对象。该 Resource 对象包含在 data 属性下的所有与AWS资源关联的数据。

ARN的任何元素都可以用正则表达式替换。最简单的正则表达式是 *,它表示所有可用的选择。所以,例如

arn = scan('arn:aws:ec2:us-east-1:*:instance/*')

将返回所有在所有账户中定义的配置文件中找到的 us-east-1 区域的所有EC2实例的迭代器。

要查找账户ID为234567890123的所有US区域中的所有DynamoDB表,您会使用

arn = scan('arn:aws:dynamodb:us-.*:234567890123:table/*')

CloudWatch度量

除了使特定AWS资源的元数据可供您使用外,skew 还试图使访问给定资源的可用CloudWatch度量变得容易。

例如,假设您已经对上面的原始ARN进行了 scan,并将与此实例关联的资源作为变量 instance 可用。您可以执行以下操作

>>> instance.metric_names
['CPUUtilization',
 'NetworkOut',
 'StatusCheckFailed',
 'StatusCheckFailed_System',
 'NetworkIn',
 'DiskWriteOps',
 'DiskReadBytes',
 'DiskReadOps',
 'StatusCheckFailed_Instance',
 'DiskWriteBytes']
>>>

metric_names 属性返回此资源的可用CloudWatch度量列表。要检索这些度量中的一个的度量数据

>>> instance.get_metric_data('CPUUtilization')
[{'Average': 0.134, 'Timestamp': '2014-09-29T14:04:00Z', 'Unit': 'Percent'},
 {'Average': 0.066, 'Timestamp': '2014-09-29T13:54:00Z', 'Unit': 'Percent'},
 {'Average': 0.066, 'Timestamp': '2014-09-29T14:09:00Z', 'Unit': 'Percent'},
 {'Average': 0.134, 'Timestamp': '2014-09-29T13:34:00Z', 'Unit': 'Percent'},
 {'Average': 0.066, 'Timestamp': '2014-09-29T14:19:00Z', 'Unit': 'Percent'},
 {'Average': 0.068, 'Timestamp': '2014-09-29T13:44:00Z', 'Unit': 'Percent'},
 {'Average': 0.134, 'Timestamp': '2014-09-29T14:14:00Z', 'Unit': 'Percent'},
 {'Average': 0.066, 'Timestamp': '2014-09-29T13:29:00Z', 'Unit': 'Percent'},
 {'Average': 0.132, 'Timestamp': '2014-09-29T13:59:00Z', 'Unit': 'Percent'},
 {'Average': 0.134, 'Timestamp': '2014-09-29T13:49:00Z', 'Unit': 'Percent'},
 {'Average': 0.134, 'Timestamp': '2014-09-29T13:39:00Z', 'Unit': 'Percent'}]
>>>

您还可以自定义返回的数据,而不是使用默认设置

>>> instance.get_metric_data('CPUUtilization', hours=8, statistics=['Average', 'Minimum', 'Maximum'])
[{'Average': 0.132,
  'Maximum': 0.33,
  'Minimum': 0.0,
  'Timestamp': '2014-09-29T10:54:00Z',
  'Unit': 'Percent'},
 {'Average': 0.134,
  'Maximum': 0.34,
  'Minimum': 0.0,
  'Timestamp': '2014-09-29T14:04:00Z',
  'Unit': 'Percent'},
  ...,
 {'Average': 0.066,
  'Maximum': 0.33,
  'Minimum': 0.0,
  'Timestamp': '2014-09-29T08:34:00Z',
  'Unit': 'Percent'},
 {'Average': 0.134,
  'Maximum': 0.34,
  'Minimum': 0.0,
  'Timestamp': '2014-09-29T08:04:00Z',
  'Unit': 'Percent'}]
>>>

数据过滤

检索到的每个资源都是一个Python字典。其中一些(例如EC2实例)可能相当大且复杂。Skew允许您通过将 jmespath 查询应用于结果数据来过滤返回的数据。如果您不熟悉jmespath,请查看它。它是一种非常强大的JSON数据查询语言,在Python以及Ruby、PHP和JavaScript等其他语言中都有完整支持。它也是 AWSCLI 中使用的查询语言,因此如果您熟悉那里的 --query 选项,您可以使用skew中的相同功能。

要指定应用于扫描结果的查询,只需将查询追加到ARN末尾,并用 |(管道)字符分隔。例如

arn:aws:ec2:us-west-2:123456789012:instance/i-12345678|InstanceType

将检索此特定EC2实例的数据,然后通过(非常简单)的jmespath查询过滤返回的数据,该查询检索数据中 InstanceType 属性的值。过滤后的数据作为Resource对象的 filtered_data 属性可用。完整的、未过滤的数据仍然作为 data 属性可用。

多线程使用

默认情况下,Skew是单线程的,就像大多数Python库一样。为了加快匹配资源的枚举速度,您可以使用多个线程

import skew

class Worker(Thread):
   def __init__(self, arn):
       Thread.__init__(self)
       self.arn = arn
       self.name = arn

   def run(self):
       for i in skew.scan(self.arn):
           # now do something with the stuff

arn = skew.ARN()

for service in arn.service.choices():
    uri = 'arn:aws:' + service + ':*:*:*/*'
    worker = Worker(uri);
    worker.start()

(感谢@alFReD-NSH提供的代码片段)

更多示例

查找未附加的卷

审计安全组

查找未标记的实例

项目详情


下载文件

下载您平台对应的文件。如果您不确定选择哪个,请了解更多关于 安装包 的信息。

源分发

skew-0.19.0.tar.gz (28.7 kB 查看哈希值)

上传时间

构建分发

skew-0.19.0-py3-none-any.whl (45.7 kB 查看哈希值)

上传时间 Python 3

由以下支持