【发布时间】:2020-06-22 09:18:56
【问题描述】:
我目前正在尝试在 GCP 中构建一个简单的文件(仅限 csv)处理系统,基本上它所做的就是在上传新文件时,代码对其进行解析并将其存储在数据库中。
我使用这些命令创建了一个新主题(文件上传)和一个新服务帐户(按照以下步骤操作:https://cloud.google.com/run/docs/tutorials/pubsub#integrating-pubsub):
gcloud projects add-iam-policy-binding my-project \
--member=serviceAccount:service-0000000000@gcp-sa-pubsub.iam.gserviceaccount.com \
--role=roles/iam.serviceAccountTokenCreator
gcloud iam service-accounts create cloud-run-pubsub-invoker \
--display-name "Cloud run PubSub Invoker"
gcloud run services add-iam-policy-binding myservice \
--member=serviceAccount:cloud-run-pubsub-invoker@my-project.iam.gserviceaccount.com \
--role=roles/run.invoker
然后创建订阅:
gcloud pubsub subscriptions create file-upload-sub --topic file-upload \
--push-endpoint=https://myservice-myurl.a.run.app/api/test/ \
--push-auth-service-account=cloud-run-pubsub-invoker@my-project.iam.gserviceaccount.com
我有一个存储桶,我使用以下命令将“OBJECT_FINALIZE”事件绑定到它:
gsutil notification create -t file-upload -f json -e OBJECT_FINALIZE gs://MyBucket
我的端点具有以下路由(注意:它是部署在云上运行的 docker 映像中的 .net 应用程序):
[Route("api/[controller]")]
[ApiController]
public class TestController : ControllerBase
{
//GET : api/test
[HttpGet]
public IActionResult Get()
{
return Ok($"Get route pinged{Environment.NewLine}");
}
//POST : api/test
[HttpPost]
public IActionResult Post([FromBody] string bodyContent)
{
return Ok($"Content received : {bodyContent}{Environment.NewLine}");
}
}
当我使用 curl 命令发送请求时:
curl https://myservice-myurl.a.run.app/api/test/ -H "Authorization: Bearer $(gcloud auth print-identity-token)" -H "Content-Type: application/json" -d '"data"'
一切正常(我在控制台和日志查看器中收到确认消息)但是当我尝试使用 gcloud pubsub topics publish file-upload --message '"test"' 将消息直接推送到主题时,我在日志查看器中只收到 400 个响应,没有有效负载向我解释它在哪里坏了
编辑: 所以显然这是一个与我尝试测试应用程序的方式相关的问题,由于某种原因,当消息是基本字符串时,PubSub 转换了将消息发送到云运行的方式,因此它破坏了 .net 内容验证。我更改了代码以接受参数中文件的元数据,一切正常
编辑 2: 写了一个正确的答案来解释我哪里错了
【问题讨论】:
-
您能否查看 Pub/Sub (cloud.google.com/pubsub/docs/monitoring) 和 Cloud Run (cloud.google.com/run/docs/monitoring) 的 Cloud Monitoring 指标,以了解您的消息是否已成功发布和传递?
-
我通常会在推送订阅之外创建一个拉订阅。像这样,我可以拉它(在命令行或控制台中)并查看消息内容。然后我将其复制并手动提交到我的 Cloud Run 服务。
-
再次运行带有“--verbosity=debug”和“--log-http”的命令,这将获得有关正在发生的事情的更多信息。
-
终于找到错误了,我编辑了第一个帖子解释一下
-
当消息是基本字符串时,“PubSub 会改变将消息发送到云运行的方式”是什么意思?
标签: .net google-cloud-platform google-cloud-pubsub google-cloud-run