AWS SAM -将Lambda授权器添加到现有API



我有一个AWS SAM应用程序,我想将Lambda Authorizer添加到当前API网关中的一些路由中。

所有模板。Yaml示例有相同的授权模板:

protectedApi:
Type: AWS::Serverless::HttpApi
Auth: 
Authorizers:
LambdaAuthorizer:
AuthorizerPayloadFormatVersion: 2.0
FunctionArn: ...
FunctionInvokeRole: ...
Identity:
Headers:
- Authorization

但是,这不会在相同的API id中创建授权器,而是创建一个全新的API。我所有的路线和集成都没有了。另外,新的API有一个不同的调用URL

我还尝试通过API管理屏幕手动添加授权器,但随后授权器定义及其集成在一段时间后消失。(我不知道为什么)

有没有人对我如何使用template.yaml将授权器添加到我当前的API网关有一个想法?正确的格式是什么?

或者如何防止手动添加时集成消失?

感谢

我建议解决API阶段和API本身被意外替换的问题的一种方法是使用自定义域名作为抽象层。这需要您拥有一个域,并且可以控制哪个映射到AWS API网关自定义域名(可以在template.yaml中轻松配置),然后映射到您的API。

作为题外话,我可能还建议不要通过AWS控制台直接对您的堆栈进行更改(除非必要&然后理想情况下也反映在template.yaml中),因为你可能会在你的模板中进入"漂移状态"。yaml和stack已经更改,AWS可能不知道下次部署更改时如何解决这些差异,这可能会删除一些资源以尝试解决差异。您目前正在通过IaC(基础设施即代码)和AWS SAM (AWS推荐的方法)正确地执行此操作

AWS API网关自定义域名在底层提供了一个负载均衡器,它提供了一个DNS可以指向的静态端点,AWS管理自定义域名到API资源的映射,所以如果AWS需要替换任何被映射到的资源,这并不重要,所以你已经创建了一个抽象层来安全应对这个问题。

关于自定义域名的更多信息:https://docs.aws.amazon.com/apigateway/latest/developerguide/how-to-custom-domains.html

那么,流将是:

子域在您控制的域上->API网关自定义域名->AWS API网关->λ(处理路线)

主Co域下的子域示例可能是:https://some-service-name-api.your-co-website.com或https://api.your-co-website.com/some-api-path(使用可选路径映射)

映射你的域名->您的AWS自定义域名资源,您将需要在您的公司DNS中创建CNAME记录(例如在route 53或任何管理它的地方)。

为了让AWS知道您可以控制该域(并为https提供SSL),您需要在与API相同的区域的AWS证书管理器中创建证书。然后,您可以将该证书作为CNAME添加到域DNS中,以验证您可以控制域

步骤全文:

  1. 在与您的堆栈相同的区域中创建证书(通过AWS控制台轻松执行此操作)。您还需要顶级域和添加任何子域可能需要包括cert。注意,它会说"待确认",直到你完成步骤2。
  2. 为您刚刚创建的证书添加CNAME和CNAME值(可能需要多个子域)作为CNAME记录来证明您控制该域,它将看起来像:_6c7353b72be1c1b5d262839c123456789.your-domain.com值:_0833d6c57a7a5b8123456789.zzhfktmlwt.acm-validations。当正确完成时,记录上的"Pending Validation"将变为"Success",然后您可以移动到步骤3。
  3. 将以下内容添加到模板中(当然,在需要的地方使用更新的名称!)并部署堆栈
  4. 一旦堆栈被部署,转到API网关和自定义域名,找到新创建的自定义域名,你会看到API网关域名(负载平衡器名称)名称已被配置。为子domain.your-domain.com添加一个CNAME记录。API网关自定义域名
Resources:
protectedApi:
Type: AWS::Serverless::Api
Properties:
StageName: your-stage-name
Auth:
# DefaultAuthorizer: NONE
DefaultAuthorizer: AWS_IAM
Authorizers:
LambdaAuthorizer:
FunctionPayloadType: REQUEST
FunctionArn: !GetAtt LambdaAuthorizer.Arn
Identity:
Headers:
- Authorization
CustomDomainName:
Type: AWS::ApiGateway::DomainName
Properties:
RegionalCertificateArn: arn:aws:acm:eu-west-2:621234567874:certificate/12345678
DomainName: my-api.your-domain.com
SecurityPolicy: TLS_1_2
EndpointConfiguration:
Types:
- REGIONAL
Tags:
- Key: PROJECT
Value: "Example auth API with custom domain name"
- Key: PROVISIONEDBY
Value: "SAM/ CLOUDFORMATION"
DependsOn:
- protectedApi # this ensures that your API is provisioned first
PathMappings:
Type: AWS::ApiGateway::BasePathMapping
Properties:
DomainName: !Ref CustomDomainName
RestApiId: !Ref protectedApi
Stage: your-stage-name

您现在应该能够安全地进行修改,并且您的端点始终保持固定例如https://my-api.your-domain.com/some-route

最新更新