当前位置: 首页 > 知识库问答 >
问题:

如何从谷歌应用引擎调用谷歌云功能?

皇甫雨华
2023-03-14

我有一个应用引擎项目。

我也有谷歌云功能。

我想从App Engine项目中调用谷歌云功能。我就是没法让它发挥作用。

是的,如果我将函数完全公开(即将云函数设置为“允许所有流量”,并为“所有用户”创建一个允许调用函数的规则),它就可以工作。但是如果我限制这两个设置中的任何一个,它会立即停止工作,我得到403。

应用程序和函数在同一个项目中,所以我至少假设将函数设置为“仅允许内部流量”应该可以正常工作,前提是我有一个允许调用函数的规则。

这是如何工作的?人们通常如何从谷歌应用引擎中调用(非公共)谷歌云功能?

共有3个答案

陶富
2023-03-14

@盖凡是对的。

作为补充:我使用官方的Google Auth库为我提供了必要的标题。

const {GoogleAuth} = require('google-auth-library');
// Instead of specifying the type of client you'd like to use (JWT, OAuth2, etc)
// this library will automatically choose the right client based on the environment.
const googleCloudFunctionURL = 'https://europe-west1-project.cloudfunctions.net/function';
(async function() {
  const auth = new GoogleAuth();
  let googleCloudFunctionClient = await auth.getIdTokenClient(googleCloudFunctionURL);
  console.log(await googleCloudFunctionClient.getRequestHeaders(googleCloudFunctionURL));
})();

楚流觞
2023-03-14

如文档中所述,“允许内部流量”仅涉及以下内容:

只允许来自同一项目中的专有网络或专有网络服务控制的请求。所有其他请求均被拒绝。

请注意,由于应用引擎标准是一个无服务器产品,它不是VPC的一部分,因此从该产品发出的请求不被视为“内部”调用,实际上这些调用是从实例的公共IP发出的,因此您会收到一条HTTP 403错误消息。

此外,使用VPC无服务器连接器也不起作用,因为这更像是连接VPC中资源(如VM或Memorystore实例)的桥梁,而不是云功能,因为这也是一种无服务器产品,并且在VPC中没有IP。

我认为有三种选择:

>

  • 使用App Engine Flex:

    由于App Engine Flex使用虚拟机实例,这些实例将成为专有网络的一部分,即使在设置“仅允许内部流量”选项时,您也可以访问该功能。

    使用VM作为代理:

    您可以创建一个VPC无服务器连接器,并将其分配到应用引擎中的应用程序。然后您可以创建一个虚拟机,并使用虚拟机作为代理来实现该功能。由于成本原因,这不是最好的选择,但最终是一个选择。

    最后一个选项认为该功能可以使用Allow All Traffic(允许所有流量)选项:

    您可以在云功能上设置一些安全性,只允许特定的服务帐户,并且可以使用此示例代码进行身份验证。

    编辑:

    @gaefan在另一个答案中分享了该选项的代码示例。

  • 帅颖逸
    2023-03-14

    对于函数url的ping,您需要一个auth头。它应该看起来像:

    headers = {
        ....
        'Authorization': 'Bearer some-long-hash-token'
    }
    

    以下是如何获取令牌:

    import requests
    token_response = requests.get(
        'http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/identity?audience=' +
        'https://[your zone]-[your app name].cloudfunctions.net/[your function name]', 
        headers={'Metadata-Flavor': 'Google'})
        
    return token_response.content.decode("utf-8")
    

    “仅允许内部通信”无法按预期工作。我的应用程序引擎应用程序与功能在同一个项目中,它不工作。我必须打开“允许所有流量”,并使用header方法

    例子:

    def get_access_token():
        import requests
        token_response = requests.get(
            'http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/identity?audience=' +
            'https://us-central1-my_app.cloudfunctions.net/my_function', 
            headers={'Metadata-Flavor': 'Google'})
            
        return token_response.content.decode("utf-8")
        
    def test():
        url_string = f"https://us-central1-my_app.cloudfunctions.net/my_function?message=it%20worked"
        
        access_token = get_access_token()
        
    
        print(
            requests.get(url_string, headers={'Authorization': f"Bearer {access_token}"}
        )
    
     类似资料:
    • 我想能够从谷歌云功能中调用谷歌应用程序引擎,有可能吗?找不到任何解决办法

    • 谷歌云的功能似乎非常有趣,因为它是无服务器和零维护的解决方案。但是,什么时候在谷歌应用程序引擎上使用谷歌云功能合适呢?

    • 我正在看新的谷歌云数据存储,看起来很棒。但有件事我不明白。。。它应该替代谷歌应用引擎数据存储吗?我如何在GAE内部使用它?它们之间有什么区别? 我在Java有一个GAE应用程序,它使用3个实体,每个实体都有数千行,我需要经常做连接...

    • 对于这个问题,这里可能是错误的地方,所以如果有必要,请重新指示我。 我使用Google Cloud函数部署了几个简单的函数,它们可以实现以下功能: 从AWS读取文件并写入云SQL 我将这些函数作为单独的函数,因为(1)通常需要比云函数最大超时更长的时间。正因为如此,我正在考虑将这一切作为一项服务转移到App Engine。关于应用程序引擎标准,我的问题是: 请求超时是什么意思?如果我运行这个服务,

    • 我们需要为一个高流量的网站使用WordPress。我们预计每月的初始浏览量为50万次,并将增加到每月约800万次。主要在工作时间使用,一个月大约20天,每天8小时。 我们正在考虑将Google App Engine与Google Cloud SQL一起使用。我们想知道它对这种负载的扩展程度如何。理论上说Google App Engine应该自动扩展,但不确定Google Cloud SQL在扩展时