Подтвердить что ты не робот

Как программно перечислить все ресурсы и теги aws

Я хотел бы проверить соответствие методу в AWS, поэтому я хочу программно извлечь все активы из учетной записи и проверить их теги.

Есть ли разумный способ достичь этого без повторения через фрагментированные клиенты aws в boto или Java API? Если я посчитаю только boto3, их будет около 40, большинство из них имеют слегка отличающуюся семантику. Если бы я действительно писал код, который использует все из них, я должен был бы добавить еще одного клиента каждый раз, когда роли AWS создадут новую службу.

Я уже посмотрел:
boto3 - 40 некоторые из клиентов службы для итерации делают это невозможным.
Клиент AWS Java - как указано выше
AWS cli - так же, как указано выше
Совместимость Monkey (Netflix) - просмотр только групп автоматического масштабирования
AWS Config - вам нужно запросить ресурсы по тегам, которые не смогут отслеживать непомеченные.

Что я сейчас ищу:
Netflix Edda

Что я сделал сейчас:
Точно, чего я не хотел, итерации через boto3 cloudformation, ec2, s3 и автомасштабирование клиентов. Это лучше, чем ничего, но есть явные пробелы в этом подходе.

4b9b3361

Ответ 1

Борьба за то, что вы получили общий доступ к script @whorka выше, но я думаю, должно быть, было обновление к skew сканирует ресурсы. В любом случае, script ниже, похоже, делает трюк!

    #!/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 не содержит область, которая вызывает перекос в barf

Ответ 2

К сожалению, требуемого решения не существует.

Имейте в виду, что AWS не поддерживает тегирование всех своих сервисов; поэтому то, что вы хотите сделать, возможно, даже не будет возможным (если вы хотите, это какой-то общий способ запросить все службы и использовать общие теги).

Существуют такие сервисы, как RightScale или, как вы знаете, Boto, которые обеспечивают абстракцию поверх AWS. Тем не менее, эти сторонние абстракции всегда будут иметь время задержки до того, как они поддержат новую услугу, по сравнению с CLI AWS.

Если вам действительно нужен какой-то общий способ запросить все службы, и обрабатывать те, которые в настоящее время не поддерживают тегирование, предложите сделать одно или все из следующих действий:

  • Использовать тегирование во всех сервисах, которые в настоящее время поддерживают тегирование: ec2, rds
  • Если служба не поддерживает тегирование, используйте имя ресурса, чтобы добавить эквивалент "тегов", например <component>-<environment>-<resource type>
  • Напишите небольшую программу, которая обертывает/вызывает все indivdual aws clis для каждой из сервисов.
  • В программе конвертируйте теги и имена ресурсов каждого команд aws cli в канонический формат, хранящийся в хранилище данных, например. dynamo, berkleydb
  • Напишите небольшой программа, которая затем выполняет вашу проверку соответствия с данными в этом хранилище данных

Когда новая служба приходит в сеть, пометьте ваши ресурсы и расширьте свою программу на шаге 3 для поддержки новой службы. Обратите внимание, что большинство последних новых услуг AWS прошли период объявления, а затем период предварительного просмотра, который длился 6 месяцев или более, например. Elastic File System и т.д. В общем, у вас будет время, прежде чем вам понадобится расширить свою программу для поддержки новых сервисов.

Кроме того, имейте в виду, что из "40 услуг", о которых вы упомянули, только небольшое подмножество действительно может быть "запущено или помечено". Большинство из этих услуг не являются действительно "ресурсами", например. AWS Config, CloudWatch, CloudTrail, SES, SNS, Data Pipeline. Так что может показаться, что многие API-интерфейсы, которые должны выполняться, могут оказаться в 10 или менее.

Ответ 3

Вот небольшая небольшая библиотека для запроса ресурсов AWS под названием " skew"...

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