Как перебрать все ключи Google Cloud KMS в организации, не сталкиваясь с квотами на чтение? - PullRequest
1 голос
/ 15 января 2020

Я пытаюсь выяснить, существуют ли ключи, версии которых старше одного года, и устанавливаю период их обращения равным 24 часам. К сожалению, каждый вызов списка ключей связывается со значением key.read, для которого есть квота, которая очень мала (~ 300 / мин), есть ли способ обойти эти квоты, помимо их увеличения? Я пытаюсь периодически запускать этот код в облачной функции, поэтому существует ограничение времени выполнения, так что я не могу просто ждать сброса квоты.

def list_keys(project):
    client = kms_v1.KeyManagementServiceClient()
    #this location list is based on a running of `gcloud kms locations list` and represents a where a key could be created
    location_list = ['asia','asia-east1','asia-east2','asia-northeast1','asia-northeast2',
                     'asia-south1','asia-southeast1','australia-southeast1','eur4','europe',
                     'europe-north1','europe-west1','europe-west2','europe-west3','europe-west4',
                     'europe-west6','global','nam4','northamerica-northeast1','southamerica-east1',
                     'us','us-central1','us-east1','us-east4','us-west1','us-west2']

    for location in location_list:
        key_ring_parent = client.location_path(project,location)
        key_ring_list = client.list_key_rings(key_ring_parent)
        for key_ring in key_ring_list:
            parent = client.key_ring_path(project,location,format_keyring_name(key_ring.name))
            for key in client.list_crypto_keys(parent):
                start_time = key.primary.create_time # need to use primary to get latest version of the key
                now = time.time()
                now_seconds = int(now)
                elapsed = now_seconds - start_time.seconds
                next_rotate_age =(key.next_rotation_time.seconds - now_seconds) + elapsed
                days_elapsed = elapsed/3600/24
                print(key.name," is this many days old: ",  days_elapsed)
                print(key.name," will be this many days old when it is scheduled to rotate: ",  next_rotate_age/3600/24)
                #if the key is a year old set it to rotate tomorrow
                if days_elapsed > 364:
                    #client.
                    update_mask = kms_v1.types.UpdateCryptoKeyRequest.update_mask
                    #print(update_mask)
                    new_rotation_time  = now_seconds + (3600*24) # 1 day from now because can't set less than 24 hrs notice on certain keys
                    key.next_rotation_time.seconds = new_rotation_time

                    update_mask =  {'paths':{'next_rotation_time': new_rotation_time}} 
                    print(client.update_crypto_key(key, update_mask))

Ответы [ 2 ]

2 голосов
/ 15 января 2020

Является ли инвентаризация облачных активов опцией? Вы можете запустить что-то вроде

$ gcloud asset export --organization YOUR_ORG_ID      \
      --asset_types cloudkms.googleapis.com/CryptoKey \
      --content-type RESOURCE                         \
      --output-path "gs://YOUR_BUCKET/NEW_FILE"

Выходной файл будет содержать полный ресурс CryptoKey для каждого ключа в организации, поэтому вам не нужно отправлять тонну List / Get запросы к API KMS.

1 голос
/ 15 января 2020

Изучив ваш запрос, может показаться, что невозможно обойти квоты, кроме их увеличения.

Я бы посоветовал взглянуть на следующие документы:

  1. Квоты ресурсов
  2. Работа с квотами
  3. Квоты и ограничения

Эти документы должны предоставить вам необходимую информацию о квотах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...