API Gateway에서 "Lambda 인증자"와 "API 키 인증"을 함께 사용
소개
타이틀대로, API Gateway에서 Lambda 오소라이저와 API 키를 동시에 설정해 보았으므로, 그 정리입니다.
Lambda 권한 부여자는
Lambda 권한 부여자(이전 사용자 지정 권한 부여자)는 Lambda 함수를 사용하여 API에 대한 액세스를 제어하는 API Gateway의 기능입니다.
이 논문에서는 설명하지 않으므로 자세한 내용은 공식 문서을 참조하십시오.
지금까지, API Gateway의 API 키와, Lambda 오소라이저를 각각 한쪽씩 이용한 적이 있었습니다만. 이번, API 실행수의 제어를 실시하면서, 인가를 할 필요가 있었기 때문에 동시에 이용하기로 했습니다.
Lambda 권한 부여자
package main
import (
"context"
"errors"
"fmt"
"github.com/aws/aws-lambda-go/events"
"github.com/aws/aws-lambda-go/lambda"
)
// Help function to generate an IAM policy
func generatePolicy(principalId, effect, resource string) events.APIGatewayCustomAuthorizerResponse {
authResponse := events.APIGatewayCustomAuthorizerResponse{PrincipalID: principalId}
if effect != "" && resource != "" {
authResponse.PolicyDocument = events.APIGatewayCustomAuthorizerPolicy{
Version: "2012-10-17",
Statement: []events.IAMPolicyStatement{
{
Action: []string{"execute-api:Invoke"},
Effect: effect,
Resource: []string{resource},
},
},
}
}
return authResponse
}
func handleRequest(ctx context.Context, event events.APIGatewayCustomAuthorizerRequestTypeRequest) (events.APIGatewayCustomAuthorizerResponse, error) {
if cookie, ok := event.Headers["Cookie"]; ok {
// ここで認可処理をおこなう。例としてCookieを取得している
fmt.Print("cookie: " + cookie)
} else {
return events.APIGatewayCustomAuthorizerResponse{}, errors.New("Unauthorized")
}
return generatePolicy("user", "Allow", event.MethodArn), nil
}
func main() {
lambda.Start(handleRequest)
}
처리 흐름
실제로 동작시켜 확인한 처리 플로우는 이렇게 되었습니다.
처리되는 순서로서는, Lambda 오소라이저→API 키 인증이라고 하게 되었습니다.
검증 전의 예상에서는, API 키 인증→Lambda 오소라이저의 순서가 되어 생각하고 있었으므로, 조금 의외였습니다.
이는 API 키가 인증에 사용하는 것이 아니라 고객에게 '요청 속도와 할당량'을 제공하기 위한 키라는 위치이기 때문이라고 생각됩니다.
만약 오소라이저(허가)로 연주된 경우는 API 키 인증까지 도달하지 않기 때문에, APIGateway의 사용량 플랜으로 설정한 할당량이 낭비 소비되지 않습니다. (훌륭함)
요약
package main
import (
"context"
"errors"
"fmt"
"github.com/aws/aws-lambda-go/events"
"github.com/aws/aws-lambda-go/lambda"
)
// Help function to generate an IAM policy
func generatePolicy(principalId, effect, resource string) events.APIGatewayCustomAuthorizerResponse {
authResponse := events.APIGatewayCustomAuthorizerResponse{PrincipalID: principalId}
if effect != "" && resource != "" {
authResponse.PolicyDocument = events.APIGatewayCustomAuthorizerPolicy{
Version: "2012-10-17",
Statement: []events.IAMPolicyStatement{
{
Action: []string{"execute-api:Invoke"},
Effect: effect,
Resource: []string{resource},
},
},
}
}
return authResponse
}
func handleRequest(ctx context.Context, event events.APIGatewayCustomAuthorizerRequestTypeRequest) (events.APIGatewayCustomAuthorizerResponse, error) {
if cookie, ok := event.Headers["Cookie"]; ok {
// ここで認可処理をおこなう。例としてCookieを取得している
fmt.Print("cookie: " + cookie)
} else {
return events.APIGatewayCustomAuthorizerResponse{}, errors.New("Unauthorized")
}
return generatePolicy("user", "Allow", event.MethodArn), nil
}
func main() {
lambda.Start(handleRequest)
}
처리 흐름
실제로 동작시켜 확인한 처리 플로우는 이렇게 되었습니다.
처리되는 순서로서는, Lambda 오소라이저→API 키 인증이라고 하게 되었습니다.
검증 전의 예상에서는, API 키 인증→Lambda 오소라이저의 순서가 되어 생각하고 있었으므로, 조금 의외였습니다.
이는 API 키가 인증에 사용하는 것이 아니라 고객에게 '요청 속도와 할당량'을 제공하기 위한 키라는 위치이기 때문이라고 생각됩니다.
만약 오소라이저(허가)로 연주된 경우는 API 키 인증까지 도달하지 않기 때문에, APIGateway의 사용량 플랜으로 설정한 할당량이 낭비 소비되지 않습니다. (훌륭함)
요약
참고
Reference
이 문제에 관하여(API Gateway에서 "Lambda 인증자"와 "API 키 인증"을 함께 사용), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/yaguchii/items/d38d3203b611c6a15066
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Reference
이 문제에 관하여(API Gateway에서 "Lambda 인증자"와 "API 키 인증"을 함께 사용), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/yaguchii/items/d38d3203b611c6a15066텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)