Skip to main content

Bereitstellen in Amazon Elastic Container Service

Im Rahmen deines Continuous Deployment-Workflows (CD) kannst du die Bereitstellung in Amazon Elastic Container Service (ECS) vornehmen.

Note

Auf GitHub gehostete Runner werden aktuell nicht auf GitHub Enterprise Server unterstützt. Weitere Informationen zur geplanten zukünftigen Unterstützung findest Du in der GitHub public roadmap.

Einführung

In diesem Leitfaden wird erläutert, wie GitHub Actions verwendet wird, um eine containerisierte Anwendung zu erstellen, sie in Amazon Elastic Container Registry (ECR) zu pushen und in Amazon Elastic Container Service (ECS) bereitzustellen, wenn ein Push in den main-Branch erfolgt.

Bei jedem neuen Push in main in deinem GitHub-Repository erstellt der GitHub Actions-Workflow ein neues Containerimage, verschiebt es an Amazon ECR und stellt dann eine neue Aufgabendefinition für Amazon ECS bereit.

Note

Wenn deine GitHub Actions-Workflows auf Ressourcen eines Cloudanbieters zugreifen müssen, der OpenID Connect (OIDC) unterstützt, kannst du deine Workflows so konfigurieren, dass die Authentifizierung direkt beim Cloudanbieter erfolgt. Dadurch musst du diese Anmeldeinformationen nicht mehr als langlebige Geheimnisse speichern und profitierst zudem von weiteren Sicherheitsvorteilen. Weitere Informationen findest du unter Informationen zur Sicherheitshärtung mit OpenID Connect. und Konfigurieren von OpenID Connect in Amazon Web Services.

Voraussetzungen

Bevor du deinen GitHub Actions-Workflow erstellst, musst du die folgenden Einrichtungsschritte für Amazon ECR und ECS ausführen:

  1. Erstelle ein Amazon ECR-Repository, um deine Bilder zu speichern.

    Verwende z. B. die AWS CLI:

    Bash
    aws ecr create-repository \
        --repository-name MY_ECR_REPOSITORY \
        --region MY_AWS_REGION
    
    

    Stellen Sie sicher, dass Sie den gleichen Amazon ECR-Repositorynamen (hier dargestellt durch MY_ECR_REPOSITORY) für die ECR_REPOSITORY-Variable im folgenden Workflow verwenden.

    Stellen Sie sicher, dass Sie denselben AWS-Regionswert für die AWS_REGION-Variable (hier dargestellt durch MY_AWS_REGION) im folgenden Workflow verwenden.

  2. Erstellen Sie eine Amazon ECS-Aufgabendefinition, einen Cluster und einen Dienst.

    Ausführliche Informationen finden Sie im Assistenten für die erste Schritte auf der Amazon ECS-Konsole oder in der Anleitung mit ersten Schritten in der Amazon ECS-Dokumentation.

    Notieren Sie unbedingt die Namen, die Sie für den Amazon ECS-Dienst und -Cluster festgelegt haben, und verwenden Sie sie für die ECS_SERVICE- und ECS_CLUSTER-Variablen im folgenden Workflow.

  3. Speichern Sie Ihre Amazon ECS-Aufgabendefinition als JSON-Datei in Ihrem GitHub-Repository.

    Das Format der Datei sollte mit der Ausgabe übereinstimmen, die generiert wird von:

    Bash
    
    aws ecs register-task-definition --generate-cli-skeleton
    
    

    Stellen Sie sicher, dass Sie die ECS_TASK_DEFINITION-Variable im folgenden Workflow als Pfad zur JSON-Datei festlegen.

    Stellen Sie sicher, dass Sie die CONTAINER_NAME-Variable im folgenden Workflow als Containernamen im containerDefinitions-Abschnitt der Aufgabendefinition festlegen.

  4. Erstellen Sie GitHub Actions-Geheimnisse mit dem Namen AWS_ACCESS_KEY_ID und AWS_SECRET_ACCESS_KEY, um die Werte für Ihren Amazon IAM-Zugriffsschlüssel zu speichern.

    Weitere Informationen zum Erstellen von Geheimnissen für GitHub Actions sind unter „Verwenden von Geheimnissen in GitHub-Aktionen“ zu finden.

    In der Dokumentation finden Sie zu jeder unten verwendeten Aktion die empfohlenen IAM-Richtlinien für den IAM-Benutzer und die Methoden zum Umgang mit den Anmeldeinformationen für den Zugriffsschlüssel.

  5. Konfiguriere optional auch eine Bereitstellungsumgebung. Umgebungen werden verwendet, um ein allgemeines Bereitstellungsziel wie production, staging oder development zu beschreiben. Wenn ein GitHub Actions-Workflow in einer Umgebung bereitgestellt wird, wird die Umgebung auf der Hauptseite des Repositorys angezeigt. Du kannst Umgebungen verwenden, um die Genehmigung für die Fortsetzung eines Auftrags anzufordern, einzuschränken, welche Branches einen Workflow auslösen können, Bereitstellungen mit benutzerdefinierten Bereitstellungsschutzregeln zu schützen oder den Zugriff auf Geheimnisse zu beschränken. Weitere Informationen zum Erstellen von Umgebungen findest du unter Verwalten von Umgebungen für die Bereitstellung.

