Unser Team besteht aus einem Entwickler und einem DevOps-Ingenieur. Ich bin für die Bereitstellung der Anwendung im Amazon ECS-Cluster verantwortlich. Als CI / CD-Server verwende ich Bamboo. In diesem Artikel werde ich detailliert beschreiben, wie ich eine Anwendung in einer Entwicklungsumgebung bereitstelle.


Erstellen Sie ein Docker-Image
Hier folge ich diesen Schritten:
- Schritt 1: Installieren und konfigurieren Sie Docker.
- Schritt 2: Konfigurieren Sie Artefakte in Bambus.
- Schritt 3: Konfigurieren Sie das Amazon ECR-Repository.
- Schritt 4: Erstellen Sie das Docker-Image in Bamboo.
Schritt 1: Installieren und konfigurieren Sie Docker
Zuerst aktualisiere ich den Server, auf dem Bamboo installiert ist, installiere die erforderlichen Pakete und richte das Docker-Repository ein. Es ist zu beachten, dass ich Bamboo auf dem CentOS 7-Betriebssystem installiert habe. Informationen zur Installation von Docker auf anderen Betriebssystemen finden Sie unter
www.docker.com .
$ sudo yum update $ sudo yum install -y yum-utils device-mapper-persistent-data lvm2 $ sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
Dann installiere ich die Docker-Anwendung und starte den Dienst:
$ sudo yum install docker-ce docker-ce-cli containerd.io $ sudo systemctl enable docker $ sudo systemctl start docker
Dann füge ich den Bambusbenutzer der Docker-Gruppe hinzu:
$ sudo usermod -aG docker bamboo $ sudo su - bamboo $ docker run hello-world
Wenn Docker nach dem Ausführen dieser Befehle mit der Meldung „Hallo von Docker!“ Antwortet, bedeutet dies, dass meine Installation ordnungsgemäß funktioniert.
Schritt 2. Konfigurieren Sie Artefakte in Bamboo
Die Anwendungsentwicklung bei
Grails ist im Gange. Beim Kompilieren der Anwendung wird eine Datei mit der Erweiterung war erstellt. Diese Datei ist in der Bambus-Terminologie ein Artefakt. Konfigurieren Sie Bamboo so, dass diese Datei für nachfolgende Aufgaben verwendet wird. Dazu gehe ich zur Registerkarte
Aufgaben :

Und ich habe die Grails-Aufgabe wie folgt eingerichtet:

Wir sehen, dass Grails zuerst den Build-Ordner löscht, dann die Tests ausführt und schließlich eine War-Datei für die Entwicklungsumgebung erstellt.
Danach klicke ich auf die Registerkarte
Artefakte und die Schaltfläche
Artefakt erstellen :

Ich definiere ein Artefakt wie folgt:

Grails legt die Kriegsdatei im Verzeichnis
build / libs ab . Ich werde den
Shared- Parameter überprüfen, da ich dieses Artefakt später benötige.
Jetzt erstelle ich ein Bereitstellungsprojekt und gebe ein Artefakt an, das in meinem Erstellungsplan verwendet werden soll:


Ich habe auch die
Artefakt-Download- Aufgabe im Bereitstellungsprojekt eingerichtet:

Somit ist Bamboo jetzt für die Verwendung einer Kriegsdatei konfiguriert.
Schritt 3. Konfigurieren Sie das Amazon ECR-Repository
Amazon ECR ist ein Docker-Speicher- und Verwaltungsdienst für Bilder. Öffnen Sie zum Konfigurieren die AWS-Konsole und wählen Sie ECR:

Nachdem ich das Repository erstellt habe, erhalte ich die folgende Adresse:
aws_account_id.dkr.ecr.us-east-2.amazonaws.com/onboard
Nach Abschluss der Konfiguration finden Sie hier auch Anweisungen zum Anmelden, Herunterladen eines Bilds aus dem Repository und Hochladen des Bildes in das Repository.
Schritt 4: Erstellen Sie das Docker-Image in Bambus
Jetzt muss ich den Trigger konfigurieren, um mit dem Erstellen des Docker-Images zu beginnen. Dazu gehe ich zur Registerkarte
Trigger und klicke auf die Schaltfläche
Trigger hinzufügen:

