CI / CD mit AWS und Bambus

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.

Source: https://habr.com/ru/post/de458648/


All Articles