Blog
Bereitstellen von MySQL-Benutzern und -Datenbanken mit AWS CloudFormation

Obwohl CloudFormation bei der Erstellung von MySQL-Datenbankservern mit Amazon RDS sehr gut ist, enthält es nur einen einzigen Benutzer, der
die volle Kontrolle über den gesamten Server hat. Die banale Aufgabe, normale Benutzer und Datenbankschemata zu erstellen, wird nicht unterstützt. Mit diesem Custom Resource Provider
können Sie einen MySQL-Benutzer mit eigenem Datenbankschema als Teil der CloudFormation-Vorlage bereitstellen.
Dieses Plugin erstellt einen Benutzer und ein Datenbankschema und gewährt dem Benutzer mit der Option grant vollen Zugriff auf das neu erstellte Schema. Auf diese Weise kann die Anwendung alle benötigten Ressourcen erstellen und anderen Benutzern Privilegien gewähren. Das Passwort für den Benutzer kann direkt angegeben oder aus dem AWS Parameter Store übernommen werden.
Wie funktioniert das?
Es ist ganz einfach: Sie geben eine CloudFormation-Ressource des Typs Custom::MySQLUser an, wie folgt:
KongUser:
Type: Custom::MySQLUser
DependsOn: KongPassword
Properties:
Name: kong
PasswordParameterName: /mysql/kong/password
WithDatabase: true
DeletionPolicy: Retain
Database: # the server to create the new user or database in
Host: mysql
Port: 3306
Database: root
User: root
PasswordParameterName: /mysql/root/password
ServiceToken: !Sub 'arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:binxioio-cfn-mysql-user-provider-vpc-${AppVPC}'
KongPassword:
Type: Custom::Secret
Properties:
Name: /mysql/kong/password
ServiceToken: !Sub 'arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:binxio-cfn-secret-provider'
Nach der Bereitstellung wurde der MySQL-Benutzer 'kong' zusammen mit einer passenden Datenbank 'kong' erstellt. Das Passwort für den Benutzer 'kong' wurde vom Secret Provider generiert und als Parameter '/mysql/kong/password' gespeichert. Das Passwort für den Root-Datenbankbenutzer wurde durch Abfrage des Parameters /mysql/root/password ermittelt. Wenn Sie nur einen Benutzer anlegen möchten, mit dem Sie sich am MySQL-Datenbankserver anmelden können, ohne eine Datenbank zu haben, geben Sie WithDatabase als false an.
Das Passwort für den Benutzer und die Datenbankverbindung kann direkt angegeben (Password) oder aus dem AWS Parameter Store (PasswordParameterName) entnommen werden. Wir empfehlen
, immer den Parameter Store zu verwenden.
Standardmäßig ist WithDatabase auf false an.
Wenn die Ressource gelöscht wird, wird das Benutzerkonto standardmäßig gesperrt (RetainPolicy ist auf Retain eingestellt). Wenn Sie den Benutzer (und die Daten) löschen möchten, setzen Sie RetainPolicy auf drop.
Wenn bereits ein Benutzer mit demselben Namen existiert, wird der Benutzer "adoptiert" und sein Kennwort wird geändert. Wenn WithDatabase angegeben ist und bereits eine Datenbank/ein Schema mit demselben Namen
existiert, erhält der Benutzer alle Rechte für die Datenbank.
Installation
Um diese benutzerdefinierte Ressource zu installieren, geben Sie ein:
export VPC_ID=$(aws ec2 --output text --query 'Vpcs[?IsDefault].VpcId' describe-vpcs)
export SUBNET_ID=$(aws ec2 --output text --query Subnets[0].SubnetId
describe-subnets --filters Name=vpc-id,Values=$VPC_ID)
export SG_ID=$(aws ec2 --output text --query "SecurityGroups[*].GroupId"
describe-security-groups --group-names default --filters Name=vpc-id,Values=$VPC_ID)
aws cloudformation create-stack
--capabilities CAPABILITY_IAM
--stack-name cfn-mysql-user-provider
--template-body file://cloudformation/cfn-custom-resource-provider.json
--parameters
ParameterKey=VPC,ParameterValue=$VPC_ID
ParameterKey=Subnet,ParameterValue=$SUBNET_ID
ParameterKey=SecurityGroup,ParameterValue=$SG_ID
aws cloudformation wait stack-create-complete --stack-name cfn-mysql-user-provider
Beachten Sie, dass dies die Standard-VPC, das Subnetz und die Sicherheitsgruppe verwendet. Da die Lambda-Funktion eine Verbindung zur Datenbank herstellen muss, müssen Sie
diesen benutzerdefinierten Ressourcenanbieter für jede VPC installieren, in der Sie Datenbankbenutzer erstellen möchten.
Diese CloudFormation-Vorlage verwendet unseren vorgefertigten Provider von s3://binxio-public/lambdas/cfn-mysql-user-provider-latest.zip.
Falls Sie dies noch nicht getan haben, installieren Sie bitte auch den geheimen Provider.
cd ..
git clone https https://github.com/binxio/cfn-secret-provider.git
cd cfn-secret-provider
aws cloudformation create-stack
--capabilities CAPABILITY_IAM
--stack-name cfn-secret-provider
--template-body file://cloudformation/cfn-custom-resource-provider.json
aws cloudformation wait stack-create-complete --stack-name cfn-secret-provider
Demo
Um das einfache Beispiel für die benutzerdefinierte Ressource zu installieren, geben Sie ein:
aws cloudformation create-stack --stack-name cfn-mysql-user-provider-demo
--template-body file://cloudformation/demo-stack.json
aws cloudformation wait stack-create-complete --stack-name cfn-mysql-user-provider-demo
Es wird eine MySQL-Datenbank zu Demozwecken erstellt, was ziemlich zeitaufwendig ist...
Fazit
Mit dieser Lösung können MySQL-Benutzer und Datenbankschemata genau wie die RDS-Instanz bereitgestellt werden, während die
Passwörter sicher im AWS Parameter Store gespeichert werden.
Wenn Sie Fragen haben, zögern Sie nicht, mich zu kontaktieren.
Verfasst von

Mark van Holsteijn
Mark van Holsteijn is a senior software systems architect at Xebia Cloud-native solutions. He is passionate about removing waste in the software delivery process and keeping things clear and simple.
Unsere Ideen
Weitere Blogs
Contact



