【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.)