IDIAL-Deployment auf AWS ECS Fargate
Überblick
Dieses Dokument beschreibt die vollständige Einrichtung von IDIAL auf AWS ECS Fargate.
Alle unsere Applikationen werden ausschließlich in der Region eu-central-1 (Frankfurt) deployed.
IDIAL besteht aus zwei Containern, die gemeinsam als einzelner ECS-Task ausgeführt werden:
| Container | Image | Port | Funktion |
|---|---|---|---|
| IDIAL | bxc2security/idial:v0.14 | 5000 | REST API + PKI |
| Web_Backend | bxc2security/idial-web-backend:latest | 5555 | Web UI |
Voraussetzungen
- AWS CLI installiert und konfiguriert (
aws configure) - DockerHub-Konto mit Zugriff auf das Repository
bxc2security
1. Secrets Manager konfigurieren
Alle Zugangsdaten werden im AWS Secrets Manager gespeichert. Es werden drei Secrets benötigt.
1.1 DockerHub-Zugangsdaten
GUI: AWS Console → Secrets Manager → Store a new secret
- Secret-Typ: Other type of secret
- Schlüssel/Wert:
username→ Ihr DockerHub-Benutzername (nicht die E-Mail-Adresse)password→ Ihr DockerHub Personal Access Token (nicht Ihr Anmeldepasswort)
- Secret-Name:
DockerHub
Erstellen Sie einen Personal Access Token über: Docker Hub → Account Settings → Personal access tokens → Generate new token
Berechtigung: Read-only ist ausreichend.

1.2 IDIAL PKCS8-Passwort
aws secretsmanager create-secret \
--name idial/pkcs8-pw \
--secret-string "YOUR_SECRET_VALUE" \
--region eu-central-1
1.3 Web-Backend-Secret-Key
aws secretsmanager create-secret \
--name idial/web-secret-key \
--secret-string "$(openssl rand -base64 32)" \
--region eu-central-1
Die resultierenden ARNs enthalten ein zufälliges Suffix (z. B. idial/pkcs8-pw-05u5Sl). Dies ist erwartetes Verhalten und wird in IAM-Richtlinien über Wildcards behandelt.
2. IAM-Rolle konfigurieren
Die ECS-Task-Execution-Role benötigt Zugriff auf alle drei Secrets.
2.1 Rolle prüfen
GUI: IAM → Roles → ecsTaskExecutionRole
Falls die Rolle nicht existiert:
aws iam create-role \
--role-name ecsTaskExecutionRole \
--assume-role-policy-document '{
"Version": "2012-10-17",
"Statement": [{
"Effect": "Allow",
"Principal": {"Service": "ecs-tasks.amazonaws.com"},
"Action": "sts:AssumeRole"
}]
}'
aws iam attach-role-policy \
--role-name ecsTaskExecutionRole \
--policy-arn arn:aws:iam::aws:policy/service-role/AmazonECSTaskExecutionRolePolicy
2.2 Secrets-Manager-Richtlinie hinzufügen
aws iam put-role-policy \
--role-name ecsTaskExecutionRole \
--policy-name idial-secrets-access \
--policy-document '{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "secretsmanager:GetSecretValue",
"Resource": [
"arn:aws:secretsmanager:eu-central-1:015955903887:secret:DockerHub*",
"arn:aws:secretsmanager:eu-central-1:015955903887:secret:idial/pkcs8-pw*",
"arn:aws:secretsmanager:eu-central-1:015955903887:secret:idial/web-secret-key*"
]
}
]
}' \
--region eu-central-1
Der *-Wildcard ist erforderlich, da Secrets Manager einen zufälligen Suffix an Secret-ARNs anhängt.
3. ECS-Cluster erstellen
GUI: ECS → Clusters → Create Cluster
- Cluster-Name:
IDIALCluster - Infrastruktur: AWS Fargate (serverless)
aws ecs create-cluster \
--cli-input-json file://ecs-cluster.json \
--region eu-central-1

4. Task Definition registrieren
Die Task Definition definiert beide Container, Umgebungsvariablen, Ports und Volumes.
GUI: ECS → Create new task definition

4.1 Container-Konfiguration

