![](/img/trans.png)
[英]AWS API Gateway + Cognito + Lambda - $context.authorizer.principalId empty
[英]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.com或https://api.your-co-website.com/some-api -path (帶有替代路徑映射)
要 map 您的域名 -> 您的 AWS 自定義域名資源,您將需要在您的公司 DNS 中創建一個 CNAME 記錄(例如,在路由 53 或任何它被管理的地方)。
為了讓 AWS 知道您可以控制該域(並為 https 提供 SSL),您需要在與 API 相同區域的 AWS Cert Mgr 中創建一個證書。然后您將能夠將該證書添加到您的域 DNS 中,如下所示用於驗證您可以控制域的 CNAME
完整步驟:
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.