Automatisches Deployment von Websites auf AWS S3 mit GitLab CI/CD

App-Experte aus Köln
10. Nov 2022
5 Minuten Lesezeit

Lernen Sie, wie Sie statische Websites automatisch auf AWS S3 mit GitLab CI/CD deployen können. Eine Schritt-für-Schritt-Anleitung für effiziente Deployment-Workflows.


Automatisches Deployment von Websites auf AWS S3 mit GitLab CI/CD

Als App-Agentur aus Köln mit umfassender DevOps-Expertise teilen wir heute unsere bewährte Methode zum automatischen Deployment statischer Websites auf AWS S3 mit GitLab CI/CD. Diese Lösung haben wir für zahlreiche Kundenprojekte implementiert und kontinuierlich optimiert.

Die Kombination von GitLab CI/CD und AWS S3 bietet einen leistungsstarken, kosteneffizienten Weg, um statische Websites automatisch zu deployen. In diesem Artikel führen wir Sie durch den gesamten Prozess - von der Einrichtung der AWS-Infrastruktur bis zur Konfiguration der GitLab CI/CD-Pipeline.

Schritt 1: AWS S3 Bucket einrichten

Zuerst müssen Sie einen S3 Bucket für Ihre Website erstellen:

  1. Melden Sie sich bei der AWS Management Console an
  2. Navigieren Sie zum S3-Service
  3. Klicken Sie auf “Bucket erstellen”
  4. Geben Sie einen eindeutigen Namen ein (idealerweise Ihre Domain, z.B. www.example.com)
  5. Wählen Sie eine Region aus (idealerweise nahe an Ihren Nutzern)
  6. Aktivieren Sie “Static website hosting” unter den Bucket-Eigenschaften
  7. Setzen Sie “index.html” als Index-Dokument und optional “error.html” als Fehlerdokument
  8. Konfigurieren Sie die Bucket-Richtlinie für öffentlichen Zugriff:
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "PublicReadGetObject",
      "Effect": "Allow",
      "Principal": "*",
      "Action": "s3:GetObject",
      "Resource": "arn:aws:s3:::your-bucket-name/*"
    }
  ]
}

Schritt 2: CloudFront-Distribution einrichten (optional, aber empfohlen)

Für bessere Performance und HTTPS-Unterstützung empfehlen wir die Einrichtung einer CloudFront-Distribution:

  1. Navigieren Sie zum CloudFront-Service in der AWS Console
  2. Klicken Sie auf “Create Distribution”
  3. Wählen Sie Ihren S3 Bucket als Origin
  4. Konfigurieren Sie die folgenden Einstellungen:
    • Viewer Protocol Policy: Redirect HTTP to HTTPS
    • Allowed HTTP Methods: GET, HEAD
    • Cache Policy: Managed-CachingOptimized
    • Origin Request Policy: CORS-S3Origin
  5. Setzen Sie “Default Root Object” auf “index.html”
  6. Erstellen Sie die Distribution

Schritt 3: AWS-Zugangsdaten in GitLab einrichten

Für sicheren Zugriff auf AWS müssen Sie Ihre AWS-Zugangsdaten in GitLab speichern:

  1. Erstellen Sie einen IAM-Benutzer in AWS mit den erforderlichen Berechtigungen für S3 und CloudFront
  2. Navigieren Sie zu Ihrem GitLab-Projekt > Settings > CI/CD > Variables
  3. Fügen Sie die folgenden Variablen hinzu:
    • AWS_ACCESS_KEY_ID: Ihr AWS Access Key
    • AWS_SECRET_ACCESS_KEY: Ihr AWS Secret Key
    • AWS_DEFAULT_REGION: Die Region Ihres S3 Buckets
    • BUCKET_NAME: Der Name Ihres S3 Buckets
    • CLOUDFRONT_DISTRIBUTION_ID: Die ID Ihrer CloudFront-Distribution (falls vorhanden)

Stellen Sie sicher, dass Sie die Option “Masked” für sensible Werte aktivieren.

Schritt 4: GitLab CI/CD-Pipeline konfigurieren

Erstellen Sie eine .gitlab-ci.yml-Datei im Stammverzeichnis Ihres Projekts:

image: python:latest

stages:
  - deploy

deploy:
  stage: deploy
  when: always
  before_script:
    - pip install awscli
  script:
    - aws s3 sync ./public s3://${BUCKET_NAME} --delete
    - aws cloudfront create-invalidation --distribution ${CLOUDFRONT_DISTRIBUTION_ID} --paths "/*"
  environment:
    name: ${CI_COMMIT_REF_SLUG}
    url: https://${BUCKET_NAME}
  only:
    - master

Diese einfache Pipeline synchronisiert den Inhalt Ihres public-Verzeichnisses mit dem S3 Bucket und erstellt eine CloudFront-Invalidierung, um sicherzustellen, dass Ihre Änderungen sofort sichtbar sind.

Schritt 4: Pipeline anpassen und erweitern

Je nach Ihren spezifischen Anforderungen können Sie die Pipeline anpassen:

Für React-Anwendungen:

deploy:
  image: node:latest
  stage: deploy
  when: always
  before_script:
    - npm install
    - npm run build
    - pip install awscli
  script:
    - aws s3 sync ./build s3://${BUCKET_NAME} --delete
    - aws cloudfront create-invalidation --distribution ${CLOUDFRONT_DISTRIBUTION_ID} --paths "/*"
  environment:
    name: ${CI_COMMIT_REF_SLUG}
    url: https://${BUCKET_NAME}
  only:
  - master