4.2 Volumes
Beide Container verwenden kurzlebigen Speicher (Ephemeral Storage). Daten gehen beim Neustart des Tasks verloren. Für Persistenz verwenden Sie EFS.
| Volume | Container | Pfad |
|---|---|---|
database_data | IDIAL | /app/sql |
device_certificates | IDIAL | /app/certs |
api_key | IDIAL | /app/secrets |
rest_tls | IDIAL | /app/tls |
idial_webapp_runtime_data | Web_Backend | /app/runtime_data |
idial_webapp_logs | Web_Backend | /app/logs |
idial_webapp_config | Web_Backend | /app/config |


5. Security Group konfigurieren
| Port | Protokoll | Quelle | Zweck |
|---|---|---|---|
| 5000 | TCP | Ihre IP /32 | REST API |
| 5555 | TCP | Ihre IP /32 | Web UI |
aws ec2 authorize-security-group-ingress \
--group-id <SECURITY_GROUP_ID> \
--ip-permissions '[
{"IpProtocol":"tcp","FromPort":5555,"ToPort":5555,"IpRanges":[{"CidrIp":"<YOUR_IP>/32"}]},
{"IpProtocol":"tcp","FromPort":5000,"ToPort":5000,"IpRanges":[{"CidrIp":"<YOUR_IP>/32"}]}
]'
6. Service erstellen und starten
GUI: ECS → Clusters → IDIALCluster → Services → Create
6.1 Subnetz und Security Group ermitteln
aws ec2 describe-subnets ...
aws ec2 describe-security-groups ...
Verwenden Sie ein öffentliches Subnetz (MapPublicIpOnLaunch = true).
6.2 ecs-service.json konfigurieren
{
"cluster": "IDIALCluster",
"serviceName": "idial",
"desiredCount": 1,
"launchType": "FARGATE"
}
6.3 Service erstellen

aws ecs create-service --cli-input-json file://ecs-service.json
6.4 Status prüfen
aws ecs describe-services --cluster IDIALCluster --services idial
7. Zugriff auf IDIAL
Ermitteln Sie die öffentliche IP des laufenden Tasks:
aws ecs list-tasks --cluster IDIALCluster --service-name idial
aws ecs describe-tasks --cluster IDIALCluster --tasks <TASK_ARN>
Öffnen Sie anschließend:
https://<PUBLIC_IP>:5555
8. Logs
aws logs describe-log-streams --log-group-name /ecs/idial
aws logs get-log-events --log-group-name /ecs/idial --log-stream-name <STREAM>
9. IDIAL API-Key
Beim ersten Start wird der API-Key in den Container-Logs ausgegeben:
IDIAL API key (save this now): XXXXX
Der API-Key geht beim Neustart des Tasks verloren. Kopieren Sie ihn unmittelbar nach dem ersten Start aus den Logs.
Fehlerbehebung
AccessDeniedException
Der ECS-Task kann die Secrets nicht lesen. Überprüfen Sie die IAM-Richtlinie in Abschnitt 2.2 – verifizieren Sie ARNs und Wildcard-Suffix.
401 Unauthorized
Falsche DockerHub-Zugangsdaten im Secrets Manager. Aktualisieren Sie das DockerHub-Secret mit einem gültigen Personal Access Token.
ERR_EMPTY_RESPONSE
- Stellen Sie sicher, dass Sie HTTPS verwenden (
https://, nichthttp://) - Überprüfen Sie, ob die Security Group eingehenden TCP-Verkehr auf Port 5555 von Ihrer IP erlaubt
- Prüfen Sie die Container-Logs:
aws logs get-log-events ...
IP-Adresse geändert
Wenn sich Ihre öffentliche IP-Adresse ändert, aktualisieren Sie die Security Group:
# Remove old rule
aws ec2 revoke-security-group-ingress \
--group-id <SG_ID> \
--ip-permissions '[{"IpProtocol":"tcp","FromPort":5555,"ToPort":5555,"IpRanges":[{"CidrIp":"<OLD_IP>/32"}]},{"IpProtocol":"tcp","FromPort":5000,"ToPort":5000,"IpRanges":[{"CidrIp":"<OLD_IP>/32"}]}]'
# Add new rule
aws ec2 authorize-security-group-ingress \
--group-id <SG_ID> \
--ip-permissions '[{"IpProtocol":"tcp","FromPort":5555,"ToPort":5555,"IpRanges":[{"CidrIp":"<NEW_IP>/32"}]},{"IpProtocol":"tcp","FromPort":5000,"ToPort":5000,"IpRanges":[{"CidrIp":"<NEW_IP>/32"}]}]'