Erstellen des Workflows

Nachdem die Voraussetzungen erfüllt sind, kannst du mit dem Erstellen des Workflows fortfahren.

Im folgenden Beispielworkflow wird gezeigt, wie ein Containerimage erstellt und in GCR gepusht wird. Anschließend wird die Aufgabendefinition mit der neuen Image-ID aktualisiert und die Aufgabendefinition für Amazon ECS bereitgestellt.

Stellen Sie sicher, dass Sie eigene Werte für alle Variablen im env-Schlüssel des Workflows angeben.

Wenn du eine Bereitstellungsumgebung konfiguriert hast, ändere den Wert environment in den Namen deiner Umgebung. Wenn du keine Umgebung konfiguriert hast, lösche den environment-Schlüssel.

YAML
# Dieser Workflow verwendet Aktionen, die nicht von GitHub zertifiziert sind.
# Sie werden von einem Drittanbieter bereitgestellt und unterliegen
# separaten Nutzungsbedingungen, Datenschutzbestimmungen und Support
# Onlinedokumentation.

# GitHub empfiehlt, Aktionen an einen Commit-SHA anzuheften.
# Um eine neuere Version zu erhalten, musst du den SHA aktualisieren.
# Du kannst auch auf ein Tag oder einen Branch verweisen, aber die Aktion kann sich ohne Vorwarnung ändern.

name: Deploy to Amazon ECS

on:
  push:
    branches:
      - main

env:
  AWS_REGION: MY_AWS_REGION                   # set this to your preferred AWS region, e.g. us-west-1
  ECR_REPOSITORY: MY_ECR_REPOSITORY           # set this to your Amazon ECR repository name
  ECS_SERVICE: MY_ECS_SERVICE                 # set this to your Amazon ECS service name
  ECS_CLUSTER: MY_ECS_CLUSTER                 # set this to your Amazon ECS cluster name
  ECS_TASK_DEFINITION: MY_ECS_TASK_DEFINITION # set this to the path to your Amazon ECS task definition
                                               # file, e.g. .aws/task-definition.json
  CONTAINER_NAME: MY_CONTAINER_NAME           # set this to the name of the container in the
                                               # containerDefinitions section of your task definition

jobs:
  deploy:
    name: Deploy
    runs-on: ubuntu-latest
    environment: production

    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Configure AWS credentials
        uses: aws-actions/configure-aws-credentials@0e613a0980cbf65ed5b322eb7a1e075d28913a83
        with:
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          aws-region: ${{ env.AWS_REGION }}

      - name: Login to Amazon ECR
        id: login-ecr
        uses: aws-actions/amazon-ecr-login@62f4f872db3836360b72999f4b87f1ff13310f3a

      - name: Build, tag, and push image to Amazon ECR
        id: build-image
        env:
          ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }}
          IMAGE_TAG: ${{ github.sha }}
        run: |
          # Build a docker container and
          # push it to ECR so that it can
          # be deployed to ECS.
          docker build -t $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG .
          docker push $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG
          echo "image=$ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG" >> $GITHUB_OUTPUT

      - name: Fill in the new image ID in the Amazon ECS task definition
        id: task-def
        uses: aws-actions/amazon-ecs-render-task-definition@c804dfbdd57f713b6c079302a4c01db7017a36fc
        with:
          task-definition: ${{ env.ECS_TASK_DEFINITION }}
          container-name: ${{ env.CONTAINER_NAME }}
          image: ${{ steps.build-image.outputs.image }}

      - name: Deploy Amazon ECS task definition
        uses: aws-actions/amazon-ecs-deploy-task-definition@df9643053eda01f169e64a0e60233aacca83799a
        with:
          task-definition: ${{ steps.task-def.outputs.task-definition }}
          service: ${{ env.ECS_SERVICE }}
          cluster: ${{ env.ECS_CLUSTER }}
          wait-for-service-stability: true

Zusätzliche Ressourcen

Die ursprüngliche Workflowvorlage finden Sie unter aws.yml im GitHub Actions-Repository starter-workflows.

Weitere Informationen zu den in diesen Beispielen verwendeten Diensten findest du in der folgenden Dokumentation: