Türchen #4: Praxistipp - Jenkins in S3 Bucket sichern
Von Michael Krieg am 4. Dezember 2019
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!