GCP-分别在子域和域上部署API和前端

时间:2020-04-14 17:02:30

标签: node.js express google-app-engine google-cloud-platform

首先,我创建一个Google App Engine并将其部署在API和前端上的自定义域(我们将其称为:mysite.ms)上。该API用nodejsExpress编写,而前端是React应用程序。这是我用于部署的app.yml文件:

runtime: nodejs
env: flex

manual_scaling:
  instances: 1

resources:
  cpu: .5
  memory_gb: 0.5
  disk_size_gb: 10

handlers:
  - url: /
    static_files: www/build/index.html
    upload: www/build/index.html

  - url: /
    static_dir: www/build

现在,我要分割元素。在mysite.ms域上仅部署React应用程序,在子域sub.mysite.ms上部署API。由于该域是在freenom上接管的,因此要创建一个子域,我添加了一个新的DNS类型的CNAME,其值是sub.mysite.ms,并定位了原始域mysite.ms

是否可以仅使用Google App Engine和单个app.yml文件来创建这些单独的部署,还是需要使用其他工具来分离文件?

您如何建议我继续?由于我在网上找不到任何清晰的信息,您能给我一些解决这些问题的提示吗?

更新

我已经阅读了您提供给我的文档,对此我有些怀疑。首先,如何创建不同的服务?因为我创建了这个(但很可能是错误的)dispatch.yml

dispatch:
  - url: "mysite.ms/*"
    service: default

  - url: "sub.mysite.ms/*"
    service: api

但是当我使用此命令gcloud app deploy dispatch.yaml进行部署时,出现错误,因为它找不到模块'api'。 在上一个版本中,在我的server.js中,我有以下代码来处理React

app.use(express.static(path.resolve(__dirname, 'www', 'build')));
app.get('*', (req, res) => { res.sendFile(path.resolve(__dirname, 'www', 'build', 'index.html')); });
  1. 即使将前端和api分配在不同的域上,我也应该保留这两行代码吗?

  2. 我应该在Google App Engine的部分中将sub.mysite.ms添加到自定义域区域吗?

  3. 即使我有app.yml,我也应该保留文件dispath.yaml吗?

1 个答案:

答案 0 :(得分:1)

目前,使用相同的yaml文件不能部署多个服务。假设您可能要部署两个服务:apifrontend。假设您希望frontend服务是默认服务,因此每个人每次访问mysite.ms时,他们都会看到frontend服务。

假设您拥有app.yaml服务的frontend文件,如下所示:

runtime: nodejs
env: flex

manual_scaling:
  instances: 1
resources:
  cpu: 1
  memory_gb: 0.5
  disk_size_gb: 10

您会注意到,service中没有app.yaml属性。在app.yaml文件reference doc中,您将看到以下内容:

service: service_name

如果创建服务,则为必需。对于默认服务是可选的。每个服务和每个版本必须有一个名称。名称可以包含数字,字母和连字符。在灵活的环境中,服务和版本的总长度不能超过48个字符,并且不能以连字符开头或结尾。为每个服务和每个版本选择唯一的名称。不要在服务和版本之间重复使用名称。

由于没有service属性,因此部署将设置为default服务。现在,假设您还有另一个yaml文件,尤其是api.yaml文件来部署api服务。这是一个示例:

runtime: nodejs
env: flex
service: api

manual_scaling:
  instances: 1
resources:
  cpu: 1
  memory_gb: 0.5
  disk_size_gb: 10

您将看到我已经添加了service属性,并且当您使用gcloud app deploy api.yaml进行部署时,部署将创建服务api

最后,在创建服务之后,您将能够部署您创建的dispatch.yaml文件。

为您提供一些建议:

  • app.yaml文件分配给默认服务是一种很好的做法。对于其他服务,您可能想根据要使用该文件进行部署的服务来命名文件,即api.yamlbackend.yamlapi_external.yaml等。
  • 您可以使用gcloud app deploy path/to/service1 path/to/service2 path/to/service3 ...部署部署两个服务,也可以单独进行部署以更好地进行调试,以防出现问题。
  • 由于您使用的是Flex环境,因此handlers属性为not supported。如果添加它们,这些将被忽略。
  • 根据您使用的环境检查正确的文档。 app.yamldispatch.yamlgeneral docs