2016-05-18 3 views
1

Ich habe einen S3-Bucket, den ich benutze CloudFront. Und ich möchte einige JSON-Dateien daraus abliefern.Inhaltstyp für bestimmte Dateitypen in Amazon CloudFront hinzufügen?

Standardmäßig enthält die CF-Antwort keine Header Content-Type für diesen Dateityp. Die Datei wird einfach wie jede normale Datei vom Browser heruntergeladen. Ich möchte jedoch, dass es einen richtigen Mime Type Header hat: Content-Type: application/json.

Ich weiß, ich kann benutzerdefinierte Header für jede einzelne Datei manuell in S3 festlegen, ist es jedoch möglich, eine Regel für bestimmte Dateinamenerweiterungen festlegen bestimmte HTTP-Header zur Antwort in Amazon CloudFront hinzufügen?

Antwort

2

Update: CloudFront selbst bietet keinen integrierten Mechanismus zum Bearbeiten von Headern, aber [email protected], in Verbindung mit CloudFront verwendet, bietet einen Mechanismus zum Erstellen von Hooks, die Ursprung Antwortheader überprüfen und ändern können. Es kann den Antworttextkörper nicht tatsächlich untersuchen, aber kann statische oder heuristisch abgeleitete Header injizieren. Dies ist möglicherweise eine praktikable Problemumgehung, wenn der Inhalt aus einer bekannten/vertrauenswürdigen Quelle stammt und der Inhaltstyp bekannt ist, aber nicht für vom Benutzer gesendete Inhalte verwendet werden sollte, da ein falscher Inhaltstyp die Nutzdaten durch einen Browser falsch interpretieren könnte und könnte ein potenzieller Exploit-Vektor sein. Es ist wahrscheinlich immer noch die bessere Lösung, den Inhaltstyp korrekt auf das Objekt zu setzen, wenn es hochgeladen wird.

Die ursprüngliche Antwort hier vor-dates Lambda @ Edge und bezieht sich auf native Funktionen von CloudFront selbst.

CloudFront verwendet die vom Ursprungsserver bereitgestellten Antwortheader, unabhängig davon, ob es sich um S3 oder einen benutzerdefinierten Ursprung handelt. CloudFront bietet keinen Mechanismus, um sie neu zu schreiben oder hinzuzufügen.

Die Lösung besteht darin, die Content-Type auf das Objekt beim ursprünglichen Upload in S3 zu setzen.

Wenn Sie die Datei mit Content-Type in S3 hochladen, wird derselbe Wert zurückgegeben, wenn das Objekt heruntergeladen wird (entweder direkt von S3 oder über CloudFront). Andernfalls müssen Sie Objekte nach dem Hochladen ändern, wenn Sie nicht den Standardkopf Content-Type: application/octet-stream möchten, den S3 zuweist, wenn Sie keinen angeben.

0

Wenn Sie keine Kontrolle darüber, wie Objekte in Ihrer S3 Eimer hochgeladen werden, können Sie eine [email protected] Funktion verwenden, um die Antwort-Header außer Kraft zu setzen, wie folgt:

(Der Nachteil dieser Methode ist, dass es erhöht Latenz und entstehen zusätzliche Kosten)

  1. eine IAM-Richtlinie erstellen, die auf Ihre Lambda-Funktion die Rolle im nächsten Schritt angebracht werden:

    { 
        "Version": "2012-10-17", 
        "Statement": [ 
         { 
          "Sid": "StatementForCloudWatchLogs", 
          "Effect": "Allow", 
          "Action": [ 
           "logs:CreateLogGroup", 
           "logs:CreateLogStream", 
           "logs:PutLogEvents" 
          ], 
          "Resource": "*" 
         }, 
         { 
          "Sid": "StatementForLambdaFunction", 
          "Effect": "Allow", 
          "Action": [ 
           "lambda:EnableReplication", 
           "lambda:GetFunction" 
          ], 
          "Resource": [ 
           "arn:aws:lambda:us-east-1:{YOUR_ACCOUNT_ID}:function:{FUNCTION_NAME}:{FUNCTION_VERSION}" 
          ] 
         }, 
         { 
          "Sid": "StatementForIAMServiceLinkedRoles", 
          "Effect": "Allow", 
          "Action": [ 
           "iam:CreateServiceLinkedRole" 
          ], 
          "Resource": "arn:aws:iam::{YOUR_ACCOUNT_ID}:role/*" 
         }, 
         { 
          "Sid": "StatementForCloudFrontDistributions", 
          "Effect": "Allow", 
          "Action": [ 
           "cloudfront:CreateDistribution", 
           "cloudfront:UpdateDistribution" 
          ], 
          "Resource": "*" 
         } 
        ] 
    } 
    
  2. Erstellen Sie eine neue AAM-Service-IAM-Rolle für Lambda und hängen Sie die in Schritt 1 erstellte Richtlinie an sie an. Unter Vertrauensbeziehungen, stellen Sie sicher, dass Sie beide haben; lambda.amazonaws.com und edgelambda.amazonaws.com als vertrauenswürdige Einheiten.

  3. Erstellen Sie Ihre Lambda-Funktion und veröffentlichen Sie dann eine neue Version (unter Aktionen). Sie müssen Funktionen mit dem Knoten js6 erstellen.10 Laufzeit Eigenschaft:

    'use strict'; 
    
    exports.handler = (event, context, callback) => { 
        const response = event.Records[0].cf.response; 
    
        if (response.status === '200') { 
         response.headers['content-type'] = [{ 
          'value': 'application/json', // <-- Your desired content type. 
          'key': 'Content-Type' 
         }]; 
        } 
    
        callback(null, response); 
    }; 
    
  4. Erstellen Sie ein neues Verhalten für JSON-Dateien in Ihrer Cloudfront-Verteilung (zum Beispiel path/to/your/json/*.json) und sicherstellen, dass es über dem Default (*) Verhalten gesetzt wird.

  5. Unter Lambda-Funktion Verbände für das neu erstellte Verhalten, wählen Sie die Origin Antwort Ereignistyp und die ARN für Ihre Lambda-Funktion eingeben, die in Schritt 3 erstellt wurde: arn:aws:lambda:us-east-1:{YOUR_ACCOUNT_ID}:function:{FUNCTION_NAME}:{FUNCTION_VERSION}. (HINWEIS: Ihre Lambda-Funktion muss in der Region USA Ost (N. Virginia) erstellt werden und die Funktion ARN muss eine nummerierte Version haben und nicht $LATEST oder ein Alias).
  6. Erstellen Sie eine CloudFront-Invalidierung für Ihre path/to/your/json/* Dateien.

Stellen Sie sicher, dass Sie die lesen.

Siehe auch Lambda Event Structure für weitere Informationen.