Für Angular-Anwendungen:

deploy:
  image: node:latest
  stage: deploy
  when: always
  before_script:
    - npm install -g @angular/cli
    - npm install
    - ng build --prod
    - pip install awscli
  script:
    - aws s3 sync ./dist s3://${BUCKET_NAME} --delete
    - aws cloudfront create-invalidation --distribution ${CLOUDFRONT_DISTRIBUTION_ID} --paths "/*"
  environment:
    name: ${CI_COMMIT_REF_SLUG}
    url: https://${BUCKET_NAME}
  only:
  - master

Für Hugo-Websites (wie unsere eigene):

deploy:
  image: registry.gitlab.com/pages/hugo:latest
  stage: deploy
  when: always
  before_script:
    - hugo
    - pip install awscli
  script:
    - aws s3 sync ./public s3://${BUCKET_NAME} --delete
    - aws cloudfront create-invalidation --distribution ${CLOUDFRONT_DISTRIBUTION_ID} --paths "/*"
  environment:
    name: ${CI_COMMIT_REF_SLUG}
    url: https://${BUCKET_NAME}
  only:
  - master

Schritt 5: Mehrere Umgebungen einrichten

Für fortgeschrittene CI/CD-Workflows können Sie mehrere Umgebungen konfigurieren:

stages:
  - build
  - deploy
build:
  image: node:latest
  stage: build
  script:
    - npm install
    - npm run build
  artifacts:
    paths:
      - build/
deploy_staging:
  image: python:latest
  stage: deploy
  before_script:
    - pip install awscli
  script:
    - aws s3 sync ./build s3://${STAGING_BUCKET_NAME} --delete
    - aws cloudfront create-invalidation --distribution ${STAGING_CLOUDFRONT_ID} --paths "/*"
  environment:
    name: staging
    url: https://staging.example.com
  only:
    - develop
deploy_production:
  image: python:latest
  stage: deploy
  before_script:
    - pip install awscli
  script:
    - aws s3 sync ./build s3://${PRODUCTION_BUCKET_NAME} --delete
    - aws cloudfront create-invalidation --distribution ${PRODUCTION_CLOUDFRONT_ID} --paths "/*"
  environment:
    name: production
    url: https://www.example.com
  only:
    - master
  when: manual

Tipps und Best Practices

  1. Sicherheit: Speichern Sie niemals AWS-Zugangsdaten direkt in der .gitlab-ci.yml-Datei
  2. Selektive Synchronisierung: Verwenden Sie die --include und --exclude-Parameter, um nur relevante Dateien zu synchronisieren
  3. Cache-Kontrolle: Fügen Sie Cache-Control-Header für optimale Performance hinzu:
    aws s3 sync ./build s3://${BUCKET_NAME} --delete --cache-control "max-age=31536000, public" --exclude "*.html"
    aws s3 sync ./build s3://${BUCKET_NAME} --delete --cache-control "no-cache" --include "*.html"
    
  4. Fehlerbehandlung: Fügen Sie Fehlerbehandlung und Benachrichtigungen hinzu:
    after_script:
      - if [ $CI_JOB_STATUS == "failed" ]; then echo "Deployment failed"; fi
    

Häufige Probleme und Lösungen

Problem: Fehlende Berechtigungen

Wenn die Pipeline mit Berechtigungsfehlern fehlschlägt, stellen Sie sicher, dass Ihr AWS-Benutzer über ausreichende Berechtigungen verfügt. Erstellen Sie eine IAM-Richtlinie mit den folgenden Berechtigungen:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:PutObject",
        "s3:GetObject",
        "s3:ListBucket",
        "s3:DeleteObject",
        "cloudfront:CreateInvalidation"
      ],
      "Resource": [
        "arn:aws:s3:::your-bucket-name/*",
        "arn:aws:s3:::your-bucket-name",
        "arn:aws:cloudfront::account-id:distribution/distribution-id"
      ]
    }
  ]
}

Problem: Lange Invalidierungszeiten

CloudFront-Invalidierungen können einige Zeit in Anspruch nehmen. Für schnellere Entwicklungszyklen können Sie die Invalidierung auf bestimmte Pfade beschränken:

aws cloudfront create-invalidation --distribution ${CLOUDFRONT_DISTRIBUTION_ID} --paths "/index.html" "/css/*" "/js/*"

Fazit

Mit GitLab CI/CD und AWS S3 können Sie einen vollständig automatisierten Deployment-Workflow für Ihre statischen Websites einrichten. Diese Lösung bietet zahlreiche Vorteile:

  • Automatisierte Builds und Deployments
  • Konsistente Bereitstellungsumgebungen
  • Schnelle Veröffentlichung von Updates
  • Verbesserte Zusammenarbeit im Team
  • Zuverlässige Rollback-Möglichkeiten Als App-Agentur aus Köln mit Expertise in DevOps und Cloud-Infrastruktur unterstützen wir Sie gerne bei der Implementierung effizienter CI/CD-Pipelines für Ihre Projekte. Kontaktieren Sie uns für eine Beratung zu Ihren individuellen Anforderungen.
Diesen Post teilen:

Empfohlene Artikel

Ihre App-Idee verwirklichen?

Lassen Sie uns gemeinsam Ihre App-Idee in Köln zum Leben erwecken. Unsere Experten beraten Sie gerne zu Ihrem individuellen Projekt.

Kostenlose Erstberatung