我想审核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。这比没有好,但这种方法存在明显差距。
答案 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相比,这些第三方抽象在支持新服务之前总是会有滞后时间。
如果您真正想要的是查询所有服务的一般方法,并处理当前不支持标记的服务,建议您执行以下一项或全部操作:
<component>-<environment>-<resource type>
当新服务联机时,请在步骤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