2015-09-28 16 views
20

API Gateway (APIG), mentre utilizza CloudFront (CF) non supporta la cache del bordo CDN. Quando ho configurato una distribuzione CF per utilizzare APIG come origine personalizzata, ottengo un errore di autorizzazione negato.Come si aggiunge CloudFront davanti al gateway API

Come configuro CF per risolvere questo problema?

risposta

39

Fino a quando API Gateway (APIG) supporta il caching periferico tramite il suo uso interno di CloudFormation (CF), ho trovato una soluzione alternativa.

Si può effettivamente mettere CF dist davanti a APIG, il trucco è forzare HTTPS solo "Policy protocollo Viewer" E non inoltrare l'intestazione HOST perché APIG ha bisogno di SNI.

Ho impostato il mio CF "Impostazioni comportamento cache predefinito" per non inoltrare alcuna intestazione e forzato "Policy protocollo Viewer" su "Solo HTTPS" e funziona. Spero che questo aiuti gli altri.

Ecco un oggetto risorsa CloudFormation che ha tutta la configurazione richiesta:

{ 
    "Type": "AWS::CloudFront::Distribution", 
    "Properties": { 
    "DistributionConfig": { 
     "Origins": [ 
     { 
      "Id": "pushchansearch", 
      "DomainName": "myapig.execute-api.us-east-1.amazonaws.com", 
      "CustomOriginConfig": { 
      "HTTPPort": "80", 
      "HTTPSPort": "443", 
      "OriginProtocolPolicy": "match-viewer" 
      }, 
      "OriginPath": { 
      "Fn::Join": [ 
       "", 
       [ 
       "/", 
       { 
        "Ref": "aaStage" 
       } 
       ] 
      ] 
      } 
     } 
     ], 
     "Enabled": true, 
     "Comment": "Push channel search", 
     "PriceClass": "PriceClass_100", 
     "DefaultCacheBehavior": { 
     "AllowedMethods": [ 
      "GET", 
      "HEAD", 
      "OPTIONS" 
     ], 
     "CachedMethods": [ 
      "HEAD", 
      "GET" 
     ], 
     "ForwardedValues": { 
      "QueryString": true, 
      "Headers": [], 
      "Cookies": { 
      "Forward": "none" 
      } 
     }, 
     "MinTTL": "0", 
     "TargetOriginId": "pushchansearch", 
     "ViewerProtocolPolicy": "https-only" 
     }, 
     "CustomErrorResponses": [ 
     ] 
    } 
    } 
} 
+0

È possibile utilizzare modelli di percorso con questo? Ho una configurazione di distribuzione del cloudfront con due origini: un bucket S3 per i miei file statici e un'API APIG; ma il mio PathPattern per l'APIG non si attiva. Penso che sia perché non sto corrispondendo su un nome o tipo di file, ma piuttosto su un percorso particolare. Il gateway API –

+8

utilizza CloudFront dietro le quinte. Se punti un'altra distribuzione CloudFront al tuo endpoint Gateway API, CloudFront blocca la richiesta perché CloudFront ha un controllo anti-loopback. Cioè Non puoi puntare a CloudFront su CloudFront. A AWS re: Invent 2015 mi è stato detto da un ingegnere AWS che questo controllo anti-loopback sarà semplificato per consentire di puntare una distribuzione CloudFront al gateway API. Non ho ancora verificato se funziona ancora. – Jamey

+0

Ho appena provato e ora funziona, 'arriccia https: // api.cloudprowess.com' per vederlo in azione. Lo faccio per poter impostare un dominio personalizzato che utilizza un certificato SSL rilasciato da AWS Certificate Manager, che non sarebbe altrimenti disponibile per il mio gateway API. La mia domanda ora è se questo mi costerà due volte per la larghezza di banda e le richieste di CloudFront, o se i costi entro CloudFront saranno pari a zero, lo chiedo come una nuova domanda. –

1

Se gateway API restituisce un errore 403 con:

intestazione di autorizzazione richiede parametro 'Credential'. L'intestazione dell'autorizzazione richiede il parametro 'Firma'. L'intestazione dell'autorizzazione richiede il parametro "SignedHeaders". L'intestazione dell'autorizzazione richiede l'esistenza di o un'intestazione "X-Amz-Date" o "Date".

può anche essere che il punto di origine non è corretto. Stranamente, "Gateway API considera tutti gli errori su percorsi inesistenti come errore 403 negato, piuttosto che un errore 404 non trovato." (vedi this support thread).

Ho ricevuto questo errore e ho assunto che stavo inoltrando erroneamente l'intestazione Autorizzazione, ma ho semplicemente configurato erroneamente il percorso di origine.

Problemi correlati