Zum Hauptinhalt springen

OPC Router mit LocalStack (ECS) einrichten

LocalStack bildet AWS-Dienste lokal nach. Dieses Szenario dient dazu, ein AWS-ECS-Deployment des OPC Routers auf dem eigenen Rechner zu erproben, bevor es in eine echte AWS-Umgebung übernommen wird – es ist ausdrücklich kein Produktivweg.

Hier wird beschrieben wie Sie den OPC Router containerisiert mit AWS ECS unter LocalStack betreiben können. Dabei verwenden wir Docker-Container, LocalStack (mit ECS- und ECR-Unterstützung) sowie die AWS-/awslocal-CLI. Wichtige Teile dieser Konfiguration (Ports, Volumes, Umgebungsvariablen etc.) basieren auf der weiter unten abgedruckten Beispiel-Task-Definition.

Voraussetzungen: Stellen Sie sicher, dass Docker Desktop auf dem lokalen Rechner installiert und aktiv ist. LocalStack benötigt eine funktionierende Docker-Installation. Installieren Sie außerdem die AWS-CLI und gegebenenfalls die LocalStack-CLI.

LocalStack Cloud-Konto & Auth-Token: Erstellen Sie ein kostenloses Konto unter app.localstack.cloud.

In Ihren Kontoeinstellungen generieren Sie, sofern eine entsprechende Lizenz vorliegt, einen Auth-Token. Dieser Auth-Token wird lokal benötigt, damit der Container die Cloud-Funktionen (z.B. ECS) freischaltet. Setzen Sie den Token in Ihrer Shell-Umgebung oder über eine Konfigurationsdatei. Der Auth-Token kann auch direkt beim folgenden Docker-Run mitangegeben werden.

LocalStack-Container starten: Laden Sie das offizielle LocalStack Docker-Image und starten Sie es mit Ihrem Auth-Token aus dem LocalStack-Cloud-Konto.

docker run -d --name localstack-pro \
-p 4566:4566 \
-e LOCALSTACK_AUTH_TOKEN=<your-auth-token> \
-v /var/run/docker.sock:/var/run/docker.sock \
localstack/localstack-pro

Der Befehl setzt den Auth-Token aus Ihrem Cloud-Konto und bindet den Docker-Socket in den Container ein; die Socket-Bindung ist für die ECS-Emulation erforderlich, weil LocalStack die Task-Container über den Docker-Daemon des Hosts startet.

hinweis

Bei Verwendung eines Auth-Tokens muss das Image localstack/localstack-pro verwendet werden. Die Dienste werden hier bewusst nicht über SERVICES eingeschränkt – diese Anleitung benötigt ECS und ECR.

Task-Definition (JSON) vorbereiten: Legen Sie im Arbeitsverzeichnis eine ECS-Task-Definition als JSON-Datei ab, z.B. als OPC_Router_localstack.json. Sie definiert den OPC Router-Container, seine CPU-/Memory-Anforderungen, das Port-Mapping und die Persistenz-Volumes:

OPC_Router_localstack.json
{
"family": "opcrouter-primary",
"networkMode": "bridge",
"containerDefinitions": [
{
"name": "opcrouter-primary",
"image": "opcrouter/runtime:latest",
"cpu": 3072,
"memory": 5120,
"essential": true,
"hostname": "opc-router-cluster",
"environment": [
{ "name": "OR_I_ACCEPT_EULA", "value": "true" },
{ "name": "TZ", "value": "Europe/Berlin" },
{ "name": "INITIAL_USERNAME", "value": "<username>" },
{ "name": "INITIAL_PASSWORD", "value": "<password>" },
{ "name": "OR_WEB_DISABLE_HTTPS", "value": "true" }
],
"portMappings": [
{
"containerPort": 8080,
"hostPort": 8081,
"protocol": "tcp"
}
],
"mountPoints": [
{ "containerPath": "/data", "sourceVolume": "opc-router-data" },
{ "containerPath": "/var/log/opcrouter", "sourceVolume": "opc-router-logs" }
],
"logConfiguration": { "logDriver": "json-file" }
}
],
"volumes": [
{ "name": "opc-router-data", "host": { "sourcePath": "/opt/opc-router-data" } },
{ "name": "opc-router-logs", "host": { "sourcePath": "/opt/opc-router-logs" } }
],
"requiresCompatibilities": ["EC2"],
"cpu": "3072",
"memory": "5120",
"runtimePlatform": {
"cpuArchitecture": "X86_64",
"operatingSystemFamily": "LINUX"
}
}

Das Port-Mapping veröffentlicht den Container-Port 8080 (Web Management) als Host-Port 8081. Die beiden Volumes binden die Host-Pfade /opt/opc-router-data und /opt/opc-router-logs auf die Mount-Pfade /data bzw. /var/log/opcrouter.

Sorgen Sie dafür, dass die im JSON genannten Host-Verzeichnisse existieren und schreibbar sind.

Task-Definition registrieren: Registrieren Sie die Task-Definition bei LocalStack. Beispiel:

aws --endpoint-url=http://localhost:4566 ecs register-task-definition --cli-input-json file://./OPC_Router_localstack.json

Diese erscheint nun in der LocalStack-Weboberfläche unter Resource Browser → ECS → Task Definitions. Lokal können Sie mit aws --endpoint-url=http://localhost:4566 ecs list-task-definitions überprüfen, dass die Definition vorhanden ist.

Service erstellen: Jetzt erzeugen Sie den ECS-Service, der den OPC-Router-Container auf Basis der Task-Definition startet. Dies kann über die LocalStack Web-UI erfolgen: Unter Resource Browser → ECS → Clusters → (Ihr Cluster, z.B. Default) → Services → Create Service geben Sie einen Service-Namen an, wählen die eben registrierte Task-Definition, setzen Desired Count auf 1 und bestätigen.

Nach Ausführung wird der Service aktiv und LocalStack erstellt einen Docker-Container entsprechend der Definition.

Überprüfung: Nach dem Erstellen des Services sollte ein neuer Docker-Container laufen. Überprüfen Sie dies in Docker Desktop oder per Shell(docker ps). Sie sollten einen Container mit dem Image opcrouter/runtime:latest sehen, das läuft.

Zusätzliche Hinweise:

  • Umgebungsvariablen: Achten Sie darauf, in der json-Datei OR_I_ACCEPT_EULA=true zu setzen, da der Container sonst nicht startet. Setzen Sie auch INITIAL_USERNAME und INITIAL_PASSWORD.

  • Volumes: Prüfen Sie, dass /opt/opc-router-data und /opt/opc-router-logs auf dem Host existieren, wenn sie in der Task-Definition gemountet sind.

  • Docker Desktop: Nach dem Start über LocalStack erscheint der Container in Docker Desktop (siehe auch Logs und Status dort).

Mit diesen Schritten ist der OPC Router in Ihrer lokalen LocalStack-ECS-Umgebung eingerichtet und kann wie gewohnt unter http://localhost:8081 oder einem anderen von Ihnen konfigurierten Port verwendet werden.