Webserver.tips

Mit Nginx auf AWS S3 per VPC zugreifen

nginx als Gateway

Amazons AWS S3 ist eine günstige Speichermöglichkeit für Daten. Durch das klar definierte Protokoll für den Zugriff ist die Verwaltung deutlich einfacher, als Dateien in einer EC2-Instanz zu verwalten. Nicht immer möchte man die Daten jedoch komplett für die Öffentlichkeit freigeben. Wenn man z.B. Nginx in einer EC2-Instanz einsetzt, dann möchte man den Webserver vielleicht auch als Reverse Proxy für die Daten in S3 nutzen. Damit kann man dann z.B. die vielfältigen Möglichkeiten von Nginx zur URL-Manipulationen nutzen und so einen einheitlichen URL-Space zur Verfügung stellen. Mit dieser Konstellation kann man die AWS-eigene VPC (Virtual Private Cloud), also das VPN innerhalb von AWS nutzen, um sicher auf die Daten in S3 zuzugreifen.

Einen VPC Endpoint einrichten

Wenn man einen S3 Bucket eingerichtet hat, dann erstellt man zunächst eine VPC-Endpoint für S3. Dazu wählt man in der VPC Management Console "Endpoints" aus und klickt dann "Create Endpoint". Nun muss man noch das gewünschte VPC auswählen und kann entweder Vollzugriff aus dem VPC gewähren, oder eine eigene Policy angeben. In den meisten Fällen ist es ausreichend sicher, hier Vollzugriff zu gewähren und den Zugriff auf S3-Ressourcen mit den S3-Permissions zu steuern.

S3 Permissions konfigurieren

Den Zugriff auf die S3-Ressourcen steuert man am günstigsten per Bucket-Policy. Wenn man in der S3-Konsole einen Bucket auswählt, dann kann man unter "Permissions" auf "Edit bucket policy" klicken und diese entsprechend erstellen.

Sie kann zum Beispiel so aussehen:

{
  "Version": "2012-10-17",
  "Id": "Policy1465980372930",
  "Statement": [
    {
      "Sid": "Allow-specific-VPC",
      "Effect": "Allow",
      "Principal": "*",
      "Action": "s3:*",
      "Resource": [
        "arn:aws:s3:::examplebucketname/*",
        "arn:aws:s3:::examplebucketname"
      ],
      "Condition": {
        "StringEquals": {
          "aws:sourceVpc": "vpc-01234567"
        }
      }
    }
  ]
}

Bei diesem Beispiel wird dem VPC "vpc-01234567" Vollzugriff ("s3:*") auf den Bucket "examplebucketname" eingeräumt. Den VPC-Namen für das eigenen VPC kann man übrigens leicht über die VPC Management Console herausbekommen.

Die Policy kann man auch über die Kommandozeile konfigurieren:

aws s3api put-bucket-policy --bucket examplebucketname --policy "{\"Version\":\"2012-10-17\", ...}"

Dabei muss man darauf achten, dass man alle Anführungszeichen per Backslash escaped.

Ausprobieren kann man das Ganze dann zunächst von der Konsole einer EC2-Instanz, die sich im VPC befindet. Dazu lädt man z.B. eine Testdatei in den Bucket und versucht dann, per HTTPS darauf zuzugreifen:

curl https://s3-eu-west-1.amazonaws.com/examplebucketname/test.txt

Hier sollte der Dateiinhalt erscheinen und keine Fehlermeldung.

Jetzt die gleiche URL nochmal in einem Browser ausprobieren. Das sollten dann zu einer Fehlermeldung führen und damit ist alles richtig konfiguriert.

Jetzt kann man in Nginx beliebige Locations konfigurieren, die per proxy_pass-Direktive auf S3 zugreifen:

location /a/nice/location/s3key1/s3key2 {
  rewrite ^/a/nice/location/(.*) /examplebucketname/$1 break;
  proxy_ssl_server_name on;
  proxy_pass https://s3-eu-west-1.amazonaws.com;
}
@Digitalkapitaen

Ein Projekt von Digital Sailors