2016-10-20 4 views
3

다른 관련 질문을 살펴 보았습니다. 사실, 내 질문은 this one과 매우 유사합니다. 단, 400 상태 문제는 없습니다.AWS API 게이트웨이 CORS OPTIONS에 대해 확인, POST에 실패했습니다.

셋업 : 없음, 필요한 API의 KEY : 스테이지에 배치

  • 거짓 테스트

  • 1 리소스 1 POST

    • 람다 함수 API 게이트웨이
    • 권한을 λ를 적분하는 방법.

    • 예를 들어. 곱슬 곱슬 함은 항상 페이로드, 페이로드 등의 유무에 관계없이 200을 반환하므로 참조 된 질문과 다릅니다.

    "CORS 사용"옵션을 사용했습니다.이 옵션을 리소스 및 POST 요청 (및 나중에 API 배포)에 적용 해 보았습니다.

    API GW에서 POST 메서드 - 메서드 응답 영역 아래에 200 응답 헤더에 Access-Control-Allow-Origin이 나열되어 있습니다.

    결과 : Chrome의 클라이언트 코드에서 끝점을 호출하면 OPTIONS가 전달되지만 Access-Control-Allow-Origin 헤더가 없어서 POST가 실패합니다. 컬에서

    : 옵션

    curl -X OPTIONS -H "Access-Control-Request-Method: POST" \ 
        -H "Access-Control-Request-Headers: Content-Type" \ 
        -H "Origin: http://example.com" --verbose <endpoint> 
    

    전화 응답은 다음과 같습니다

    < HTTP/1.1 200 OK 
    < Content-Type: application/json 
    ... 
    < Access-Control-Allow-Headers: Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token 
    < Access-Control-Allow-Methods: POST,OPTIONS 
    < Access-Control-Allow-Origin: * 
    ... 
    

    하지만 POST로 :

    curl -X POST -d '{}' -H "Content-Type: application/json" \ 
        -H "Origin: http://example.com" --verbose <endpoint> 
    

    가 반환

    < HTTP/1.1 200 OK 
    < Content-Type: application/json 
    ... 
    

    및 응답 json 본문 -하지만 Access- 헤더가 없습니다.

    그 밖의 어떤 내용을 확인할 수 있습니까?

  • 답변

    12

    API 게이트웨이가 "Lambda Proxy Integration" 옵션을 검사하여 내 람다 함수를 호출하는 것이 문제였습니다.

    새로 만든 람다 함수에 API 게이트웨이 트리거를 추가 할 때 이것이 기본적으로 활성화된다고 생각합니다.

    API 게이트웨이 - 리소스 - 메서드보기 내부에 "통합 응답"상자가 회색으로 표시되고 거기에 Access-Control-Allow-Origin 헤더를 추가 할 수있는 방법이 없습니다 (CORS 기능 사용 가능). @Abhigna_Nagaraja 필요합니다.

    솔루션 : "람다 프록시 통합"을 사용하는 경우, 귀하의 람다 함수에 'Access-Control-Allow-Origin': '*' 헤더를 추가합니다.

    동일한보기 - 통합 요청에서 "Lambda 프록시 통합"을 해제하고 CORS를 다시 활성화하십시오 (이후에 배포하십시오).

    (다음, 콜백, 대신 { statusCode, headers, body } 개체의 바로 페이로드 JSON을 반환해야합니다.)

    업데이트을 :

    몇 가지 유용한 당신에 대한 여부를 모를 경우 읽기 HTTP 상태 코드 또는 JSON 페이로드에 요청 응답 상태 정보를 반환 :

    http status vs json status

    json status standards

    +1

    나는 새로운 "람다 프록시 통합 (Lambda Proxy Integration)"이 깨 졌다고 믿는다. 그것은 CORS와 완벽하게 통합되지 않았으며 기본 Lambda 트리거 마법사에서도 마찬가지입니다. 지금은 "Lambda Proxy Integration"을 비활성화하고 수동으로 GET/POST 메소드를 생성하여이 문제를 해결할 수있었습니다. – alexcasalboni

    +1

    제 경험상 그 부분이 효과가있었습니다. ANY 메서드는 LPI의 경우 모든 메서드 (POST, GET 등)를 람다에 전달하는 포괄적 인 메서드입니다. 람다가 전혀 문제가 없다면 오류는 오해의 소지가 있습니다. – bebbi

    +0

    "람다 프록시 통합"은 람다 함수의 상태 코드와 응답 헤더를 제어하는 ​​방법입니다. 프록시 통합을 비활성화하면 항상 200 응답 만 반환되며 응답 내용 만 설정할 수 있습니다. 프록시 통합을 사용하도록 설정 한 상태에서 API GW를 사용할 때 필요한대로 람다 내부에 CORS 헤더 설정이 나와 있습니다. (http://docs.aws.amazon.com/apigateway/latest/developerguide/how-to-cors.html) –

    2

    'Enable CORS'옵션은 모든 통합/메소드 응답 헤더 매핑을 설정하는 편리한 도구입니다. 'Enable CORS'를 클릭 한 다음 새 리소스를 추가하면 필요한 설정이 적용되지 않습니다. 당신은 다시 클릭 'CORS 사용'또는 수동 '액세스 제어 - - 원산지 허용'방법 응답 헤더는 방법을 POST하기

  • 추가 '액세스 제어-Allow-

    • 추가로 설정할 수 있습니다 할 수 있습니다 POST에 대한 Origin의 통합 응답 헤더 매핑

    또한 curl로 변경 사항을 테스트하기 전에 API를 배포하는 것을 잊지 마십시오.

  • +0

    당신이 제안한대로 모든 것이 끝났습니다. 그러나 수동 단계로 확인하는 경우 한 가지주의해야합니다. 메서드 응답이 제대로 표시되지만 통합 응답을 보거나 편집 할 수 없습니다. 상자에 "프록시 통합을 응답 변환으로 구성 할 수 없습니다"라고 표시됩니다. 나는 람다 프록시 통합을 사용하고있다. 이것이 제가 보는 이슈와 관련이 있습니까? – bebbi

    +0

    lambda 콜백의 헤더 섹션에 헤더를 추가하여 헤더를 가져올 수있었습니다. 코드와 설정이 엉망인 것처럼 보이기 때문에 CORS가 필요할 때 람다 프록시 통합을 사용하지 않아야한다고 생각합니다. – bebbi

    +0

    LPI의 통합 응답에 CORS 헤더를 추가했는지 확인 했습니까? – bebbi

    관련 문제