Automatisierung von AWS Organizations mit Terraform

Im ersten Teil unserer Artikelreihe haben wir die Grundlagen von Terraform erklärt. In diesem Teil setzen wir ein Projekt um: Wir verwalten unseren AWS Account, um Teams innerhalb unseres Unternehmens einen weitgehenden Zugang zur AWS Cloud zu ermöglichen, und dennoch die Teams und deren Ressourcen voneinander zu isolieren. Dank Terraform werden wir in der Lage sein, innerhalb von Minuten einheitliche AWS Umgebungen für beliebige Teams zu erstellen.

Ausgangssituation

Sie haben als Unternehmen bereits damit begonnen, AWS für Ihre Cloud-Strategie zu nutzen. Mehr und mehr Ihrer Mitarbeiter verwenden AWS um Projekte durchzuführen. Einigen Schwierigkeiten sind Sie mittlerweile möglicherweise bereits begegnet:

  • Mitarbeiter sehen die Ressourcen fremder Teams und können diese sogar verwalten
  • Welche Ressource zu welchem Projekt gehört ist nicht offensichtlich sichtbar. Tagging ist zwar möglich, wird aber nur inkonsequent umgesetzt.
  • Projekte und deren Ressourcen geraten in Vergessenheit und verursachen weiterhin Kosten

Im Kern sind diese Aufgaben bereits mit dem hauseigenen Feature AWS Organizations lösbar. Dieses erlaubt es, eigene vollwertige AWS Konten anzulegen. Einloggen können sich alle Mitarbeiter in das Hauptkonto, von welchem sie – je nach Berechtigung – in verschiedene Rollen der Unterkonten wechseln können. Die Abrechnung erfolgt automatisch über das Hauptkonto, die Kosten können nach Unterkonto aufgeschlüsselt werden.

Die Konfiguration der Unterkonten erfordert jedoch etwas Arbeit. Dazu gehört das hinzufügen von Rollen und die Zuweisung von Nutzerkonten zu Rollen.

Zielbild

Diese Arbeit werden wir mit Terraform automatisieren. Am Ende können wir uns ein Unterkonto komplett einrichten und konfigurieren, indem wir diese paar Zeilen zu unserer Konfiguration hinzufügen:

module "my_subaccount" {
  source        = "./modules/aws-account"
  account_name  = "my-account-name"
  email_address = "my-team@my-company.com"
  owner_users   = ["some-iam-username"]
  dev_users     = ["developer-a", "developer-b"]
  reader_users  = ["junior-developer-x", "manager-y"]
}

Dadurch werden wir in der Lage sein, AWS Konten innerhalb von Minuten zu erstellen.

Konzept: Wie wir unsere AWS Accounts strukturieren

Bevor wir auf die Terraform Details eingehen, entwerfen wir zunächst ein Konzept für die AWS Struktur. Im Folgenden führen wir die Einrichtung mithilfe der Oberfläche von AWS anstelle von Terraform durch.

Schritt 1 – AWS Sub-Account erstellen

Wir beginnen damit, einen Unteraccount zur Organisation hinzuzufügen. Dazu navigieren wir zur My Organizations Seite. Hier können wir unter Angabe einer E-Mail-Adresse einen neuen AWS Account anlegen, der mit dem bestehenden verknüpft ist. Als “IAM role name” tragen wir “owner” ein, da der Default Name etwas lang zu tippen ist.

Schritt 2 – Accounts wechseln

Wenn wir in unserem Root-Account angemeldet sind, können wir jederzeit über “Switch Roles” im Hauptmenü in unseren neuen Account wechseln. Im Formular wird dazu die unveränderliche Account ID angegeben, die auf der Seite My Organizations gelistet ist. “Role” ist der von uns bei der Erstellung des Kontos angegebene Rollenname (in unserem Fall “owner”)

Damit sich niemand diese ID merken muss, kann ein Account Alias angelegt werden. Hierzu wechseln wir zunächst in den gewünschten Unteraccount und nehmen die Einstellung im IAM Dashboard vor.

Schritt 3 – Rollenkonzept

Das Rechtemanagement in unserem Sub-Account findet über Rollen statt. Die Rolle “owner” wurde bei der Erstellung des Kontos angelegt. Sie verfügt über sämtliche Rechte. Unter IAM/Roles können wir neue Rollen anlegen. Wir wählen als “Type of trusted entity” “Another AWS account” und tragen die ID des Root-Accounts ein. Dadurch wird es später möglich sein, vom Root-Account aus diese Rolle anzunehmen. Mittels Policies stellen wir die gewünschten Berechtigungen für die Rolle ein.

Wir richten beispielsweise eine reader Rolle ein, die die AWS Policy ReadOnlyAccess zugewiesen bekommt, sowie eine dev Rolle, die die Policies ReadOnlyAccess, AmazonEC2FullAccess und AmazonS3FullAccess erhält.

Wenn alles korrekt eingerichtet wurde, kann bereits jetzt mit einem Administrator-Account vom Hauptkonto in die soeben angelegten Rollen gewechselt werden.

Schritt 4 – Rollenwechsel

Damit auch andere Nutzer in die Rollen des Sub-Accounts wechseln können, müssen wir IAM Einstellungen im Root-Account vornehmen.

Hier legen wir eine eigene Policy unter IAM/Policies an.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "sts:AssumeRole",
            "Resource": "arn:aws:iam::XXXXXXXXXXXX:role/ROLENAME"
        }
    ]
}