Hier wähle
ich die Option
Nach erfolgreichem Erstellen des Plans erstellen, damit das Docker-Image nach dem Kompilieren des Projekts erstellt wird.
Jetzt müssen wir die Docker-Image-Build-Aufgabe hinzufügen. Wechseln Sie dazu zur Registerkarte
Aufgaben , klicken
Sie auf Aufgabe hinzufügen und wählen Sie den
Docker- Typ aus. Geben Sie eine Beschreibung ein und wählen Sie im Dropdown-Menü die
Option Docker-Image erstellen.
Geben Sie im Feld
Repository ein
aws_account_id.dkr.ecr.us-east-2.amazonaws.com/onboard:latest.
Die Docker-Datei kann wie folgt aussehen:
FROM openjdk:8-jre COPY *.war /usr/src/onboard.war WORKDIR /usr/src CMD ["/bin/bash", "-c", "java -DdataSource.url=$DATASOURCE_URL -DdataSource.username=$DATASOURCE_USERNAME -DdataSource.password=$DATASOURCE_PASSWORD -jar onboard.war"]
Wenn Sie die Anwendung starten, müssen Sie die Datenbank angeben. Umgebungsvariablen DATASOURCE_URL, DATASOURCE_USERNAME, DATASOURCE_PASSWORD werden verwendet, um diese Informationen an die Anwendung zu übertragen, ihre Werte werden jedoch beim Starten des Containers festgelegt.
Damit ist der Einrichtungsprozess für das Zusammenstellen des Docker-Images mit der Anwendung abgeschlossen. Der nächste Schritt besteht darin, den Download dieses Bildes in das Amazon ECR-Repository zu konfigurieren.

Laden Sie das Bild in die Elastic Container Registry hoch
Sie können die Elastic Container Registry verwenden, um mit Bamboo gesammelte Bilder zu speichern. Um dies zu erreichen, gehe ich folgendermaßen vor:
- Schritt 1. Installieren Sie Amazon ECR Docker Credential Helper
- Schritt 2. Verbinden Sie die IAM-Rolle mit dem Bamboo-Server
- Schritt 3: Konfigurieren Sie den Docker-Image-Startjob
Schritt 1. Installieren Sie Amazon ECR Docker Credential Helper
Um Docker-Images auf Amazon ECR herunterzuladen, müssen Sie über Anmeldeinformationen verfügen. Diese Anmeldeinformationen können durch Ausführen des Befehls abgerufen werden
aws ecr get-login
Diese Anmeldeinformationen sind jedoch nur 12 Stunden gültig. Daher können Sie entweder den obigen Befehl jedes Mal ausführen, bevor Sie das Image in die ECR hochladen, oder den ECR Docker Credential Helper installieren, der die temporären Anmeldeinformationen auf dem neuesten Stand hält und sich bei der ECR anmeldet. Führen Sie die folgenden Schritte aus, um den ECR Docker Credential Helper zu installieren.
Zuerst müssen Sie
git installieren und dann das Github-Repository klonen:
$ sudo yum install git $ sudo su - bamboo $ git clone https://github.com/awslabs/amazon-ecr-credential-helper.git $ make docker
Dann müssen Sie die folgenden Zeilen in die Datei
/home/bamboo/.docker/config.json einfügen :
{ "credsStore": "ecr-login" }
Und kopieren Sie die kompilierte Anwendung in das
Verzeichnis / usr / bin :
$ exit $ sudo cp /home/bamboo/docker-credential-ecr-login /usr/bin/
Schritt 2. Verbinden Sie die IAM-Rolle mit dem Bamboo-Server
Damit der Bamboo-Server ECR verwenden kann, müssen Sie eine Rolle erstellen, die
AmazonEC2ContainerRegistryPowerUser- Richtlinie zu dieser Rolle hinzufügen und diese Rolle dann an die EC2-Bamboo-Instanz anhängen. Öffnen Sie die AWS-Konsole und wählen Sie IAM. Klicken
Sie anschließend auf die Schaltfläche
Rolle erstellen , wählen Sie
AWS-Service und
EC2 aus , wie unten gezeigt:

