【问题标题】:Specify API Gateway id instead of using 'random' id指定 API Gateway id 而不是使用“随机”id
【发布时间】:2020-01-30 17:14:10
【问题描述】:

通过部署 AWS Lambda 函数(通过无服务器框架),并通过 AWS API Gateway 中的 HTTPS 端点公开它... 是否可以构造和设置 API Gateway id 从而确定该 Lambda 函数的 HTTP 端点的第一部分?

在部署 AWS Lambda 函数并添加 HTTP 事件时,我现在在 https://klv5e3c8z5.execute-api.eu-west-1.amazonaws.com/v1/fizzbuzz 中获得一个随机 id 作为(第一个主机名)。新/新部署会收到新的随机字符串,即 10 个字符的 id。

我想确定并设置该 ID,而不是使用它。 (我自己会确保它足够独特,或者自己处理端点命名冲突。)

原因是在一个单独的无服务器项目中,我需要使用那个端点(因此需要知道那个 id)。我不想让项目 1 确定它,然后在项目 2 中读取/检索它,而是想在项目 1 中构造和设置端点,以便我也可以在项目 2 中使用已知端点。

(建议使用自定义域作为该端点的替代/别名......但如果可能的话,我不想在混合中引入新组件,以及不包含 Cloud-it-might-take-30-minutes-to-create-a-domain-Front 更好:-))

如果这不可能,我可能需要使用http://www.goingserverless.com/blog/api-gateway-url 中描述的方法,提到端点正在通过 CloudFormation 堆栈从一个项目中公开,以便从中读取并在另一个项目中使用,但这会在部署第二个项目时引入(一点延迟和)依赖性。

【问题讨论】:

  • 如您在问题中概述的那样,从您的两个脚本中导出/导入动态网关 ID 是实现此目的的正确方法。我没有看到项目 A 和 B 之间的依赖关系的问题。如果您的 A 端点不存在,那么 B 肯定不会工作,那么依赖关系是否有效?关于延迟,您构建这些无服务器堆栈的频率是多少,如果它们被更新而不是重新创建,更新应该会更快并且 ID 保持不变。
  • 谢谢。您说得对,依赖项无效-第二个项目确实需要第一个项目可用 c.q.已部署。 (如果您将此评论作为答案,我将能够投票并接受它。)

标签: amazon-web-services aws-lambda aws-api-gateway serverless-framework


【解决方案1】:

问题:“是否可以构造和设置 API Gateway id?”

答案:否(请参阅此问题的其他答案)。

我能够将项目 1 的服务端点放入项目 2 的 serverless.yml 文件中,最终构建我需要的服务的完整 URL。我之所以分享这个,是因为它是一种替代解决方案,也适用于我的情况。

在项目2的serverless.yml中,可以通过service_url: "${cf:<service-name>-<stage>.ServiceEndpoint}"引用项目1的服务端点。示例:"${cf:my-first-service-dev.ServiceEndpoint}"

CloudFront 公开了包含完整 URL 的 ServiceEndpoint,因此包括 AWS Gateway REST API ID。

无服务器框架文档中的更多信息:https://serverless.com/framework/docs/providers/aws/guide/variables/#reference-cloudformation-outputs

似乎 Serverless Framework 正在将此 ServiceEndpoint 添加为堆栈输出。

【讨论】:

    【解决方案2】:

    您要设置的“第一个主机名”称为“REST API id”,由 API Gateway 在创建 API 时生成。用于在 API Gateway 中创建 API 的 API 不提供指定 REST API id 的能力,所以不,没有办法指定 id。

    原因可能是这些 id 被用作面向公众的域名的一部分。由于此域名不包含其所属 AWS 账户的标识符,因此该 id 必须是全球唯一的,因此 AWS 会生成它们以避免冲突。作为AWS puts it(我强调):

    对于边缘优化 API,基本 URL 为 http[s]://*{restapi-id}*.execute-api.amazonaws.com/stage 格式,其中 {restapi-id} 是 API 的 id由 API Gateway 生成强>。您可以将自定义域名(例如 apis.example.com)分配为 API 的主机名,并使用 https://apis.example.com/myApi 格式的基本 URL 调用 API。

    对于创建自定义域名的选项,您应该考虑与之相关的更复杂的问题,因为您还必须为该域提供匹配的 SSL 证书。虽然您可以为此使用 ACM,但目前存在用于 CloudFront 分配的 SSL 证书的限制(边缘优化的 API Gateway API 在幕后使用)need to be issued in us-east-1

    您已经提到的将 CloudFormation 堆栈中的 API 端点导出为输出值并在您的其他堆栈中使用该导出值的选项可以很好地工作。正如您所指出的那样,这会在两个堆栈之间创建依赖关系,因此一旦您部署了使用项目 1 的输出值的项目 2,您只能在项目 2 堆栈被删除或更新后删除项目 1 的 CloudFormation 堆栈不再使用导出的值。这可能是一项功能,但从您的描述看来,它不适用于您的用例。

    类似于导出堆栈输出值的方法是使用一些共享存储,而不是利用 CloudFormation 的导出输出值功能。这里想到的是SSM Parameter Store,它提供了一些integration into CloudFormation。该集成可以轻松地从项目 2 的堆栈中的 SSM 参数存储中读取参数。要将值写入项目 1 中的参数存储,您需要在 CloudFormation 模板中使用custom resource。 Github 上至少有一个sample implementation

    如您所见,有多个选项可用于解决您的问题。选择哪一个取决于您的项目需求。

    【讨论】:

    • 很好的答案。不仅解决了主要问题(回答“不,那不可能”),还添加了背景信息,并讨论了两条替代路线。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-20
    • 2019-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多