我正在编写一个脚本,当在GCP组织中创建新项目时,该脚本需要触发,但我根本找不到新创建的项目列出的位置(已检查Stackdriver日志,但在组织级别找不到任何内容(,不知道在创建新项目后是否有其他方法可以触发云功能?
您可以创建一个聚合接收器,将消息发布到Pub/Sub主题(可以触发云函数(。
这就是我在项目创建后将消息放入Pub/Sub主题的方式:
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主题中看到日志。
云函数的所有触发器都列在触发器类型的文档中。项目创建没有在那里列出或隐含,因此它不是一种直接触发类型。
在这种情况下,我建议您为自己的脚本寻找一种方法,在云函数完成(甚至开始(项目创建后显式触发它。然后,云功能可以验证项目创建是否完成,并执行所需的操作。
您可以这样做,但设置起来并不简单。
首先,全球流程(此处详述(:
- 执行自定义日志查询
- 将日志放入PubSub主题
- 在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'
这个结构示例可以帮助您加快的开发