如何以编程方式列出所有aws资源和标记

时间:2015-06-05 20:06:46

标签: amazon-web-services

我想审核AWS中标记方案的合规性,因此我想以编程方式从帐户中检索所有资产并检查其标记。

有没有合理的方法来实现这一点,而无需遍历boto或Java API中的碎片aws客户端?如果我仅计算boto3个客户端,那么其中大约有40个,其中大多数只有略微不同的语义。如果我确实编写了使用所有这些代码的代码,那么每当AWS角色化新服务时,我都必须添加另一个客户端。

我已经看过了什么:
boto3 - 40每个服务客户端迭代一些使得它不可行 AWS Java客户端 - 如上所述 AWS cli - 与上述相同
Compliance Monkey(Netflix) - 仅查看Auto Scaling Groups
AWS Config - 您必须按标记查询资源,这些标记将无法跟踪未标记的内容。

我很快就看到了什么:
Netflix Edda

我现在做了什么:
正是我不想要的,遍历boto3 cloudformation,ec2,s3和autoscaling clients。这比没有好,但这种方法存在明显差距。

3 个答案:

答案 0 :(得分:5)

一直在争取让上面共享的脚本@whorka工作,但我认为必须更新skew扫描资源的方式。无论如何,下面的脚本似乎可以做到这一点!

    #!/usr/bin/env python
    import skew
    from skew.arn import ARN
    arn = ARN()
    services=arn.service.choices()
    services.sort()
    #services=["route53", "iam"]
    print('Enumerating all resources in the following services: ' + ' '.join(services) + '\n')
    for service in services:
      #skipping global services because the API endpoint fails due to it being a global service. Bug that needs fixing.
      if service == "iam" or service == "route53":
        print(service)  
        print('Skipping global services')
        #uri = 'arn:aws:' + service + '::*:*/*'
        #arn = skew.scan(uri)
        #for i in arn:
        #  print(i.arn)
      else:
        print('******' + service + '******')
        uri = 'arn:aws:' + service + ':*:*:*/*'
        arn = skew.scan(uri)
        for i in arn:
          print(i.arn)

Global Services存在一个错误,例如IAM和Route53,因为API端点不包含导致barf倾斜的区域

答案 1 :(得分:2)

不幸的是,您想要的解决方案不存在。

请记住,AWS不支持标记其所有服务;所以你想要做的事情甚至可能是不可能的(如果你想要的是查询所有服务和利用常见标签的一些通用方法)。

存在诸如RightScale之类的服务,或者如您所知,Boto,它在AWS之上提供抽象。但是,与AWS CLI相比,这些第三方抽象在支持新服务之前总是会有滞后时间。

如果您真正想要的是查询所有服务的一般方法,并处理当前不支持标记的服务,建议您执行以下一项或全部操作:

  1. 在当前支持的所有服务中利用标记 标记:ec2,rds
  2. 如果服务不支持标记, 利用资源的名称来添加“标签”的等价物 例如<component>-<environment>-<resource type>
  3. 编写一个小程序,为每个服务包装/调用所有indivdual aws clis。
  4. 在程序中,转换每个的标签和资源名称 将aws cli命令转换为规范格式,存储在数据存储区中,例如dynamo,berkleydb
  5. 写一个小的 然后对该数据存储区中的数据进行“合规性检查”的程序
  6. 当新服务联机时,请在步骤3中标记您的资源并扩展您的程序以支持新服务。请注意,最近的大多数新AWS服务都经历了一个公告期,然后是预览期,持续了6个月或更长时间,例如弹性文件系统等通常,您有时间需要扩展您的程序以支持新服务。

    另外,请记住您提到的“40项服务”,实际上只有一小部分可以“启动或标记”。大多数这些服务并非真正的“资源”,例如AWS Config,CloudWatch,CloudTrail,SES,SNS,数据管道。因此,可能感觉需要执行的许多API可能最终为10或更少。

答案 2 :(得分:0)

这是一个用于查询AWS资源的整洁小库,名为&#34; skew&#34; ...

http://awsadvent.tumblr.com/post/105218697613/aws-advent-2014-finding-aws-resources-across

它并未针对所有服务实施,但它的工作时间很短。

import skew
from skew.arn import ARN
arn = ARN()
services=arn.service.choices()
services.sort()
print('Enumerating all resources in the following services: ' + ' '.join(services) + '\n')
for service in services:
  arn.service.pattern = service
  for resource in arn:
    print(resource)

Enumerating all resources in the following services: autoscaling cloudwatch dynamodb ec2 elb iam kinesis rds redshift route53 s3 sqs

arn:aws:cloudwatch:us-east-1:000012345678:alarm/arn:aws:cloudwatch:us-east-1:000012345678:alarm:xxxxxxxx
arn:aws:dynamodb:us-east-1:000012345678:table/yyyyyyyy
arn:aws:ec2:us-east-1:000012345678:subnet/subnet-abcdabcd
arn:aws:ec2:us-east-1:000012345678:instance/i-dcbadcba
arn:aws:s3:ap-southeast-1:000012345678:bucket/zzzzzzzz