Hinweis: GitHub-gehostete Runner werden auf GitHub Enterprise Server derzeit nicht 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.
Hinweis: 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:
-
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
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 dieECR_REPOSITORY
-Variable im folgenden Workflow verwenden.Stellen Sie sicher, dass Sie denselben AWS-Regionswert für die
AWS_REGION
-Variable (hier dargestellt durchMY_AWS_REGION
) im folgenden Workflow verwenden. -
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
- undECS_CLUSTER
-Variablen im folgenden Workflow. -
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
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 imcontainerDefinitions
-Abschnitt der Aufgabendefinition festlegen. -
Erstellen Sie GitHub Actions-Geheimnisse mit dem Namen
AWS_ACCESS_KEY_ID
undAWS_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.
-
Konfiguriere optional auch eine Bereitstellungsumgebung. Umgebungen werden verwendet, um ein allgemeines Bereitstellungsziel wie
production
,staging
oderdevelopment
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.
# 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
# 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:
- Security best practices in IAM (Bewährte Sicherheitsmethoden in IAM) in der Amazon AWS-Dokumentation.
- Offizielle AWS-Aktion Configure AWS Credentials (AWS-Anmeldeinformationen konfigurieren).
- Offizielle AWS-Aktion Amazon ECR „Login“ (Anmelden).
- Offizielle AWS-Aktion Amazon ECS „Render Task Definition“ (Aufgabendefinition rendern).
- Offizielle AWS-Aktion Amazon ECS „Deploy Task Definition“ (Aufgabendefinition bereitstellen).