在template.yaml中创建多个API Gateway实例时,如何控制在运行 'sam local start-api'时模仿哪个Gateway?
When creating multiple API Gateway instances in template.yaml, how do you control which Gateway is imitated when running 'sam local start-api'?
我创建了一个 SAM template.yaml 文件,其中包含两个 API 网关实例 - 一个用于生产,一个用于暂存。每个阶段都有自己的阶段,分别称为 Production 和 Staging,每个阶段都有自己特定于环境的阶段变量。
我在本地构建的应用程序是使用 AWS SAM CLI 创建的,我一直在使用命令 'sam local start-api' 到 运行 API 网关的本地实例在邮递员中测试调用端点 - 一直运行良好。不幸的是,我现在需要开始测试需要阶段变量的端点,而且我看不到任何方式告诉 SAM CLI 模仿模板文件中的两个 API 网关实例中的哪一个。显然我不希望它使用 Production 因为它将有连接到实时服务的数据。
我知道我可以创建一个包含两个阶段的 API 网关实例,因此,如果没有办法执行上述操作,是否有办法获取SAM 改为使用 API 网关实例中的特定阶段?下面是我的模板文件中的一个片段。
ApiProduction:
Type: AWS::Serverless::Api
Properties:
Name: service-layer-production-v1
StageName: Production
OpenApiVersion: 3.0.1
Auth:
ApiKeyRequired: true
Variables:
IS_STAGING: false
VARIABLE2: value-a
VARIABLE3: value-a
Models:
Error:
$schema: http://json-schema.org/draft-04/schema#
title: Error Schema
type: object
properties:
message:
type: string
Empty:
$schema: http://json-schema.org/draft-04/schema#
title: Empty Schema
type: object
properties:
message:
type: string
ApiStaging:
Type: AWS::Serverless::Api
Properties:
Name: service-layer-staging-vnull
StageName: Staging
OpenApiVersion: 3.0.1
Auth:
ApiKeyRequired: true
Variables:
IS_STAGING: true
VARIABLE2: value-b
VARIABLE3: value-b
Models:
Error:
$schema: http://json-schema.org/draft-04/schema#
title: Error Schema
type: object
properties:
message:
type: string
Empty:
$schema: http://json-schema.org/draft-04/schema#
title: Empty Schema
type: object
properties:
message:
type: string
如果条件 https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-conditions.html#intrinsic-function-reference-conditions-if 可以使用云形成来实现。
这是一个简单的例子:
# Set expected parameter to be passed to sam local
Parameters:
Stage:
Type: String
Default: staging
Description: Parameter for getting the deployment stage
# Create a condition based on the parameter
Conditions:
isStagingEnvironment: !Equals
- Ref: Stage
- staging
Resources:
MyFunction:
Type: "AWS::Serverless::Function"
Properties:
Events:
CatchAll:
Type: Api
Properties:
Method: GET
Path: /my-sample-function
# If condition to switch which API to use for this event while invoking the function
RestApiId: !If
- isStagingEnvironment
- !Ref ApiStaging
- !Ref ApiProduction
然后你可以这样运行你本地的sam:
sam local start-api --parameter-overrides Stage=staging
如果每个 API 网关有多个阶段,则可以使用相同的技术。
我创建了一个 SAM template.yaml 文件,其中包含两个 API 网关实例 - 一个用于生产,一个用于暂存。每个阶段都有自己的阶段,分别称为 Production 和 Staging,每个阶段都有自己特定于环境的阶段变量。
我在本地构建的应用程序是使用 AWS SAM CLI 创建的,我一直在使用命令 'sam local start-api' 到 运行 API 网关的本地实例在邮递员中测试调用端点 - 一直运行良好。不幸的是,我现在需要开始测试需要阶段变量的端点,而且我看不到任何方式告诉 SAM CLI 模仿模板文件中的两个 API 网关实例中的哪一个。显然我不希望它使用 Production 因为它将有连接到实时服务的数据。
我知道我可以创建一个包含两个阶段的 API 网关实例,因此,如果没有办法执行上述操作,是否有办法获取SAM 改为使用 API 网关实例中的特定阶段?下面是我的模板文件中的一个片段。
ApiProduction:
Type: AWS::Serverless::Api
Properties:
Name: service-layer-production-v1
StageName: Production
OpenApiVersion: 3.0.1
Auth:
ApiKeyRequired: true
Variables:
IS_STAGING: false
VARIABLE2: value-a
VARIABLE3: value-a
Models:
Error:
$schema: http://json-schema.org/draft-04/schema#
title: Error Schema
type: object
properties:
message:
type: string
Empty:
$schema: http://json-schema.org/draft-04/schema#
title: Empty Schema
type: object
properties:
message:
type: string
ApiStaging:
Type: AWS::Serverless::Api
Properties:
Name: service-layer-staging-vnull
StageName: Staging
OpenApiVersion: 3.0.1
Auth:
ApiKeyRequired: true
Variables:
IS_STAGING: true
VARIABLE2: value-b
VARIABLE3: value-b
Models:
Error:
$schema: http://json-schema.org/draft-04/schema#
title: Error Schema
type: object
properties:
message:
type: string
Empty:
$schema: http://json-schema.org/draft-04/schema#
title: Empty Schema
type: object
properties:
message:
type: string
如果条件 https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-conditions.html#intrinsic-function-reference-conditions-if 可以使用云形成来实现。
这是一个简单的例子:
# Set expected parameter to be passed to sam local
Parameters:
Stage:
Type: String
Default: staging
Description: Parameter for getting the deployment stage
# Create a condition based on the parameter
Conditions:
isStagingEnvironment: !Equals
- Ref: Stage
- staging
Resources:
MyFunction:
Type: "AWS::Serverless::Function"
Properties:
Events:
CatchAll:
Type: Api
Properties:
Method: GET
Path: /my-sample-function
# If condition to switch which API to use for this event while invoking the function
RestApiId: !If
- isStagingEnvironment
- !Ref ApiStaging
- !Ref ApiProduction
然后你可以这样运行你本地的sam:
sam local start-api --parameter-overrides Stage=staging
如果每个 API 网关有多个阶段,则可以使用相同的技术。