簡體   English   中英

AWS SAM - 將 Lambda 授權方添加到現有 API

[英]AWS SAM - Add Lambda Authorizer To Existing API

我有一個 AWS SAM 應用程序,我想將 Lambda Authorizer 添加到我當前 API 網關中的一些路由。

所有 template.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和堆棧已更改,AWS 可能不知道如何在您下次部署更改時解決這些差異,這些更改可能會刪除一些資源以嘗試解決差異。您當前通過 IaC(基礎設施即代碼)和 AWS SAM 正確執行此操作是 AWS 推薦的方法)

AWS API 網關自定義域名在引擎蓋下提供了一個負載均衡器,它提供了一個 static 端點,您的 DNS 可以指向該端點,AWS 管理自定義域名到 API 資源的映射,因此 AWS 是否隨后無關緊要需要替換它映射到的任何資源,因此您已經創建了一個抽象層來解決這個問題。

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

因此,流程將是:

您控制的域上的子域 -> API 網關自定義域名 -> AWS API 網關 -> lambdas(處理路由)

您的主 Co 域下的示例子域可能是: https://some-service-name-api.your-co-website.comhttps://api.your-co-website.com/some-api -path (帶有替代路徑映射)

要 map 您的域名 -> 您的 AWS 自定義域名資源,您將需要在您的公司 DNS 中創建一個 CNAME 記錄(例如,在路由 53 或任何它被管理的地方)。

為了讓 AWS 知道您可以控制該域(並為 https 提供 SSL),您需要在與 API 相同區域的 AWS Cert Mgr 中創建一個證書。然后您將能夠將該證書添加到您的域 DNS 中,如下所示用於驗證您可以控制域的 CNAME

完整步驟:

  1. 在與您的堆棧相同的區域中創建證書(通過 AWS 控制台輕松執行此操作)。 您將需要頂級域名,並添加您可能想要包含在該證書中的任何子域名。 注意 - 在您完成第 2 步之前,它會顯示“等待驗證”。
  2. 為您剛剛創建的證書(子域可能需要多個)添加 CNAME 和 CNAME 值作為 CNAME 記錄,以證明您控制該域,例如:名稱:_6c7353b72be1c1b5d262839c123456789.your-domain .com 值:_0833d6c57a7a5b8123456789.zzhfktmlwt.acm-validations.aws(正確完成后,記錄上的“待驗證”將更改為“成功”,然后您可以轉到步驟 3。
  3. 將以下內容(當然需要更新名稱)添加到您的 template.yaml 並部署堆棧
  4. 部署堆棧后,轉到 API 網關和自定義域名,找到新創建的自定義域名,您將看到已配置的 API 網關域名(負載均衡器名稱)名稱。 為您的子域添加 CNAME 記錄.your-domain.com -> 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM