Информация о пользователе в облачных функциях через триггеры GCS - PullRequest
1 голос
/ 14 февраля 2020

Мы обрабатываем файлы автоматически с помощью облачных функций Google, если какой-либо файл загружен в облачное хранилище Google. Мы написали код, используя python.

https://cloud.google.com/functions/docs/calling/storage

def hello_gcs_generic(data, context):
    """Background Cloud Function to be triggered by Cloud Storage.
       This generic function logs relevant data when a file is changed.

    Args:
        data (dict): The Cloud Functions event payload.
        context (google.cloud.functions.Context): Metadata of triggering event.
    Returns:
        None; the output is written to Stackdriver Logging
    """

    print('Event ID: {}'.format(context.event_id))
    print('Event type: {}'.format(context.event_type))
    print('Bucket: {}'.format(data['bucket']))
    print('File: {}'.format(data['name']))
    print('Metageneration: {}'.format(data['metageneration']))
    print('Created: {}'.format(data['timeCreated']))
    print('Updated: {}'.format(data['updated']))

Мы хотим знать, кто загрузил файл для нашей цели регистрации. Я не вижу никакой переменной в данных и контексте в вышеупомянутой функции, которая предоставляет информацию о пользователе.

Есть ли способ узнать, кто загрузил файл в GCF для триггеров GCS?

Ответы [ 2 ]

1 голос
/ 14 февраля 2020

Как вы упомянули, нет переменной для владельца объекта в данных или контексте. Однако, используя имя сегмента и имя объекта, вы можете вызвать Objects: get API, который извлекает метаданные объекта.

Используя параметр projection full, вы получите следующий объект ответа:

{
  "kind": "storage#object",
  "id": string,
  "selfLink": string,
  "name": string,
  "bucket": string,
  "generation": long,
  "metageneration": long,
  "contentType": string,
  "timeCreated": datetime,
  "updated": datetime,
  "timeDeleted": datetime,
  "temporaryHold": boolean,
  "eventBasedHold": boolean,
  "retentionExpirationTime": datetime,
  "storageClass": string,
  "timeStorageClassUpdated": datetime,
  "size": unsigned long,
  "md5Hash": string,
  "mediaLink": string,
  "contentEncoding": string,
  "contentDisposition": string,
  "contentLanguage": string,
  "cacheControl": string,
  "metadata": {
    (key): string
  },
  "acl": [
    objectAccessControls Resource
  ],
  "owner": {
    "entity": string,
    "entityId": string
  },
  "crc32c": string,
  "componentCount": integer,
  "etag": string,
  "customerEncryption": {
    "encryptionAlgorithm": string,
    "keySha256": string
  },
  "kmsKeyName": string
} 

Где owner:

Владелец объекта. Это всегда будет загрузчиком объекта. Если для iamConfiguration.uniformBucketLevelAccess.enabled задано значение true, это поле не применяется и не указывается в ответах.

Объекты облачного хранилища Google

Я использовал Api и владелец - это учетная запись службы, используемая для загрузки файла.

1 голос
/ 14 февраля 2020

Когда ваша облачная функция запущена, вы знаете личность объекта. Вы знаете это через свойства корзины и файла. Исходя из этого, вы можете использовать GCS API для запроса дополнительной информации об объекте GCS.

Если мы посмотрим на ссылку на структуру Object , мы найдем структуру с именем owner, которая задокументирована как будучи загрузчиком.

Похоже, что мы можем получить эту структуру с помощью Object: get запроса API.

Таким образом, в то время как запрашиваемая вами информация может не передаваться явно в запросе к облачной функции он доступен через API-интерфейсы Follow.

Если вы ищете информацию о загрузчике для целей аудита, вы можете просмотреть Доступ к журналам и журналам хранения . Похоже, что создание или выгрузка новой версии или нового объекта может быть настроено на создание записей журнала Stackdriver для целей аудита. Возможно, вам на самом деле не нужна информация в вашей облачной функции, если ответ можно ретроспективно объединить из существующих данных.

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