Zum Hauptinhalt springen

IDIAL-Deployment auf AWS ECS Fargate

Überblick

Dieses Dokument beschreibt die vollständige Einrichtung von IDIAL auf AWS ECS Fargate.

Region

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:

ContainerImagePortFunktion
IDIALbxc2security/idial:v0.145000REST API + PKI
Web_Backendbxc2security/idial-web-backend:latest5555Web 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.

AWS Secrets Manager – Store a new secret

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
hinweis

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
warnung

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

AWS ECS – Create Cluster


4. Task Definition registrieren

Die Task Definition definiert beide Container, Umgebungsvariablen, Ports und Volumes.

GUI: ECS → Create new task definition

Task Definition – Infrastructure & Launch type

4.1 Container-Konfiguration

Task Definition – Container settings

4.2 Volumes

Kurzlebiger Speicher

Beide Container verwenden kurzlebigen Speicher (Ephemeral Storage). Daten gehen beim Neustart des Tasks verloren. Für Persistenz verwenden Sie EFS.

VolumeContainerPfad
database_dataIDIAL/app/sql
device_certificatesIDIAL/app/certs
api_keyIDIAL/app/secrets
rest_tlsIDIAL/app/tls
idial_webapp_runtime_dataWeb_Backend/app/runtime_data
idial_webapp_logsWeb_Backend/app/logs
idial_webapp_configWeb_Backend/app/config

Task Definition – Volume configuration

Task Definition – Container mount points


5. Security Group konfigurieren

PortProtokollQuelleZweck
5000TCPIhre IP /32REST API
5555TCPIhre IP /32Web 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 ...
warnung

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

ECS – Create Service configuration

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
Sofort sichern

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://, nicht http://)
  • Ü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"}]}]'