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

Amazon web services 如何以编程方式列出所有aws资源和标记,amazon-web-services,Amazon Web Services,我希望审核AWS中标记方案的符合性,因此我希望以编程方式从帐户检索所有资产并检查它们的标记 有没有一种合理的方法来实现这一点,而不必在boto或JavaAPI中迭代碎片化的aws客户机?如果我单独计算客户机,大约有40个,其中大多数的语义稍有不同。如果我真的编写了使用所有这些功能的代码,那么每次AWS角色推出新服务时,我都必须添加另一个客户端 我已经看过的内容: Bot3-40一些每个服务的客户端进行迭代,这使得它不可行。 AWS Java客户端-如上所述 AWS cli-同上 Complian

我希望审核AWS中标记方案的符合性,因此我希望以编程方式从帐户检索所有资产并检查它们的标记

有没有一种合理的方法来实现这一点,而不必在boto或JavaAPI中迭代碎片化的aws客户机?如果我单独计算客户机,大约有40个,其中大多数的语义稍有不同。如果我真的编写了使用所有这些功能的代码,那么每次AWS角色推出新服务时,我都必须添加另一个客户端

我已经看过的内容:
Bot3-40一些每个服务的客户端进行迭代,这使得它不可行。
AWS Java客户端-如上所述
AWS cli-同上
Compliance Monkey(Netflix)-只查看自动缩放组
AWS配置-您必须通过标记查询资源,这将无法跟踪未标记的资源

我即将看到的内容:
Netflix Edda

我现在所做的:

这正是我不想要的,通过boto3 cloudformation、ec2、s3和自动缩放客户端进行迭代。这总比什么都不做要好,但这种方法显然存在差距。

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

请记住,AWS不支持对其所有服务进行标记;因此,您想要做的甚至可能不可能(如果您想要的是某种查询所有服务并利用公共标记的通用方法)

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

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

  • 在当前支持的所有服务中利用标记 标签:ec2,rds
  • 如果服务不支持标记, 利用资源的名称添加等效的“标记” e、 g.
    --
  • 编写一个小程序,包装/调用每个服务的所有独立aws CLI
  • 在程序中,转换每个资源的标记和资源名称 将aws cli命令转换为规范格式,存储在数据存储中,例如dynamo、berkleydb
  • 写一篇小文章 然后根据此数据存储中的数据执行“符合性检查”的程序
  • 当新服务上线时,在步骤3中标记您的资源并扩展您的程序以支持新服务。请注意,最近大多数新的AWS服务都经历了一个发布期,然后是持续6个月或更长时间的预览期,例如弹性文件系统等。因此,一般来说,在需要扩展程序以支持新服务之前,您将有时间


    另外,请记住,在您提到的“40个服务”中,只有一小部分可以实际“启动或标记”。这些服务大多不是真正的“资源”,例如AWS配置、CloudWatch、CloudTrail、SES、SNS、数据管道。因此,很多API都需要执行,但最终可能只有10个或更少

    这里有一个整洁的小库,用于查询AWS资源,名为“”

    它并不是针对所有的服务都实现的,但它很快就能实现

    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
    

    一直在努力让上面共享的脚本@whorka正常工作,但我认为一定是更新了扫描资源的方式。不管怎么说,下面的脚本似乎可以做到这一点

        #!/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)
    

    全球服务(如IAM和Route53)存在一个缺陷,因为API端点不包含导致扭曲的区域。

    FYI CloudFormer工具为资源发出模板,无论这些资源最初是否由CloudFormation创建。但它不是用于此类治理实践的正确工具。您应该看看AWS配置和Netflix Edda。Netflix看门人猴子也很有趣。我不明白这个问题。您不想编写代码来实现这一点吗?您是否尝试过控制台(web)界面,该界面列出了所有资源?@Max我很擅长编写代码。我只是不想迭代近40个boto3客户端,以确保我访问了所有的资源类型。你真的使用了AWS的所有40个服务吗?你可以调出上个月的账单,看看你实际使用了哪些服务,然后查询一下。根据你的问题,我假设有多个开发人员参与其中。他们都是全职管理员,可以创建他们想要的任何东西吗?不限于您希望他们使用的特定服务?您可以从S3存储桶获取账单详细信息。这可能有助于将查询的范围限制在正在使用的服务上。