我想将 Google Cloud Run 与 Google App Engine 和 Google Cloud Functions 进行比较。Cloud Run快速入门:构建和部署似乎是一个很好的起点。
我的应用程序默认凭据太广泛,无法在开发过程中使用。我想使用一个服务帐户,但我很难配置一个可以毫无错误地完成快速入门的帐户。
我可以分配给必须执行这些命令而不会出错的服务帐户的最低权限的预定义角色集是什么:
gcloud builds submit --tag gcr.io/{PROJECT-ID}/helloworld
gcloud beta run deploy --image gcr.io/{PROJECT-ID}/helloworld
Run Code Online (Sandbox Code Playgroud)
当通过具有两个角色的服务帐户运行时,第一个命令失败并出现(看似虚假的)错误:Cloud Build Service Account和Cloud Run Admin。我还没有运行第二个命令。
编辑:错误不是虚假的。该命令构建映像并将其复制到项目的容器注册表,然后无法将构建日志打印到控制台(权限不足)。
编辑:我运行了第二个命令。它失败了Permission 'iam.serviceaccounts.actAs' denied on {service-account}。我可以通过分配Service Account User角色来解决这个问题。但这允许 deploy 命令充当项目的运行时服务帐户,默认情况下该帐户具有该Editor角色。使用(有效地)和ViewerEditor角色并不比使用我的应用程序默认凭据好多少。
所以我应该更改运行时服务帐户权限。该Cloud Run 服务标识的文档都这样说最少特权的访问配置:
这会更改项目中所有服务以及 Compute Engine 和 Google Kubernetes Engine 实例的权限。因此,最小权限集必须包含项目中 Cloud Run、Compute Engine 和 Google Kubernetes …
我需要在需要部署在谷歌云运行中的 nodejs 应用程序前面设置反向代理 nginx。
用例 - 需要提供通过 nginx 压缩的资产(我不想为 gzip 压缩开销节点) - 阻止小型 DDOS 攻击
我没有找到任何在云运行中设置 nginx 和节点的教程。
我还需要为节点安装 PM2。
如何在 docker 中进行此设置?在部署之前如何配置 nginx?
提前致谢
docker google-cloud-platform gcloud docker-compose google-cloud-run
背景
该服务是一个简单的 Go 程序,它将文件从 Cloud Storage 传送到浏览器。
在我的 Macbook 上一切正常,但对于某些请求在 Cloud-Run(托管)上失败。主要是大型 mp4 文件。
问题
日志只显示一个500状态,浏览器也是如此。但是我的服务除了开始复制文件之外没有记录任何内容。没有 IO 错误或任何东西。
此消息在500状态前 4 秒显示:
Container Sandbox Limitation: Unsupported syscall membarrier(0x10,0x0,0x0,0x8,0x775dce0b030,0x775dce0b000). Please, refer to https://gvisor.dev/c/linux/amd64/membarrier for more information.
我无法在本地重现此内容。使用相同的配置和 GCP 存储桶在本地正常工作。
该服务在带有较小文件(如图像)的 Cloud-Run 上运行良好。只是不是我试过的视频。
我试过了
io.Copy. 没有错误,io.Copy调用后挂起。更新 2019-08-16
我创建了一个非常简单的服务,将“A”打印到 http responsewriter。它也可以在本地完美运行,但在云运行中以较大的尺寸返回 500。1MB OK,5MB OK,50MB 失败,100MB 失败等等。这个服务运行时没有 membarrier 消息。
代码可在此处获得:https : //github.com/andrioid/reproduce-cloud-run-bug
也报告了问题跟踪器:https : //issuetracker.google.com/issues/139511257 …
我在Google Cloud run上创建了一项服务,可以使用Container注册表中的图像通过Google Cloud Console手动进行部署。但是从CLI部署失败。这是我正在使用的命令以及出现的错误。我无法理解我所缺少的内容:
$ gcloud beta run deploy service-name --platform managed --region region-name --image image-url
Deploying container to Cloud Run service [service-name] in project [project-name] region [region-name]
X Deploying...
. Creating Revision...
. Routing traffic...
Deployment failed
ERROR: (gcloud.beta.run.deploy) INVALID_ARGUMENT: The request has errors
- '@type': type.googleapis.com/google.rpc.BadRequest
fieldViolations:
- description: spec.revisionTemplate.spec.container.ports should be empty
field: spec.revisionTemplate.spec.container.ports
Run Code Online (Sandbox Code Playgroud)
更新1:
我已使用来更新SDK gcloud components update,但仍然存在相同的问题
这是我的SDK版本
$gcloud version
Google Cloud SDK 270.0.0
beta 2019.05.17
bq 2.0.49
core 2019.11.04
gsutil 4.46
Run Code Online (Sandbox Code Playgroud)
我正在使用多阶段docker构建。这是我的Dockerfile: …
我尝试为用户删除(Firebase Auth)创建一个触发器,该触发器应该调用我的 Cloud Run 实例,但似乎即使在 10 分钟后它也不会触发。这就是我创建触发器的方式:
gcloud eventarc triggers create on-delete-user \
--event-filters="methodName=google.firebase.auth.user.v1.deleted" \
--event-filters="serviceName=identitytoolkit.googleapis.com" \
--event-filters="type=google.cloud.audit.log.v1.written" \
--destination-run-service=grpc-v1-dev \
--destination-run-path=/api.v1.DeleteUserEvent \
--service-account user@projectId.iam.gserviceaccount.com \
--location europe-west4 \
--project projectId \
--format json
Run Code Online (Sandbox Code Playgroud)
我缺少什么?
更新:我还尝试使用我在日志中看到的方法名称。
gcloud eventarc triggers create on-delete-user-2 \
--event-filters="type=google.cloud.audit.log.v1.written" \
--event-filters="serviceName=identitytoolkit.googleapis.com" \
--event-filters="methodName=google.cloud.identitytoolkit.v1.AccountManagementService.DeleteAccount" \
--destination-run-service=grpc-v1-dev \
--destination-run-path=/api.v1.DeleteUserEvent \
--service-account user@projectId.iam.gserviceaccount.com \
--location europe-west4 \
--project projectId \
--format json
Run Code Online (Sandbox Code Playgroud)
更新2:
我也尝试使用控制台创建它,但仍然没有事件。
UPDATE3:我确实从日志中获取事件google.cloud.identitytoolkit.v1.AccountManagementService.DeleteAccount,并且我的云实例接收到调用,但我收到的数据与此处的模型无关。
我一直在尝试创建一个公共云运行调用程序策略并将其绑定到我的 cb_app 云运行服务,以便可以公开它。我创建了一个自定义服务并为其分配了云管理员角色。但出现这个错误
Error: Error creating Service: googleapi: Error 403: Permission 'iam.serviceaccounts.actAs' denied on service account app-worker@samuel-django-project.iam.gserviceaccount.com (or it may not exist).
这是配置
resource "google_cloud_run_service_iam_member" "domain" {
service = google_cloud_run_service.cb_app.name
location = google_cloud_run_service.cb_app.location
role = "roles/run.admin"
member = "serviceAccount:${var.service_account}"
}
#create service account to run service
resource "google_service_account" "cb_app" {
account_id = "app-worker"
display_name = "app worker"
}
Run Code Online (Sandbox Code Playgroud)
在应用程序服务中,我有这个
spec {
# Use locked down Service Account
service_account_name = google_service_account.cb_app.email
Run Code Online (Sandbox Code Playgroud)
关于如何解决这个问题有什么想法吗?
service-accounts terraform google-iam terraform-provider-gcp google-cloud-run
我有一个奇怪的问题。当我提交到 github 代码的特定开发分支时,我为云运行设置了持续交付。
当我提交时,我看到它注意到更改并构建代码,但它不会自动将其部署到云运行实例。
我必须手动选择编辑并部署新修订版,然后选择创建的映像。
我该怎么做才能自动部署?
我们(作为一家公司)每天都会经历巨大的峰值。我们使用 Pub/Sub -> Cloud Run 组合。
我们遇到的问题是,当高流量到来时,Pub/Sub 会尝试同时将消息推送到 Cloud/Run,而无需任何流量控制。结果?
429:由于没有可用实例,请求被中止。
尽管这被标记为警告,但每个 4xx HTTP 响应都会导致消息重试传递。
因此,消息返回队列并等待。如果消息重复此过程并且仍然获取实例,Cloud Run 会再次返回 429,并且消息会发送回队列。此过程重复 x 次(取决于我们在最大传递尝试中设置的值)。之后,消息进入死信队列。
我们希望避免这种情况,最好不要收到任何 429,这样消息就不会来回传输,并且不会最终出现在死信订阅中,因为它不是我们想要的应用程序错误之一保留在那里,而是由 Pub/Sub 不控制流程并与 Cloud Run 协调引起的警告。
Pub/Sub 和推送订阅(Cloud Run 需要使用)都没有任何流量控制功能。
有没有办法控制发送到 Cloud Run 的消息数量以避免收到 429 响应?而且,当 Cloud Run 明显达到实例限制时,为什么 Pub/Sub 还要尝试交付。最好的方法是将消息保留在队列中,直到实例释放为止。
大多数答案可能会建议增加实例的限制。我们已经设置了 1000。这将无法扩展,因为即使我们将限制设置为 1500 并且出现巨大的峰值,我们也会超过限制并再次收到 429 条消息。
我能想到的唯一选择是一些流量控制。到目前为止,我们已经了解了 Cloud Tasks,但我们不确定这是否可以帮助我们。理想情况下,我们不想引入任何新服务,但如果有必要,我们会这样做。
感谢您提供的所有提示和时间!:)
google-cloud-platform google-cloud-pubsub google-cloud-tasks google-cloud-run
我已经构建了一个容器化的 python 应用程序,该应用程序使用.env文件和使用 compose build 编译的docker-compose.yml文件在本地运行没有问题。
然后我就可以像这样在 Dockerfile 中使用变量。
ARG APP_USR
ENV APP_USR ${APP_USR}
ARG APP_PASS
ENV APP_PASS ${APP__PASS}
RUN pip install https://${APP_USR}:${APP_PASS}@github.org/*****/master.zip
Run Code Online (Sandbox Code Playgroud)
我正在通过同步的 bitbucket 存储库部署到云运行,并在“修订”>“秘密和变量”下定义,(如下所述: https: //cloud.google.com/run/docs/configuring/environment-variables)但我无法弄清楚如何在构建过程中访问 Dockerfile 中的这些变量。
据我了解,我需要创建一个 cloudbuild.yaml 文件来定义变量,但我无法找到如何使用 cloud run 中定义的环境变量进行设置的清晰示例。
environment-variables docker google-cloud-platform google-cloud-run
google-cloud-run ×10
docker ×3
event-arc ×1
firebase ×1
gcloud ×1
go ×1
google-iam ×1
gvisor ×1
knative ×1
terraform ×1