Ersetzen Sie XXXXXXXXXXXX durch die Account-ID des Sub-Accounts, sowie ROLENAME durch den Namen der Rolle im Sub-Account. Erstellen Sie eine Gruppe und weisen Sie die Policy der Gruppe zu. Nutzer, die auf die Rolle im Sub-Account dürfen, fügen Sie nun einfach der Gruppe hinzu.

Implementierung mit Terraform

Terraform Module

Einen AWS Account anzulegen und zu konfigurieren erfordert mehrere Terraform Ressourcen. Mehrere Ressourcen lassen sich mit Terraform Modulen zu einer logischen Einheit zusammenfassen. Jedes Verzeichnis mit einer Terraformkonfiguration ist ein Modul. Wir werden ein Terraform Modul schreiben, welches einen AWS Account erstellt und einrichtet. So können wir mehrere Accounts durch mehrere Verwendungen des Moduls erzeugen.

Schritt 0 – Projektstruktur

Wir beginnen mit einer einfachen Projektstruktur, die ein Modul im Verzeichnis modules/aws-account verwendet. Die Verzeichnisstruktur sieht folgendermaßen aus:

.
├── config.tf
├── main.tf
└── modules
    └── aws-account
        └── variables.tf

Der Inhalt der Dateien ist im diesen Artikel begleitendem GitHub Repository einsehbar. Jeder Commit im Repository stellt einen Schritt des Tutorials dar und ist alleine lauffähig. Sie können somit jeden Commit auschecken und die Daten in main.tf für Ihren Fall anpassen. Ein Aufruf von terraform apply führt die Änderungen aus und Sie können sich die Änderungen auch in der grafischen AWS Konsole ansehen.

terraform init initialisiert das Terraform Modul. Der Befehl muss jedes Mal ausgeführt werden, wenn ein neuer module Block hinzugefügt wird. terraform apply kann nun erfolgreich ausgeführt werden – auch wenn es noch keine tatächlichen Ressourcen erzeugt.

Code Schritt 0

Schritt 1 – AWS Sub-Account erstellen

Zunächst erstellen wir einen neuen AWS Organizations Account. Dies ist durch die Nutzung von aws_organizations_account sehr einfach möglich. Der Account Name und die E-Mail Adresse werden durch die Variablen bestimmt, die wir im letzten Schritt erstellt haben.

Wenn Sie bereits die AWS CLI genutzt haben, wird Terraform die Zugangsdaten unter $HOME/.aws/credentials verwenden. Falls Sie Probleme mit der Authentifizierung haben, greifen Sie bitte auf den Abschnitt “Authentication” in der Terraform Dokumentation zurück.

Code Schritt 1

Schritt 2 – Den Sub-Account verwalten und einen Account Alias anlegen

Der Code aus Schritt 1 führt Befehle im AWS Root Account aus. Für die weiteren Schritte ist es allerdings nötig, dass Befehle auch im Unteraccount ausgeführt werden können. Dazu legen wir einen zweiten Terraform Provider innerhalb des Moduls an. Mithilfe des assume_role Parameters können wir Terraform anweisen, im Sub-Account als die durch die role_arn definierte Rolle zu agieren. Der Provider kann in jeder AWS Terraform Ressource genutzt werden, indem der provider Parameter hinzugefügt wird.

Diesen Provider nutzen wir, um einen IAM Account Alias zu erstellen. Dadurch können wir nun unter Verwendung des Account Namens zum Account wechseln, anstatt die numerische AWS ID zu verwenden.

Code Schritt 2

Schritt 3 – Hinzufügen von Rollen und Berechtigungen

Mittels aws_iam_role und aws_iam_role_policy_attachment können wir Rollen mit unterschiedlichen Berechtigungen erstellen. Die Einstellung assume_role_policy ist erforderlich, damit der Root AWS Account die Rollen des Sub-Accounts nutzen darf. Diese wurde zuvor in der AWS UI durch einen Klick auf den Button “Type of trusted entity”: “Another AWS account” vorgenommen und wird jetzt von einem JSON Dokument übernommen, welches zuvor durch templatefile Funktion von Terraform vorverarbeitet wird, um die korrekte AWS Root Account ID einzusetzen.

Code Schritt 3

Schritt 4 – Rollenwechsel

Als Admin im Root Account kann man bereits jetzt in die Rolle wechseln, andere Nutzer können dies jedoch nicht. Um das zu ermöglichen, fügen wir neue Gruppen und Policies zum Root AWS Account hinzu. Wir gehen davon aus, dass die IAM Nutzer bereits angelegt sind und addressieren diese über ihren Namen. Neu hinzugefügte Variablen erlauben es uns, eine Zuordnung zwischen Nutzern und den gewünschten Rollen herzustellen. In der Datei roleswitch.tf befinden sich die Definitionen über die benötigten Gruppen, Policies und Zuweisungen der einzelnen Nutzern zu ihren Gruppen.

Code Schritt 4

In diesem Blogartikel wurde dargestellt, wie AWS Organizations dabei hilft ein konkretes Problem zu lösen und wie dieses mithilfe von Terraform automatisiert werden kann. Terraform erleichtert die Automatisierung der AWS Cloud. Bei weiteren Fragen zum Artikel bzw. zum Tutorial stehen wir Ihnen selbstverständlich zur Verfügung.

Im Rahmen unseres eoda | analytic infrastructure consultings sind wir Ihr Ansprechpartner für State-of-the-Art Technologien im Bereich Data Science. Gerne unterstützen wir auch Ihr Unternehmen bei der Arbeit mit modernen Cloud-Plattformen. Sprechen Sie uns an.