【AWS】API Gateway Lambda 권한 부여자 "User is not authorized to access this resource"에러의 원인과 대응
6695 단어 APIGateway람다AWS
위의 APIGateway로 구축된 API에 Lambda 권한 부여자를 적용할 때 올바른 자격 증명, 올바른 AWS 리소스에 대한 액세스 권한을 설정했음에도 불구하고 "User is not authorized to access this resource"오류 가 발생할 수 있습니다.
본 기사에서는 그 원인과 대응을 기재합니다.
원인
Lambda 권한 부여자로부터 반환된 권한 정보의 캐싱으로 인해 발생합니다.
다음과 같은 액세스 정책을 반환하는 코드를 작성할 때 발생합니다.
node.js
...
statementOne.Action = 'execute-api:Invoke';
statementOne.Effect = 'Allow';
// ↓ 以下のアクセス承認するリソースを指定するコードが原因
statementOne.Resource = event.methodArn;
...
포인트는
event.methodArn
입니다.여기에는 호출된 API 전용 Arn이 포함되어 있습니다.
例: arn:aws:execute-api:ap-northeast-1:xxxxxxxxxxx:xxxxxxxxx/stg/GET/users/43/info
이 Arn에 대한 액세스 권한을 부여한 정책을 반환하면 첫 번째 액세스가 작동합니다.
그러나 동일한 Lambda 인증자가 적용된 다른 API를 호출하면 위의 Arn이 포함 된 정책이 캐시로 반환되어 첫 번째 액세스와 다른 권한이없는 리소스에 액세스하면 ""User is not authorized to access this resource"오류가 발생합니다.
대응
2 패턴의 대응 방법이 있습니다.
패턴 1 Lambda 권한 부여자의 인증 캐시의 TTL 값을 0으로 설정
API Gateway 권한 부여자에서 대상 인증자를 선택하고,
TTL을 0으로 변경하면 매번 인증을 수행하기 위해
event.methodArn
를 액세스 권한 부여 리소스로 반환해도 허가없이 문제가 발생합니다.단지 매번 인증 처리가 달리기 때문에 퍼포먼스적으로는 뛰어나지 않습니다.
그 점이 신경이 쓰이는 경우는, 후술의 패턴 2를 이용하는 것을 추천합니다.
※ AWS CloudFormation, AWS SAM을 이용하는 경우의 주의점
CloudFormation, SAM을 사용하여 Lambda 인증자를 구성한 경우 기본적으로 권한 부여 캐시의 TTL 값은 300초입니다.
권한 부여 캐시의 TTL 값을 변경하지 않고 배포 한 권한 부여 자의 설정을 관리 콘솔에서 확인하면 ...
이런 식으로
undefined
가 되어 있어 캐쉬가 무효가 되어 있는 것처럼 보입니다.그러나 실제로는 300초의 캐시 설정이 활성화되어 있습니다.
(이것에 1시간 정도 하메되었습니다...)
TTL을 0으로 설정할 때
ReauthorizeEvery
를 0으로 설정합시다.template.yaml
TestApi:
Type: AWS::Serverless::Api
Properties:
StageName: Prd
Auth:
AddDefaultAuthorizerToCorsPreflight: false
DefaultAuthorizer: MyLambdaCustomAuthorizer
Authorizers:
MyLambdaCustomAuthorizer:
FunctionPayloadType: REQUEST
FunctionArn:
Fn::GetAtt:
- RestApiAuthFunction
- Arn
Identity:
QueryStrings:
- authToken
ReauthorizeEvery: 0
패턴 2 Lambda 권한 부여자 측에서 반환하는 리소스 정책 변경
Lambda 인증자 측에서
event.methodArn
를 지정하는 것이 아니라, 와일드 카드를 지정해 대응하는 방법입니다.node.js
...
statementOne.Action = 'execute-api:Invoke';
statementOne.Effect = 'Allow';
// ↓ ワイルドカード指定に変更
statementOne.Resource = 'arn:aws:execute-api:*';
...
위의 예에서는 모든 Lambda 실행 권한을 반환합니다.
이렇게 하면 정책 캐싱이 발생하더라도 와일드카드에서 허용된 리소스를 문제 없이 호출할 수 있습니다.
어디까지를 와일드 카드 지정으로 할까는, 자신의 시큐러티 폴리시와 상담해 보세요.
캐시와 병용할 수 있기 때문에, 패턴 1보다 퍼포먼스적으로 우수합니다만, 와일드 카드 지정이 되는 분, 시큐러티와 트레이드 오프입니다.
요약
기재 정보에 잘못이 있으면 지적해 주시면 도움이 됩니다.
참고 링크
Reference
이 문제에 관하여(【AWS】API Gateway Lambda 권한 부여자 "User is not authorized to access this resource"에러의 원인과 대응), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/hassoubeat/items/0add09325fbe664e263e텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)