Dann klicken wir auf die Schaltfläche
Weiter: Berechtigungen. Im nächsten Bildschirm finden wir die
AmazonEC2ContainerRegistryPowerUser- Richtlinie und wählen
sie aus . Danach erstellen wir die Rolle fertig und hängen sie an unseren Bamboo-Server an.
Schritt 3: Konfigurieren Sie den Docker-Image-Startjob
Die Anwendung, die wir erstellt und ein Docker-Image mit einer Kriegsdatei zusammengestellt haben. Jetzt müssen Sie dieses Bild in das Repository hochladen. Dazu füge ich eine weitere Docker-Aufgabe hinzu, diesmal um das Bild in das ECR-Repository hochzuladen. Ich gehe zur Registerkarte
Aufgaben ,
klicke auf Aufgabe hinzufügen und wähle den
Docker- Typ aus. Ich gebe eine Beschreibung ein und wähle im Dropdown-Menü die
Option Docker-Image in eine Docker-Registrierung übertragen . Ich wähle
Benutzerdefinierte Registrierung und gebe die Repository-Adresse in das Feld
Repository ein. Für den
Authentifizierungstyp wähle ich
Die nativen Anmeldeinformationen des Agenten verwenden .
Damit ist der Setup-Vorgang zum Laden des Docker-Images in das Amazon ECR-Repository abgeschlossen. In den folgenden Schritten wird das Konfigurieren eines Clusters und eines Dienstes zum Starten einer Containeranwendung beschrieben. Zuvor müssen Sie jedoch die Startoptionen für den Container konfigurieren. Das werden wir jetzt tun.

Erstellen Sie eine Amazon ECS-Aufgabendefinition
Aufgabendefinition - Hier werden Containerausführungsparameter geschrieben. Unsere Anwendung verwendet eine Datenbank, deren Parameter beim Start des Containers angegeben werden. In diesem Abschnitt erstellen wir daher auch eine Datenbank. Ich verwende
Amazon RDS als Datenbank und speichere das Kennwort für den Zugriff auf die Datenbank in verschlüsselter Form im
AWS Systems Manager-Parameterspeicher . Die folgenden Schritte befolge ich, um eine Aufgabendefinition zu erstellen:
- Schritt 1. Erstellen einer Datenbank auf einer Amazon RDS-Instanz;
- Schritt 2. Konfigurieren des AWS Systems Manager-Parameterspeichers;
- Schritt 3. Erstellen Sie eine Aufgabendefinition.
Schritt 1. Erstellen Sie eine Datenbank auf einer Amazon RDS-Instanz
Unsere Anwendung verwendet die PostgreSQL-Datenbank. Öffnen Sie zum Erstellen einer Datenbank die AWS-Konsole, wählen Sie den Amazon RDS-Dienst aus, klicken
Sie auf die Schaltfläche
Datenbank erstellen und wählen Sie dann
PostgreSQL als Datenbankmodul aus. Auf der nächsten Seite wähle ich
Dev / Test als Arbeitsumgebung aus und klicke auf
Weiter . Dann bezeichne ich die
DB- Instanzkennung als onboard-dev-db und den
Master-Benutzernamen als
devdbadmin . Dann gehe ich zur nächsten Seite, um die VPC, die Subnetzgruppe und die Sicherheitsgruppe zu konfigurieren. Diese Datenbank wird in einem privaten Netzwerk verwendet, daher wähle ich
Nein für den Parameter
Öffentliche Barrierefreiheit . Ich
gebe devdb in das
Feld Datenbankname ein und
klicke auf die Schaltfläche
Datenbank erstellen .
Schritt 2. Konfigurieren des AWS Systems Manager-Parameterspeichers
Ich speichere das Datenbankkennwort in verschlüsselter Form. Öffnen Sie dazu die AWS-Konsole und gehen Sie zu AWS Systems Manager → Freigegebene Ressourcen → Parameterspeicher → Parameter erstellen. Ich
gebe devdbpassword als Parameternamen ein und wähle
SecureString als Parametertyp aus. Dann
gebe ich das Datenbankkennwort in das Feld
Wert ein.
Schritt 3. Erstellen Sie eine Aufgabendefinition
Amazon ECS ist der Cluster, in dem Containeranwendungen ausgeführt werden. Mithilfe der Aufgabendefinition werden Ausführungsparameter für eine Containeranwendung angegeben. Klicken Sie zum
Festlegen solcher Parameter auf die Schaltfläche
Neue Aufgabendefinition erstellen . Dann wähle ich
Fargate als Starttyp und gehe zum nächsten Schritt über. Hier habe ich den Namen als
onboard-dev-taskdef gesetzt . Wählen
Sie für den
Feldparameter IAM-Rollenfeld für die
Aufgabenausführung die
Option Neue Rolle erstellen aus . Für die für diese Anwendung zugewiesenen Ressourcen bezeichne ich 2 GB Speicher und 1 vCPU. Jetzt müssen Sie Container-Startoptionen hinzufügen. Ich werde den Container
onboard-dev-container benennen. Ich werde den Bildnamen so benennen:
aws_account_id.dkr.ecr.us-east-2.amazonaws.com/onboard:latest . Amazon ECR Docker Credential Helper kümmert sich um die ECR-Authentifizierung, daher lasse ich die
Authentifizierungsoption für das
private Repository deaktiviert. In der Entwicklungsumgebung ist die Anwendung auf Port 8080 verfügbar. Für den Parameter Port Mappings schreibe ich
8080 und wähle das
TCP- Protokoll aus. Datenbank-URL-Parameter, Benutzername und Kennwort werden mithilfe von Umgebungsvariablen an den Container übergeben. Ich habe diese Parameter im Abschnitt Umgebungsvariablen eingestellt. Um den Wert des Parameters
devdbpassword aus dem Parameterspeicher
abzurufen, gebe ich den Typ
ValueFrom an . Das letzte, was ich konfiguriere, ist die
Protokollkonfiguration . Hier wähle ich
CloudWatch-Protokolle automatisch konfigurieren . Jetzt ist die Erstellung der Aufgabendefinition abgeschlossen.
Die Rolle ecsTaskExecutionRole benötigt jedoch eine Richtlinie, um devdbpassword aus dem Parameterspeicher abzurufen. Gehen Sie dazu zu IAM-Rollen und wählen Sie ecsTaskExecutionRole aus. Klicken
Sie auf Inline-Richtlinie hinzufügen. In diesem Fall füge ich mit einem visuellen Editor hinzu. Daher
gebe ich im Feld Service den
Systemmanager ein , im Feld Aktionen -
GetParameters . Dann
klicke ich für das Feld Ressourcen auf
ARN hinzufügen und gebe meine Werte ein:

