동일한 VPC의 Lambda 및 API Gateway에서 User : anonymous is not authorized to perform : execute-api : Invoke on resource

Sep 14 2020

AWS의 일반적인 리소스 정책과 권한에 대해 배우려고합니다. 쉬운 일로 시작된 API 게이트웨이는 동일한 VPC에있는 다른 리소스를 제외한 모든 리소스에 대한 액세스를 거부한다는 생각은 악몽으로 끝났습니다.

내가 원하는 것 : 동일한 VPC의 리소스에 대한 트래픽 / 호출 만 허용하는 API.

그래서 2 개의 서브넷과 개방형 보안 그룹을 생성했습니다 (테스트 목적으로 만 모든 트래픽 인바운드 및 아웃 바운드).

Lambda 함수 및 다른 lambda 함수에 통합 된 API 게이트웨이를 생성하고 해당 VPC에 배포했습니다.

API Gateway에는 하나의 리소스 / hi가 있으며 GET 만 허용합니다. 해당 경로에 도달하면 간단한 메시지 인 Hi를 반환하는 Lambda로 프록시됩니다.

다른 람다 (동일한 VPC에 있음)는 API를 호출하고 오류 또는 응답을 반환합니다.

지금까지 모든 것이 잘 작동합니다. 람다 함수는 람다를 poxies하고 Hi를 반환하는 API 게이트웨이에 도달합니다.

그러나 내가 말했듯이 권한을 가지고 놀고 싶습니다. 그래서 둘 다 상주하는 VPC에 대한 API Gateway 호출을 잠그기로 결정했습니다.

그래서이 리소스 정책을 API Gateway에 추가했습니다.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Deny",
            "Principal": "*",
            "Action": "execute-api:Invoke",
            "Resource": "arn:aws:execute-api:us-east-1:account-id:api-id/*/*/*",
            "Condition": {
                "StringNotEquals": {
                    "aws:sourceVpc": "vpc-id"
                }
            }
        },
        {
            "Effect": "Allow",
            "Principal": "*",
            "Action": "execute-api:Invoke",
            "Resource": "arn:aws:execute-api:us-east-1:account-id:api-id/*/*/*"
        }
    ]
}

그런 다음 람다 (API Gateway를 호출하는 서비스가 아닌 경우 서비스의 일부가 아님)로 이동하여 관리 형 정책을 추가합니다.

  • AWSLambdaVPCAccessExecutionRole
  • 또한 리소스 arn : aws : execute-api : us-east-1 : account-id : api-id / / / *에서 execute-api : Invoke를 허용하는 인라인 정책

람다 함수를 다시 실행하면 (이전에 API 게이트웨이와 더미 API 모두에서 작동했습니다. https://jsonplaceholder.typicode.com/) 다음과 같은 오류가 발생합니다.

INFO    json {
  Message: 'User: anonymous is not authorized to perform: execute-api:Invoke on resource: arn:aws:execute-api:us-east-1:account-id:api-id/dev/GET/hi with an explicit deny'
}

API Gateway에서 리소스 정책을 제거하면 다시 작동합니다 ... 추가하자마자 동일한 오류가 검색됩니다.

왜 이런 일이 일어나는지 아는 사람이 있습니까? 나는 미쳐 가고있다. 도움을 주시면 감사하겠습니다.


에디션 : IAM 역할 및 리소스 정책 시도

나는 또한 역할을 사용하려고 노력했습니다. 이를 위해 API에서 다음 리소스 정책을 설정했습니다.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::account-id:role/my-role-for-API-Gateway"
            },
            "Action": "execute-api:Invoke",
            "Resource": "arn:aws:execute-api:us-east-1:account-id:api-id/*/*/*"
        }
    ]
}

그런 다음 해당 역할을 내 람다 함수 (API를 호출 할 수 있어야하는 함수)에 연결했습니다. 중요 : 해당 람다는 서비스의 일부가 아닙니다. 서비스의 일부인 람다에 대한 요청을 프록시하는 API 게이트웨이를 호출 할 수 있어야하는 별도의 Lambda입니다.

해당 역할에 다음 정책을 첨부했습니다.

  • AWSLambdaVPCAccessExecutionRole (동일한 VPC 내에서도 시도했기 때문에)
  • AmazonAPIGatewayInvokeFullAccess (아무것도 누락되지 않았는지 확인하기위한 개방 권한)
  • 리소스 ARN에 의한 API 호출을 허용하는 인라인 정책 : arn : aws : execute-api : us-east-1 : account-id : api-id / / / *

나는 가능성을 소진시키기 위해 AdministratorAccess를 해당 역할에 부여하려고 시도했습니다.

API Gateway 콘솔을 통해 테스트하고 적절한 콘솔을받습니다. Lambda 콘솔을 통해 테스트 할 때 다음 오류가 발생합니다.

INFO    json {
  Message: 'User: anonymous is not authorized to perform: execute-api:Invoke on resource: arn:aws:execute-api:us-east-1:account-id:api-id/dev/GET/hi'
}

따라서이 블록에 대한 질문은 람다가 갖는 특정 역할에 대한 액세스를 제한하는 API 게이트웨이를 어떻게 람다가 호출 할 수 있는가입니다.

답변

1 Marcin Sep 14 2020 at 05:52

문제의 일부는 aws:SourceVpc조건이 비공개 API 에만 사용될 수 있다는 것 입니다. 에서 문서 :

aws : SourceVpc-이 키는 프라이빗 API에만 사용할 수 있습니다 .

지역 API를 사용하고 있으므로 StringNotEquals작동하지 않으며 명시 적 거부가 발생 합니다.

을 사용하려면 aws:SourceVpcapi를 비공개 API로 수정해야합니다. 그러나 리소스 기반 정책에 대한 유일한 학습 경험 인 경우이를 학습하는 가장 간단한 방법은 버킷 정책 을 사용하는 것입니다 .