Türchen #4: Praxistipp - Jenkins in S3 Bucket sichern


Backup leicht gemacht

Als Continuous Integration Server ist Jenkins auch heute nicht wegzudenken, wenngleich es einige Alternativen gibt. In puncto Backup macht es uns Jenkins recht leicht:

alle Konfigurationen liegen als lokale Dateien vor und es wird keine Datenbank benötigt.

Diesen Umstand machen wir uns zunutze und erstellen uns heute ein einfaches, aber effizientes Backup Skript.

Was benötigen wir?

Neben der AWS-CLI und einem versionierten + verschlüsselten S3 Bucket ist noch der Zugriff zu regeln. Sofern Jenkins auf einer EC2 Instanz im gleichen AWS Account wie unser Backup S3 Bucket läuft, empfehlen wir, den Zugriff über IAM Instance Profiles / Roles zu regeln. Alternativ erstellen wir einen neuen IAM Benutzer mit AccessKey und -Secret. Diese sensiblen Informationen müssen nun einmalig auf dem Jenkins Server hinterlegt werden (als Profilname erstellen wir backup2s3 und nutzen nicht default):

  aws configure --profile backup2s3

Sowohl der IAM Instance Role als auch alternativ dem IAM Benutzer muss eine IAM Policy zugewiesen werden, welche den Zugriff auf unser S3 Bucket sicherstellt:

Beispiel Policy Document

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "s3:GetBucketLocation",
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::randomhouse-jenkins-backup"
            ],
            "Effect": "Allow"
        },
        {
            "Action": [
                "s3:GetObject",
                "s3:GetObjectAcl",
                "s3:PutObject",
                "s3:PutObjectAcl",
                "s3:DeleteObject"
            ],
            "Resource": [
                "arn:aws:s3:::randomhouse-jenkins-backup/*"
            ],
            "Effect": "Allow"
        }
    ]
}

Folgende beiden Skript Versionen benutzen die --dryrun Option, die selbsterklärend später weggelassen werden sollte. Wichtig ist in jedem Fall die explizite Angabe unseres Profilnamens backup2s3, wenn wir uns über einen IAM Benutzer authentifizieren!

Backup Skript (erste Version)

#!/usr/bin/env bash

# ggfls. anzupassen:
JENKINS_HOME=/var/lib/jenkins

aws --profile backup2s3 \
  s3 sync ${JENKINS_HOME} s3://randomhouse-jenkins-backup \
  --dryrun

Backup Skript (zweite Version)

Häufig werden im $JENKINS_HOME Verzeichnis diverse temporäre Dateien und Ordner von Tools wie Composer, NodeJS/NPM u. ä. angelegt. Diese benötigen wir nicht zwingend im Backup und lassen sie somit gleich weg:

#!/usr/bin/env bash

# ggfls. anzupassen:
JENKINS_HOME=/var/lib/jenkins

aws --profile backup2s3 \
  s3 sync ${JENKINS_HOME} s3://randomhouse-jenkins-backup \
  --exclude ".npm/*"  --exclude "*.gem/*" --exclude "*.composer/*" --exclude ".cache/*" --exclude ".local/*" --exclude ".aws/*" \
  --dryrun

Abschließend erstellen wir noch einen Cronjob, etwa unter /etc/cron.d/jenkins-backup, welcher einmal nachts laufen wird:

53 23 * * * jenkins /path/to/our/backup-script

Fertig!

Zurück zu den Blogbeiträgen

Trainings und Workshops

Vom Kurs für Einsteiger bis hin zu Experten-Workshops mit Tiefgang können wir Euch mit technischen Trainings unterstützen. Darüber hinaus bieten wir auch Workshops mit Fokus auf Cloud-Strategie oder für die Vertriebsmannschaft an.

Mehr...