Am Ende schaue ich mir die Werte der Parameter an, die durch Klicken auf Überprüfungsrichtlinie festgelegt werden, gebe ihr einen Namen und beende die Arbeit mit der ecsTaskExecutionRole-Konfiguration.
Damit ist die Konfiguration der Einstellungen für die Startcontaineranwendung abgeschlossen. Jetzt müssen Sie einen ECS-Cluster und -Dienst erstellen.

Erstellen Sie den Amazon ECS-Dienst
Unsere Containeranwendung wird als Service in einem ECS-Cluster ausgeführt. Zum Konfigurieren müssen Sie die folgenden Schritte ausführen:
- Schritt 1. Erstellen Sie einen Amazon ECS-Cluster.
- Schritt 2: Erstellen eines Dienstes
Schritt 1. Erstellen Sie einen Amazon ECS-Cluster
Um einen ECS-Cluster zu erstellen, rufen Sie die AWS-Konsole auf und wählen Sie den ECS-Dienst aus. Klicken
Sie dann auf Cluster erstellen und wählen Sie die Vorlage
Nur Netzwerkcluster aus . Auf der nächsten Seite
benenne ich den Cluster als
Onboard-Dev-Cluster und vervollständige den Cluster. Jetzt habe ich einen
Fargate- basierten ECS-Cluster.
Schritt 2: Erstellen eines Dienstes
Um einen Dienst zu erstellen, klicke ich auf den Link
Onboard-Dev-Cluster , gehe dann zur Registerkarte
Dienste und klicke auf die Schaltfläche
Erstellen . Für den Starttyp wähle
ich Fargate, für die
Aufgabendefinition wähle
ich onboard-dev-taskdef. Außerdem wähle ich im Feld Cluster den Onboard-Dev-Cluster aus. In das Feld Dienstname schreibe ich onboard-dev. Ich habe den Parameter
Anzahl der Aufgaben auf Null gesetzt, da ich die Anwendung jetzt nicht starten möchte. Ich lasse die Parameter
Minimum Healthous Percent gleich 100 und
Maximum Percent gleich 200. Wählen Sie für den Parameter
Deployment Type die Option
Rolling Update aus und fahren Sie mit dem nächsten Schritt fort.
Auf der Seite
Netzwerk konfigurieren wähle ich für den Parameter
Cluster-VPC eine zuvor erstellte VPC mit dem Namen
Entwicklungs-VPC aus . Die in der Entwicklung befindliche Anwendung ist nur im privaten Netzwerk verfügbar, daher wähle ich zwei private Subnetze. Um Sicherheitsgruppen zu konfigurieren, klicke ich auf die Schaltfläche
Bearbeiten , wähle dann
Vorhandene Sicherheitsgruppe auswählen, dann die
Standardsicherheitsgruppe und klicke auf die Schaltfläche
Speichern . Für den Parameter
Öffentliche IP automatisch zuweisen wähle ich
Deaktiviert . Als Nächstes wähle ich für den Parameter
Load Balancer-Typ None aus und lasse die Option
Service Discovery-Integration aktivieren
deaktiviert . Dann klicke ich auf
Weiter, Weiter und
Dienst erstellen .
Jetzt habe ich einen Dienst, bei dem die Anzahl der ausgeführten Jobs Null ist. Wir werden den Anwendungsstart im nächsten Schritt konfigurieren.

