AWS-Kosten sauber zuordnen – durch automatisches Taggen Ihrer EC2-Workloads.
"John Doe"-Instances
Wer seine AWS-EC2-Nutzung durchgeht, stößt schnell auf Instances oder Volumes ohne Namen – oder, noch unangenehmer, mit einem Namen, der gar nichts aussagt. Solche Ressourcen sind entweder reine Geldverschwendung oder geschäftskritisch für produktive Workloads.

"DO NOT DELETE"-Instance vom Typ m3.2xlarge in us-east-1 für 388 USD/Monat
Solche Instances laufen mitunter seit Jahren, ohne dass im Unternehmen noch jemand weiß, wofür sie da sind oder wie man sich damit verbindet.
Um genau das zu verhindern, etablieren viele Unternehmen Tagging-Richtlinien: Jede neu bereitgestellte Instance muss Tags wie Name, Owner, Project usw. tragen.
Für das Taggen von EC2 Instances und Volumes fallen keine zusätzlichen Kosten an …
… in der Praxis starten Menschen jedoch Instances manuell oder per Automatisierungsskript – und schon schleichen sich Fehler ein.
Damit das nicht passiert, habe ich eine Lösung für AWS gebaut (und eine analoge für Google Cloud), die Instances automatisch mit dem Tag Owner und Volumes mit den Tags Owner und AttachedInstance versieht.
Stößt also künftig jemand auf eine Instance oder ein Volume mit unklarem Zweck, lässt sich anhand dieser Tags schnell nachvollziehen, wer die Ressource eingerichtet hat.
**Wie funktioniert das automatische Tagging?**

- Ein Nutzer legt eine AWS EC2 Instance an.
- AWS CloudTrail protokolliert die API-Aufrufe und ruft AWS EventBridge auf.
- AWS EventBridge stößt die Lambda-Funktion an.
- AWS Lambda taggt die Instance samt zugehöriger Volumes.
Sobald die AWS-Lambda-Funktion mit den Informationen zum Instance-Start ausgelöst wird, versieht sie die Instance mit dem Tag Owner. Dieser Tag enthält einen der folgenden Werte:
- IAM User
- Assume Role (z. B. AutoScaling Role, SSO User usw.)
- Root User

Instances-Seite, Tag am unteren Rand
Im nächsten Schritt taggt Lambda alle Volumes der Instance mit den Tags "Owner" und "AttachedInstance". Der "Owner"-Tag enthält dieselben Informationen wie der "Owner"-Tag der Instance; der "AttachedInstance"-Tag enthält die Instance-ID und – sofern vorhanden – den Instance-Namen.

Volumes-Seite, Tags am unteren Rand
So setzen Sie die Lösung um:
- Öffnen Sie die CloudTrail-Seite und klicken Sie auf "Create trail".

2. Vergeben Sie einen Namen für den Trail.

3. Scrollen Sie nach unten und legen Sie einen Namen für den CloudTrail-S3-Bucket fest. Klicken Sie anschließend auf Create.

4. Wechseln Sie zum Lambda-Dashboard und klicken Sie auf "Create function".

5. Vergeben Sie einen Namen für die Funktion, wählen Sie im Runtime-Dropdown "Python 3.8" und klicken Sie auf "Create Function".

6. Fügen Sie den Code aus dem GitHub-Repository ein und klicken Sie auf "Save".

7. Scrollen Sie zum Bereich "Basic settings" und klicken Sie auf Edit.
Setzen Sie das Timeout der Lambda-Funktion auf 1 Minute hoch.
Klicken Sie anschließend auf Save.

8. Scrollen Sie wieder nach oben und klicken Sie auf Permissions. Klicken Sie dann auf den Rollennamen.

9. Klicken Sie auf "Add inline policy".

10. Klicken Sie auf JSON, fügen Sie die folgende IAM-Policy ein und klicken Sie auf Review policy.
{
"Version": "2012-10-17",
"Statement": [\
{\
"Sid": "VisualEditor0",\
"Effect": "Allow",\
"Action": "ec2:CreateTags",\
"Resource": [\
"arn:aws:ec2:*:*:instance/*",\
"arn:aws:ec2:*:*:volume/*"\
]\
},\
{\
"Sid": "VisualEditor1",\
"Effect": "Allow",\
"Action": [\
"ec2:DescribeInstances",\
"ec2:DescribeVolumes"\
],\
"Resource": "*"\
}\
]
}
Mit dieser Policy darf die Lambda-Funktion die Volumes der Instance ermitteln und sowohl die Instance als auch ihre Volumes taggen.
11. Vergeben Sie einen Namen für die Policy und klicken Sie auf Create policy.

12. Wechseln Sie zurück zum Lambda-Tab im Browser und klicken Sie auf "Add trigger".

13. Klicken Sie auf "Select a trigger", suchen Sie nach EventBridge und klicken Sie im Dropdown Rule auf "Create a new rule".
Vergeben Sie einen Namen und eine Beschreibung für die Regel.
Wählen Sie unter "Rule type" das Optionsfeld Event pattern.
Wählen Sie im ersten Dropdown EC2 und im zweiten Dropdown AWS API call via CloudTrail.

14. Scrollen Sie nach unten, aktivieren Sie das Kontrollkästchen Operation und tragen Sie unter "Operation" RunInstances ein. Klicken Sie anschließend auf Add, um den Event-Trigger anzulegen.

15. Zum Schluss starten Sie eine neue Test-Instance, um zu prüfen, ob alles wie gewünscht funktioniert.
Nach wenigen Sekunden taggt die eben angelegte Lambda-Funktion die Instance und ihre Volumes automatisch.
Laden Sie die Seite neu und kontrollieren Sie die Tags der Instance.

Hinweise:
- Die Lösung taggt ausschließlich Instances, die nach der Installation der Lambda-Funktion neu angelegt werden.
- Direkt nach Aktivierung des CloudTrail-Trails kann es bis zu einer Stunde dauern, bis EventBridge die Funktion aufruft.
- Die Antwortgröße von CloudTrail ist auf 500 KB begrenzt. Starten Sie sehr viele Instances mit einem einzigen API-Aufruf, kann die Lambda-Funktion die Instances nicht taggen.
- AWS EventBridge ist eine regionale Ressource. Arbeiten Sie mit mehreren Regionen, müssen Sie die Lösung in jeder AWS-Region ausrollen.