为 Google Cloud Function 使用自定义域
Posted
技术标签:
【中文标题】为 Google Cloud Function 使用自定义域【英文标题】:Use custom domain for Google Cloud Function 【发布时间】:2018-02-01 16:08:40 【问题描述】:在使用 HTTP 触发器时,我在任何地方都看不到为我的 Google Cloud Function 设置自定义域的任何选项。似乎是一个相当大的遗漏。有没有办法使用自定义域而不是他们的location-project.cloudfunctions.net
域或一些解决方法来达到同样的效果?
我读了一篇文章,建议在函数前面使用 CDN,函数 URL 指定为拉取区域。这可行,但会带来不必要的成本 - 在我的场景中,没有任何内容能够被缓存,因此使用 CDN 远非理想。
【问题讨论】:
您找到解决方法了吗? 对于它的价值,这个最近的回答声称没有 Firebase 是不可能的***.com/questions/56469437/… 【参考方案1】:如果您connect your Cloud project with Firebase,您可以connect your HTTP-triggered Cloud Functions to Firebase Hosting 获取虚 URL。
【讨论】:
谢谢 - 我记得在某处读过 Google Cloud Functions for Firebase 支持此功能。已投票,但不会标记为答案,因为希望有一天这个功能会得到原生支持,或者会出现解决方法。 使用 Cloud Run 获取自定义域的方法也是通过 Firebase 托管。 是否可以通过调用域来运行函数?我已经尝试过,但如果我只是访问域 www.mydomain.com,似乎不会调用该函数 @FrankvanPuffelen 我能够在完全不与 Firebase 交互的情况下让自定义域在 Cloud Run 服务上运行。该过程涉及在 GCP 控制台的 Cloud Run 区域中单击“自定义域”,然后按照步骤添加 DNS 记录以证明域所有权。然后它会自动为我的域生成一个 TLS 证书并进行设置。我不需要将任何 DNS 功能委托给 GCP 来执行此操作,我能够在我的非 GCP DNS 提供商中设置所需的记录。 请注意,这只有使用“us-central1”才能正常工作,请参阅:***.com/questions/48874671/…【参考方案2】:这个答案已经有一段时间了。
是的,现在您可以将自定义域用于您的 Google Cloud 功能。
转到 firebase 并将您的项目与 firebase 相关联。我们在这里感兴趣的是托管。根据 firebase documentation 安装 Firebase CLI - (非常好的文档在这里)
现在创建您的项目,正如您可能已经在文档中注意到的那样,要将 firebase 添加到您的项目中,请键入 firebase init
。选择托管,就是这样。
完成后,查找firebase.json
文件。然后像这样自定义它
"hosting":
"public": "public",
"ignore": [
"firebase.json",
"**/.*",
"**/node_modules/**"
],
"rewrites": [
"source": "myfunction/custom",
"function": "myfunction"
,
]
默认情况下,您会获得类似https://project-name.web.app
的域,但您可以在控制台上添加自己的域。
现在部署您的网站。由于您对网络托管不感兴趣,因此您可以按原样离开。现在你的函数将像这样执行
要执行的函数 > myfunction
自定义网址>https://example.com/myfunction/custom
【讨论】:
不知道你是怎么做到的,我的 GCP 项目与一个 firebase 项目相连,myFunction 是什么,因为 GCP 函数可以具有相同的名称并部署到不同的区域。尝试使用函数名称时,我收到 302 错误,我可以使用其 cloudfunctions.net 域卷曲有问题的函数。想法? 您会更新答案,以便更了解 myfunction/custom 的来源。 @Steve,myfunction/custom 只是为云函数的 url 选择的完全任意路径 - 假设“example.com/”是您的域,您可以选择路径为“myfunction /custom”、“bob/and/alice”、“this/is/a/silly/example”等 OP happened 使用他的云函数名称“myfunction”作为路径,但这只是任意的 - 它们不必具有相同的名称。 @LeadDreamer 所以实际上它不会是一个相对 url,它会是一些通用的云函数 url,比如https://region-project/function
完全正确。您可以任意“命名”用户可见的域和路径,就像您可以任意“命名”您的函数(但不是函数域)一样【参考方案3】:
如果您不介意 url 的最终外观,您还可以设置 CNAME dns 记录。
function.yourdomain.com -> us-central1******.cloudfunctions.net
那么你可以这样称呼它
function.yourdomain.com/function-1/?message=Hello+World
【讨论】:
你确定这个 CNAME 有效吗?据我所知,谷歌不允许这样做 经过测试并且 100% 不起作用:将返回 404,如 func.yaskur.com/example【参考方案4】:避免使用 Firebase 的另一种方法是在 Cloud Function 或 Cloud Run 前面放置一个负载均衡器,并使用“无服务器网络端点组”作为负载均衡器的后端。
设置好负载均衡器后,只需修改域的 DNS 记录以指向负载均衡器即可。
https://cloud.google.com/load-balancing/docs/https/setting-up-https-serverless
【讨论】:
为我工作!谢谢)!【参考方案5】:使用 Cloudflare Workers(CDN、反向代理)
为什么?因为它不仅允许您在 Cloud Function 上设置反向代理,还允许您配置诸如 - 在 CDN 边缘位置的服务器端渲染 (s-s-r)、为初始 (SPA) 网页加载提供水合 API 响应、CSRF防护、DDoS 防护、高级缓存策略等
-
将您的域添加到 Cloudflare;然后转到
DNS
设置,添加指向 192.0.2.1
的 A
记录,并为该记录启用 Cloudflare 代理(橙色图标)。例如:
-
创建一个类似于此的Cloudflare Worker 脚本:
function handleRequest(request)
const url = new URL(request.url);
url.protocol = "https:";
url.hostname = "us-central1-example.cloudfunctions.net";
url.pathname = `/app$url.pathname`;
return fetch(new Request(url.toString(), request));
addEventListener("fetch", (event) =>
event.respondWith(handleRequest(event.request));
);
-
最后,在 Cloudflare 仪表板中打开
Workers
选项卡,然后添加一个新路由,将您的域 URL(模式)映射到此工作脚本,例如example.com/*
=> proxy
(脚本)
有关完整示例,请参阅GraphQL API and Relay Starter Kit(请参阅web/workers
)。
另外,请在 GCF 问题跟踪器中为 Allow me to put a Custom Domain on my Cloud Function 投票。
【讨论】:
虽然我不认为这是将自定义域添加到无服务器端点的最佳方法,但我必须同意 Cloudflare Workers 是一个令人惊叹的产品。如果您想在构建产品时查看一些很酷的东西,请尝试一下!以上是关于为 Google Cloud Function 使用自定义域的主要内容,如果未能解决你的问题,请参考以下文章
为 Google Cloud Function 使用自定义域
如何修改后台 Cloud Function 的 Google Cloud Pub/Sub 订阅确认截止日期
Google Cloud Function - ImportError:无法从“google.cloud”(未知位置)导入名称“pubsub”
无法在安全的Google Cloud Function上获得CORS错误