2016-12-12 19 views
1

コンテキストAWS APIゲートウェイは、X-AMZN-ERRORTYPEと403を返す:AccessDeniedExceptionヘッダ

IはAWSトリオで構築されたサーバレスWebアプリケーション有する:APIゲートウェイ+ラムダ+ DynamoDBのを。 アプリの最初のページは2つのhttpリクエストを送信してデータを取得し、回答を結合して結果を出力します。

  /APIGateway /projects  => Lambda (DynamoDB request) \ 
web app => {               } => display data 
      \ APIGateway /organizations => Lambda (Github API request)/

問題

すべては、私がページを求める初めての罰金行きます。しかし、このページを更新しようとすると/organizationsリクエストで403エラーが発生します。そこから、3〜5分待ってからもう一度ページをリフレッシュすると、すべてのデータが正しく表示され、ページが完全に表示されます。場合によっては、GET /organizationsが失敗し、時にはGET /projectsです。

ページを正しく更新できるようにするために、なぜ私は待つ必要がありますか?どうすれば修正できますか?私はOPTIONS /organizations要求

  • から200 OK応答を取得
    • 追加情報私はこの403エラーを持っている

      は、...私は全然GET /organizations要求が表示されませんクラウドウォッチログ(リクエストはありますが、GETはありません)

    • レスポンスヘッダは以下のとおりです。

      Connection:keep-alive 
      Content-Length:60 
      Content-Type:application/json 
      Date:Mon, 12 Dec 2016 11:31:29 GMT 
      Via:1.1 af2dd53407c5eae7ddf5c44e27a5dd1b.cloudfront.net (CloudFront) 
      X-Amz-Cf-Id:Kl1JS1ZCCJuGAmydXv3qDoq3E-rFZrlZbs8Bgvw8RSrb8xsjEyAJNQ== 
      x-amzn-ErrorType:AccessDeniedException 
      x-amzn-RequestId:8689b86c-c05e-11e6-b851-7ff70d9a3125 
      X-Cache:Error from cloudfront 
      

      私はクロームコンソールでCORSエラーを持っている

    • (私はx-amzn-ErrorType:AccessDeniedExceptionX-Cache:Error from cloudfrontを持っている理由を知らない):

      XMLHttpRequest cannot load https://********.execute-api.eu-central-1.amazonaws.com/prod/organizations. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:3000' is therefore not allowed access. The response had HTTP status code 403. 
      

      (...たとえCORSが有効で、Access-Control-Allow-Origin:*OPTIONS応答ヘッダーに存在しても)

    ありがとうございました!

  • +0

    ねえシルヴァンは、あなたがこれを引き起こして問題を見つけましたか?私はこれに少しでも取り組んでいます。 – Jeremiah

    答えて

    4

    この問題の原因は、特定のリソースのカスタムポリシーを生成していたカスタムオーソライザでした。このポリシーがキャッシュされると、2番目の要求が到着すると、前回生成された要求と一致せず、エラーが返されます。

    回避策:

    • は、左ペインで承認者を選択して、カスタム承認者
    • を選択
    • 、あなたのAPIをクリックし
    • 、APIゲートウェイサービスにAWSコンソールを開き、キャッシュを無効にします

    結果TTL秒数、タイプをクリックし、をクリックします。さて、あなたはあなたの変更を公開するためにあなたのAPIを配備する必要があります。左ペインにあるとアクションドロップダウンメニューでRessourcesメニューの

    • クリックし、展開のAPIをクリックし
    • のステージを選択あなたのポリシーを改善 :と展開

    ソリューションをクリックしてください3210
    def generatePolicy(principalId, context): 
        return { 
        'principalId': principalId, 
        'policyDocument': { 
         'Version': '2012-10-17', 
         'Statement': [{ 
          'Action': 'execute-api:Invoke', 
          'Effect': 'Allow', 
          'Resource': 'arn:aws:execute-api:eu-central-1:123456789012:abcdefghij/prod/*' 
         }] 
        }, 
        'context': context 
        } 
    

    あなたは、アレイでリソース財産でより正確にすることができます

    'Resource': [ 
        'arn:aws:execute-api:eu-central-1:123456789012:abcdefghij/prod/GET/projects', 
        'arn:aws:execute-api:eu-central-1:123456789012:abcdefghij/prod/GET/user', 
        ... 
    ] 
    

    あなたはressourcesのスーパーセットを許可し、特定のものを拒否することができます。

    は@Jeremiahのリンクで見てください:https://forums.aws.amazon.com/thread.jspa?threadID=225934&tstart=0

    関連する問題