Как запускать облачные функции при создании нового проекта в организации? - PullRequest
0 голосов
/ 09 мая 2020

Я работаю над сценарием, который нужно будет запускать, когда новый проект будет создан в организации GCP, однако я просто не могу найти, где перечислены вновь созданные проекты (проверены журналы Stackdriver, но я ничего не могу найти в org level), интересно, есть ли другой способ активировать облачные функции при создании нового проекта?

Ответы [ 3 ]

0 голосов
/ 09 мая 2020

Вы можете это сделать, но его не так просто настроить.

Во-первых, глобальный процесс (подробно здесь ):

  • Выполните пользовательский запрос журнала
  • Отправка журналов в PubSub topi c
  • Запуск функции для сообщений PubSub

Для просмотра уровня журнала вашей организации вы не можете сделать это в консоли, вы должны выполнить это в командной строке. Вот пример

gcloud logging read --organization=YOUR_ORG_NUMBER \
  'logName:"organizations/YOUR_ORG_NUMBER/logs/cloudaudit.googleapis.com"
   AND timestamp>="2020-05-05T23:59:59Z"
   AND timestamp<="2020-05-07T23:59:59Z"
   AND severity= "NOTICE" 
   AND protoPayload.resourceName:"projects" 
   AND protoPayload.methodName="CreateProject"'

С небольшими пояснениями:

  • AND severity= "NOTICE" Здесь для успешного создания только создания
  • AND protoPayload.resourceName:"projects" Здесь для предотвращения двойного. У вас есть первая запись как длительный ответ, а имя ресурса начинается с organizations. Когда проект будет создан, у вас появится новая запись с project. Конечно, только потому, что я хочу, чтобы создание прошло успешно.
  • AND protoPayload.methodName="CreateProject"' Потому что мы также перемещаем проект в папку и нас не волнует метод updateProject, а только его создание.

Ваша полезная нагрузка выглядит так

insertId: -13v21gdcfxy
logName: organizations/YOUR_ORG_NUMBE/logs/cloudaudit.googleapis.com%2Factivity
protoPayload:
  '@type': type.googleapis.com/google.cloud.audit.AuditLog
  authenticationInfo:
    principalEmail: XXXXXXXXXXXXXXXXXXXXXXXXXXX
    serviceAccountDelegationInfo:
    - firstPartyPrincipal:
        principalEmail: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
  authorizationInfo:
  - granted: true
    permission: resourcemanager.projects.create
    resource: organizations/YOUR_ORG_NUMBE
    resourceAttributes: {}
  methodName: CreateProject
  request:
    '@type': type.googleapis.com/google.cloudresourcemanager.v1.CreateProjectRequest
    project:
      createTime: '2020-05-06T06:41:03.605Z'
      lifecycleState: ACTIVE
      name: XXXXXXXXXXXXXXXX
      parent:
        id: 'YOUR_ORG_NUMBE'
        type: organization
      projectId: XXXXXXXXXXXXXXXXXXXXXX
      projectNumber: 'NEW_PROJECT_NUMBER'
  requestMetadata:
    callerIp: 2600:1900:2001:2::19
    callerSuppliedUserAgent: google-api-python-client/1.7.4 (gzip),gzip(gfe)
    destinationAttributes: {}
    requestAttributes: {}
  resourceName: projects/XXXXXXXXXXXXXXXXX
  serviceName: cloudresourcemanager.googleapis.com
  status: {}
receiveTimestamp: '2020-05-06T06:41:07.346181918Z'
resource:
  labels:
    project_id: XXXXXXXXXXXXXXXXX
  type: project
severity: NOTICE
timestamp: '2020-05-06T06:41:06.431Z'

Этот пример структуры может помочь вам ускорить разработку

0 голосов
/ 09 мая 2020

Вы можете создать агрегированный приемник , который публикует sh сообщение в Pub / Sub topi c (что может запускать облачную функцию).

Вот как я помещаю сообщение в топи Pub / Sub c после создания проекта:

export PROJECT_ID=[YOUR_PROJECT_ID_WHICH_WILL_HOST_PUBSUB_TOPIC]
export ORGANIZATION_ID=[YOUR_ORGANIZATION_ID]
export TOPIC_ID=[YOUR_TOPIC_ID]
export SINK_NAME=[YOUR_SINK_NAME]

gcloud pubsub topics create $TOPIC_ID --project $PROJECT_ID
gcloud logging sinks create $SINK_NAME pubsub.googleapis.com/projects/$PROJECT_ID/topics/$TOPIC_ID --organization $ORGANIZATION_ID --log-filter 'logName="organizations/$ORGANIZATION_ID/logs/cloudaudit.googleapis.com%2Factivity" AND protoPayload.methodName="CreateProject" AND protoPayload."@type"="type.googleapis.com/google.cloud.audit.AuditLog" AND resource.type="project"'

После создания приемника gcloud предупреждает вас о предоставлении Pub / Sub роль издателя для учетной записи службы, которую он будет использовать.

gcloud organizations add-iam-policy-binding $ORGANIZATION_ID --member=serviceAccount:[xxxxxxxxxx]@gcp-sa-logging.iam.gserviceaccount.com --role=roles/pubsub.publisher

После этих команд вы увидите журнал в разделе Pub / Sub topi c.

0 голосов
/ 09 мая 2020

Все триггеры для облачных функций перечислены в документации по типам триггеров . Создание проекта там не указано и не подразумевается, поэтому это не прямой тип триггера.

В подобных случаях я бы рекомендовал найти способ для вашего собственного скрипта, чтобы явно запускать облачную функцию после ее завершения. (или даже после его запуска) создание проекта. Затем облачная функция может проверить, что создание проекта было завершено, и выполнить необходимые действия, которые вы хотите.

...