Blog

Bereitstellen von MySQL-Benutzern und -Datenbanken mit AWS CloudFormation

Mark van Holsteijn

Mark van Holsteijn

Aktualisiert Oktober 21, 2025
3 Minuten

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 eingestellt, was bedeutet, dass ein Datenbankschema mit demselben Namen wie der Benutzer erstellt wird. Wenn Sie nur einen Benutzer erstellen möchten, geben Sie 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.

Contact

Let’s discuss how we can support your journey.