Service-Update
Sobald der Entwickler den Anwendungscode aktualisiert, erstellt unsere Bereitstellung ein Docker-Image, lädt es in die Elastic Container Registry hoch und startet schließlich die Containeranwendung als Dienst im ECS Fargate-Cluster. Derzeit ist die Anzahl der im Cluster ausgeführten Jobs Null. Damit die Anwendung gestartet werden kann, müssen Sie den Dienst aktualisieren und die Menge gleich eins angeben. Ich folge diesen Schritten, um dies zu erreichen:
- Schritt 1. Installieren des Tasks for AWS Bamboo-Plugins;
- Schritt 2. Aktualisieren des ECS-Dienstes
Schritt 1. Installieren des Plugins Tasks for AWS Bamboo
Aufgaben für AWS Bamboo ist ein Plugin, das die Vorbereitung und den Betrieb von AWS-Ressourcen aus Bamboo-Build- und Bereitstellungsprojekten vereinfacht. Um dieses Plugin zu installieren, gehe ich zum Bereitstellungsprojekt,
klicke auf Aufgabe hinzufügen , gehe zum Atlassian Marketplace und installiere
Aufgaben für AWS (Bamboo) .
Schritt 2. Aktualisieren des ECS-Dienstes
Jetzt im Bereitstellungsprojekt füge ich den
Amazon ECS Service- Job hinzu. Dann schreibe ich in das
Jobbeschreibungsfeld Update Service für onBoard-dev . Wählen Sie im Feld Aktion die
Option Dienst aktualisieren und
Neue Bereitstellung erzwingen aus . Dann wähle ich US East (Ohio) als Startregion. Dann schreibe ich in die entsprechenden Felder ARN (Amazon Resource Name) für Task Definition, Cluster und Service. In dieser Aufgabe aktualisiere ich die gewünschte Anzahl laufender Aufgaben auf eins. Als Nächstes fülle ich das Textfeld für die Bereitstellungskonfiguration mit den folgenden Werten aus:
{ "maximumPercent": 200, "minimumHealthyPercent": 100 }
Ich richte ein Netzwerk ohne öffentliche IP wie folgt ein:
{ "awsvpcConfiguration": { "assignPublicIp": "DISABLED", "subnets": ["subnet-ID1", "subnet-ID2"], "securityGroups": ["sg-ID"] } }
Im Abschnitt
Quelle für
AWS-Sicherheitsanmeldeinformationen wähle ich
IAM-Rolle für EC2 aus .
Ich muss in der Lage sein, ECS zu aktualisieren, daher
hänge ich die
AmazonECS_FullAccess- Richtlinie an meine Bamboo EC2-Instanz an. Öffnen Sie dazu die AWS-Konsole und wählen Sie IAM. Dann wähle ich die Rolle aus, die ich für meinen Bamboo-Server verwende. Ich klicke auf die Schaltfläche Richtlinien anhängen, finde die AmazonECS_FullAccess-Richtlinie, aktiviere das Kontrollkästchen links und beende das Anhängen der Richtlinie.
Damit ist das CI / CD-Setup mit AWS und Bamboo abgeschlossen. Wenn der Entwickler den Anwendungscode aktualisiert, diesen Code in das Repository hochlädt, werden das Testen und Zusammenstellen der Anwendung gestartet. Anschließend wird das Docker-Image mit der War-Datei der Anwendung erstellt und dieses Image in das Amazon ECR-Repository kopiert. Als Nächstes wird im Amazon ECS-Cluster eine Containeranwendung als Dienst gestartet, die die aktuelle Anwendung aktualisiert, wenn sie nicht gestoppt wurde. Wenn die Anwendung gestoppt wurde, um Ressourcen zu sparen, wird die Anwendung einfach gestartet. Nachdem Sie die Anwendung in der Entwicklungsumgebung überprüft haben, können Sie die Anwendung stoppen, indem Sie die Anzahl der im Cluster ausgeführten Jobs auf Null setzen.
Wenn Ihnen der Artikel gefallen hat und Sie Verbesserungsvorschläge haben, schreiben Sie in die Kommentare.