Openflow einrichten – BYOC

Unter diesem Thema werden die Schritte zur Einrichtung von Openflow beschrieben.

Die Einrichtung von Openflow umfasst die folgenden Schritte:

Voraussetzungen

Folgende Voraussetzungen müssen für Ihre Snowflake- und AWS-Konten erfüllt sein:

Snowflake-Konto

Wenn Sie noch nie Image-Repositorys in Ihrem Snowflake-Konto verwendet haben, müssen Sie eine Datenbank, ein Schema und ein Image-Repository erstellen und dann dem Repository Berechtigungen gewähren, damit der Bereitstellungsdienst die Openflow-Images aus Snowflake abrufen kann. Dann definieren Sie Berechtigungen und legen Rollen fest.

  1. Um die Datenbank, das Schema und das Image-Repository zu erstellen und ihnen Berechtigungen zu gewähren, führen Sie diesen Code aus:

    USE ROLE ACCOUNTADMIN;
    
    CREATE DATABASE IF NOT EXISTS OPENFLOW;
    USE OPENFLOW;
    CREATE SCHEMA IF NOT EXISTS OPENFLOW;
    USE SCHEMA OPENFLOW;
    CREATE IMAGE REPOSITORY IF NOT EXISTS OPENFLOW;
    grant usage on database OPENFLOW to role public;
    grant usage on schema OPENFLOW to role public;
    grant read on image repository OPENFLOW.OPENFLOW.OPENFLOW to role public;
    
    Copy
  2. Um Berechtigungen auf Ebene des Snowflake-Kontos zu definieren, führen Sie den folgenden Code aus:

    USE ROLE ACCOUNTADMIN;
    
    GRANT CREATE OPENFLOW DATA PLANE INTEGRATION ON ACCOUNT TO ROLE $OPENFLOW_ADMIN_ROLE;
    GRANT CREATE OPENFLOW RUNTIME INTEGRATION ON ACCOUNT TO ROLE $OPENFLOW_ADMIN_ROLE;
    
    Copy

    Die neuen Berechtigungen werden dem ACCOUNTADMIN als Teil des Standardsatzes von Berechtigungen zugewiesen und diese Rolle kann die Berechtigungen einer Rolle der Wahl für die Openflow-Administratorrolle gewähren, die im Code mit $OPENFLOW_ADMIN_ROLE angegeben ist.

  • Um default_secondary_roles ALL für alle Openflow-Benutzende festzulegen, führen Sie den folgenden Code aus und ersetzen Sie dabei $OPENFLOW_USER im folgenden Code für jeden Openflow-Benutzer:

    USE ROLE ACCOUNTADMIN;
    ALTER USER $OPENFLOW_USER SET DEFAULT_SECONDARY_ROLES = ('ALL');
    
    Copy

Diese Einstellung ist erforderlich, da Openflow-Aktionen nicht nur mit der Standardrolle, sondern mit jeder Rolle des authentifizierten Benutzers autorisiert werden.

Berechtigungen für die Bereitstellungsintegration

Das Bereitstellungsintegrationsobjekt stellt eine Reihe von Ressourcen dar, die für die Bereitstellung einer oder mehrerer Snowflake Openflow-Laufzeiten bereitgestellt werden. Für Organisationen, die ihre eigenen Cloud-Ressourcen bereitstellen, stellt das Bereitstellungsintegrationsobjekt einen verwalteten Kubernetes-Cluster zusammen mit den zugehörigen Knoten dar.

Benutzer mit der Berechtigung CREATE DATA PLANE INTEGRATION für das Snowflake-Konto können die Bereitstellungsintegrationsobjekte erstellen und löschen.

Zusätzliche Berechtigungen können direkt auf den Integrationsobjekten definiert werden, um die Differenzierung des Zugriffs zu unterstützen.

Sie können die folgenden Berechtigungen für ein Bereitstellungsintegrationsobjekt vergeben:

  • OWNERSHIP: Ermöglicht die vollständige Kontrolle über Bereitstellungsaktionen für Objekte, einschließlich der Löschung der Bereitstellung.

  • USAGE: Ermöglicht die Erstellung von Laufzeit-Unterobjekten.

Laufzeitberechtigungen

Das Laufzeitobjekt stellt einen Cluster aus einem oder mehreren Snowflake Openflow-Laufzeitservern dar, die für die Ausführung von Ablaufdefinitionen bereitgestellt werden. Bei Kubernetes-Bereitstellungen stellt das Laufzeitobjekt einen statusabhängigen Satz von Snowflake Openflow Runtime-Containern dar, die zusammen mit unterstützenden Komponenten in einem Namespace bereitgestellt werden.

Benutzer mit der OWNERSHIP-Berechtigung für das übergeordnete Bereitstellungsintegrationsobjekt und der Berechtigung CREATE RUNTIME INTEGRATION auf Kontenebene können Laufzeitintegrationsobjekte erstellen. Zusätzliche Berechtigungen können direkt für Laufzeitintegrationsobjekte definiert werden, um eine Differenzierung des Zugriffs zu unterstützen.

Sie können die folgenden Berechtigungen für ein Laufzeitintegrationsobjekt vergeben:

  • OWNERSHIP: Ermöglicht die vollständige Kontrolle über Laufzeitaktionen, einschließlich des Löschens der zugehörigen Laufzeit und der Änderung von Laufzeitablaufdefinitionen.

  • USAGE: Ermöglicht Lesezugriff auf die bereitgestellte Laufzeitumgebung, um deren Zustand und Status zu überwachen, ohne Änderungen vorzunehmen.

Beispiel für die Einrichtung einer Rolle

Stellen Sie sich ein Szenario vor, in dem die folgenden Rollen eingerichtet werden sollten:

  • accountadmin: Sofort einsatzbereite Rolle von Snowflake, die über die diese beiden CREATE-Berechtigungen verfügt:

    • CREATE OPENFLOW DATA PLANE INTEGRATION

    • CREATE OPENFLOW RUNTIME INTEGRATION

  • deployment_manager: kann Bereitstellungen erstellen, verwalten und löschen.

  • deployment1_runtime_manager_1: kann eine Laufzeitumgebung nur innerhalb von Bereitstellung 1 erstellen. Sie kann eine Laufzeitumgebung ändern und löschen, die sie innerhalb von Bereitstellung 1 erstellt hat, aber keine Laufzeitumgebung, die von „deployment1_runtime_manager_2“ erstellt wurde.

  • deployment1_runtime_manager_2: kann eine Laufzeitumgebung nur innerhalb von Bereitstellung 1 erstellen. Sie kann eine Laufzeitumgebung ändern und löschen, die sie innerhalb von Bereitstellung 1 erstellt hat, aber keine Laufzeitumgebung, die von „deployment1_runtime_manager_1“ erstellt wurde.

  • deployment1_runtime_viewer_1: kann ein Laufzeit-Canvas innerhalb von Bereitstellung 1 anzeigen, das von „deploy1_runtime_manager_1“ erstellt wurde.

  • deployment1_runtime_viewer_2: kann ein Laufzeit-Canvas innerhalb von Bereitstellung 1 anzeigen, das von „deploy1_runtime_manager_1“ erstellt wurde.

  • deployment2_runtime_manager: kann eine Laufzeitumgebung nur innerhalb von Bereitstellung 2 erstellen.

  • deployment2_runtime_viewer: kann ein Laufzeit-Canvas innerhalb von Bereitstellung 2 anzeigen.

Um Openflow mit diesen Rollen einzurichten, gehen Sie wie folgt vor:

  1. Erstellen Sie neue Rollen und zuweisen die entsprechenden Berechtigungen zu:

    use role accountadmin;
    create role if not exists deployment_manager;
    create role if not exists deployment1_runtime_manager_1;
    create role if not exists deployment1_runtime_manager_2;
    create role if not exists deployment1_runtime_viewer_1;
    create role if not exists deployment1_runtime_viewer_2;
    create role if not exists deployment2_runtime_manager;
    create role if not exists deployment2_runtime_viewer;
    
    
    -- Assign create deployment privilege to roles. (This privilege cannot be granted in Openflow UI.)
    
    grant create openflow data plane integration on account to role deployment_manager;
    
    
    -- Assign create runtime privilege to roles. (This privilege cannot be granted in the Control Pane UI.)
    
    grant create openflow runtime integration on account to role deployment1_runtime_manager_1;
    grant create openflow runtime integration on account to role deployment1_runtime_manager_2;
    grant create openflow runtime integration on account to role deployment2_runtime_manager;
    
    -- Grant roles to users. (Repeat this step for each user.)
    
    grant role <role name> to user <username>;
    
    Copy
  2. Um eine Bereitstellung zu erstellen, gehen Sie folgendermaßen vor:

    1. Melden Sie sich bei Snowsight als deployment_manager an.

    2. Wählen Sie im Navigationsmenü die Option Ingestion » Openflow aus.

    3. Um Bereitstellung 1 zu erstellen, wählen Sie Create a deployment aus und gewähren Sie „deployment1_runtime_manager_1“ und „deployment1_runtime_manager_2“ die USAGE-Berechtigung.

    4. Um Bereitstellung 2 zu erstellen, wählen Sie Create a deployment aus und gewähren Sie „deployment2_runtime_manager“ die USAGE-Berechtigung.

  3. Um eine Laufzeitumgebung in Bereitstellung 1 zu erstellen, gehen Sie wie folgt vor:

    1. Melden Sie sich als deployment1_runtime_manager_1 an.

    2. Erstellen Sie eine Laufzeitumgebung wie in den folgenden Abschnitten beschrieben. deployment1_runtime_manager_1 sollte in der Lage sein, Laufzeitumgebungen zu erstellen und alle von ihm innerhalb dieser Bereitstellung erstellten Laufzeitumgebungen zu verwalten.

    3. Wählen Sie in der Openflow-UI deployment1_runtime_viewer_1 und erteilen Sie ihm die USAGE-Berechtigung.

AWS-Konto

Stellen Sie auf Ihrem AWS-Konto Folgendes sicher:

  • Sie haben ein AWS-Konto mit den erforderlichen Berechtigungen, um einen CloudFormation-Batch zu erstellen.

  • Ein AWS-Administrator in Ihrer Organisation kann das CloudFormation-Skript zur Einrichtung des Amazon Elastic Kubernetes Service (EKS) innerhalb einer neuen VPC (erstellt von CloudFormation) oder einer bestehenden VPC ausführen. Siehe Voraussetzungen für BYO-VPC (vorhandene VPC).

Bemerkung

Wie die Openflow-Installation in Ihrem AWS-Konto abläuft und welche Berechtigungen durch die CloudFormation-Vorlage konfiguriert werden, erfahren Sie unter Installationsprozess.

Voraussetzungen für BYO-VPC (vorhandene VPC)

Wenn Sie eine bestehende VPC und Ihre eigenen privaten Subnetze verwenden möchten, stellen Sie sicher, dass Sie über Folgendes verfügen:

  • Eine VPC

  • Ein Internet Gateway, das mit der VPC verbunden ist

  • Zwei öffentliche Subnetze in verschiedenen Verfügbarkeitszonen:

    • Die öffentlichen Subnetze sollten mindestens einen /27 CIDR-Bereich mit 32 IPs für öffentliche Subnetze umfassen.

    • Beide öffentlichen Subnetze sollten Routen für das Ziel 0.0.0.0/0 und das Ziel-Internet-Gateway haben.

    • Die öffentlichen Subnetze müssen sich in verschiedenen Verfügbarkeitszonen befinden, da der AWS Network Load Balancer hohe Verfügbarkeit erfordert.

    • Die öffentlichen Subnetze müssen wie folgt getaggt werden, damit der AWS Load Balancer erstellt werden kann:

      • Schlüssel: kubernetes.io/role/elb

      • Wert: 1

  • Ein NAT-Gateway mit dem Konnektivitätstyp „Public“, das an ein öffentliches Subnetz angeschlossen ist.

  • Zwei private Subnetze in verschiedenen Verfügbarkeitszonen.

    • Die Subnetze sollten mindestens einen von /24 CIDR-Bereich mit 256 verfügbaren IPs-Adressen zur Zuweisung haben. Dies schränkt die Anzahl und den Umfang der Laufzeiten ein, die Sie erstellen können, sodass es möglicherweise sinnvoller ist, einen größeren Bereich für die Bereitstellung zu verwenden.

    • Jedes private Subnetz benötigt einen Routing-Tabelleneintrag für 0.0.0.0/0 zum NAT-Gateway im öffentlichen Subnetz.

    • Diese Subnetze müssen sich in verschiedenen Verfügbarkeitszonen befinden, was eine Voraussetzung für die EKS-Bereitstellung ist.

Hinweise:

  • Der Openflow-Bereitstellungsagent läuft im Private Subnet 1, das an ein Internet-Gateway gebunden sein muss. Andernfalls wird es nicht initialisiert oder ordnungsgemäß eingerichtet, und es wird keine Infrastruktur zur Verfügung gestellt.

  • Ohne ein öffentliches NAT-Gateway, das von den privaten Subnetzen aus geroutet werden kann, haben Ressourcen wie der EKS-Cluster keinen Zugang zum Internet. Außerdem kann der Bereitstellungsagent die Openflow-Bereitstellung nicht installieren.

Akzeptieren Sie die Openflow-Servicebedingungen

Dieser Schritt ist für Ihre Organisation nur einmal erforderlich.

  1. Melden Sie sich bei Snowflake als Benutzer mit der Rolle ORGADMIN an.

  2. Wählen Sie im Navigationsmenü die Option Ingestion » Openflow aus.

  3. Akzeptieren Sie die Openflow-Servicebedingungen.

Erstellen einer Bereitstellung in Ihrer Cloud

Konfigurieren der Bereitstellung in Ihrem Snowflake-Konto

Wichtig

Ein Benutzer mit der Standardrolle ACCOUNTADMIN, ORGADMIN, GLOBALORGADMINoder SECURITYADMIN kann sich nicht bei Openflow anmelden. Sie müssen die Standardrolle ändern. Weitere Informationen dazu finden Sie unter Voraussetzungen.

  1. Melden Sie sich bei Snowflake mit einer Rolle an, die Sie ACCOUNTADMIN für die Verwendung von Openflow zugewiesen hat.

  2. Wählen Sie im Navigationsmenü die Option Ingestion » Openflow aus.

  3. Wählen Sie Launch Openflow aus.

  4. Wählen Sie in der Openflow-UI Create a deployment aus.

  5. Wählen Sie auf der Registerkarte Deployments die Option Create a deployment aus. Der Assistent Erstellen einer Bereitstellung wird geöffnet.

  6. Vergewissern Sie sich im Schritt Prerequisites, dass Sie alle Anforderungen erfüllen, und wählen Sie dann Next weiter.

  7. Wählen Sie im Schritt Deployment location die Option Amazon Web Services als Bereitstellungsort aus, geben Sie einen Namen für Ihre Bereitstellung ein und wählen Sie dann aus Next aus.

  8. Wählen Sie im Schritt Configuration eine der folgenden Optionen aus:

    • Managed VPC: Wählen Sie diese Option, wenn Ihre VPC von Snowflake verwaltet werden soll.

    • Bring your own VPC: Wählen Sie diese Option, wenn Sie eine vorhandene VPC verwenden möchten.

Anwenden der CloudFormation-Vorlage in IhremAWS-Konto

  1. Erstellen Sie in Ihrem AWS-Konto mit der Vorlage einen neuen CloudFormation-Stapel. Nachdem die Amazon Elastic Compute Cloud (EC2)-Instanz des Openflow-Bereitstellungagenten erstellt wurde, schließt er den Rest des Installationsprozesses unter Verwendung von Infrastruktur-als-Code-Skripten ab. Sie können den Installationsfortschritt wie unter Verfolgen des Installationsfortschritts beschrieben verfolgen.

    Wenn Sie eine vorhandene VPC verwenden, wählen Sie beim Hochladen der CloudFormation-Vorlage die entsprechenden Werte in den Dropdown-Listen für die beiden privaten Subnetze und Ihre VPC aus.

Erstellen einer Netzwerkregel für Openflow in Ihrem Snowflake-Konto

Dieser Schritt ist nur dann erforderlich, wenn Sie Netzwerkrichtlinien verwenden, um den Zugriff auf Snowflake zu steuern. Eine Netzwerkrichtlinie besteht aus Regeln, die steuern, welche IP-Adresse auf Ihr Snowflake-Konto zugreifen können.

  1. Navigieren Sie zu Ihrem Snowflake Konto.

  2. Identifizieren Sie die öffentliche NAT-Gateway-IP-Adresse, die als Teil des CloudFormation-Stapels erstellt wurde. Sie finden diese entweder, indem Sie in der AWS-Konsole nach NAT-Gateway suchen oder die Ausgabe des CloudFormation-Stapels überprüfen.

    Das NAT-Gateway ist für ausgehenden Openflow-Datenverkehr sowohl für Data Plane Agent (DPA) als auch EKS verantwortlich. Sowohl DPA als auch EKS werden im privaten Subnetz 1 der Installation ausgeführt.

  3. Erstellen Sie eine Netzwerkregel für Openflow und fügen Sie sie zu Ihrer bestehenden Netzwerkrichtlinie hinzu. Ersetzen Sie {$NAT_GATEWAY_PUBLIC_IP} im folgenden Codeausschnitt durch die öffentliche NAT-Gateway-IP-Adresse, die als Teil des CloudFormation-Stapels erstellt wurde.

    USE ROLE ACCOUNTADMIN;
    USE DATABASE {REPLACE_WITH_YOUR_DB_NAME};
    
    CREATE NETWORK RULE allow_openflow_deployment
    MODE = INGRESS
    TYPE = IPV4
    VALUE_LIST = ('{$NAT_GATEWAY_PUBLIC_IP}/32');
    
    Copy
  4. Suchen Sie Ihre derzeit aktive Netzwerkrichtlinie.

    SHOW PARAMETERS LIKE 'NETWORK_POLICY' IN ACCOUNT;
    
    Copy
  5. Kopieren Sie die Wertspalte aus der Ausgabe und verwenden Sie sie, um eine Netzwerkregel zu erstellen:

    ALTER NETWORK POLICY {ENTER_YOUR_ACTIVE_NETWORK_POLICY_NAME} ADD ALLOWED_NETWORK_RULE_LIST = (allow_openflow_deployment);
    
    Copy

Einrichten einer Ereignistabelle zum Protokollieren von Openflow-Ereignissen (erforderlich)

Verwenden Sie eine der folgenden Optionen, um eine Ereignistabelle einzurichten:

  • Erstellen Sie eine neue Openflow-spezifische Ereignistabelle (empfohlen):

    USE ROLE accountadmin;
    GRANT create event table
      on schema OPENFLOW.OPENFLOW
      to role $ROLE_OF_DEPLOYMENT_OWNER;
    USE ROLE $ROLE_OF_DEPLOYMENT_OWNER;
    CREATE event table if not exists openflow.openflow.openflow_events;
    -- Find the Data Plane Integrations
    SHOW openflow data plane integrations;
    ALTER openflow data plane integration
      $OPENFLOW_DATAPLANE_NAME
      SET event_table = 'openflow.openflow.openflow_events';
    
    Copy
  • Erstellen Sie eine kontospezifische Ereignistabelle:

    USE database openflow;
    CREATE schema if not exists openflow.telemetry;
    CREATE event table if not exists openflow.telemetry.events;
    ALTER ACCOUNT SET EVENT_TABLE = openflow.telemetry.events;
    
    Copy
  • Verwenden Sie eine vorhandene kontospezifische Ereignistabelle:

    USE ROLE accountadmin;
    ALTER ACCOUNT SET EVENT_TABLE = 'existing_database.existing_schema.existing_event_table';
    
    Copy

Verifizieren der Bereitstellung

  1. Navigieren Sie zur Openflow-UI. Die Erstellung einer Bereitstellung auf AWS dauert etwa 45 Minuten. Sobald sie erstellt ist, können Sie Ihre Bereitstellung auf der Registerkarte „Deployments“ der Openflow-UI mit dem Status Active anzeigen.

Erstellen einer Laufzeitumgebung in Ihrer Cloud

  1. Wählen Sie in Openflow Control Plane die Option Create a runtime aus. Das Dialogfeld Create Runtime wird geöffnet.

  2. Wählen Sie in der Dropdown-Liste Deployment die Bereitstellung, in der Sie eine Laufzeit erstellen möchten.

  3. Geben Sie einen Namen für Ihre Laufzeit ein.

  4. Wählen Sie einen Knotentyp aus der Dropdown-Liste Node type aus. Hier wird die Größe Ihrer Knoten angegeben.

  5. Wählen Sie im Min/Max node-Bereichsselektor einen Bereich aus. Der Mindestwert gibt die Anzahl der Knoten an, mit denen die Laufzeit im Leerlauf startet, und der Höchstwert gibt die Anzahl der Knoten an, auf die die Laufzeit bei hohem Datenvolumen oder hoher CPU-Auslastung hochskaliert werden kann.

  6. Wählen Sie Create aus. Es dauert ein paar Minuten, bis die Laufzeit erstellt ist.

Nach der Erstellung können Sie Ihre Laufzeit anzeigen, indem Sie zur Registerkarte Runtimes der Openflow-Kontrollebene navigieren. Klicken Sie auf die Laufzeit, um das Openflow-Canvas zu öffnen.

Nächster Schritt

Setzen Sie einen Konnektor in einer Laufzeit ein. Eine Liste der in Openflow verfügbaren Konnektoren finden Sie unter Openflow-Konnektoren.

Überlegungen zur Vernetzung: Openflow EKS zu den Quellsystemen

Für BYOC-Bereitstellungen müssen Sie die folgenden Hinweise beachten:

  • Der Openflow CloudFormation-Stack erstellt eine VPC mit zwei öffentlichen und zwei privaten Subnetzen.

  • Öffentliche Subnetze hosten den AWS Network Load Balancer, der später erstellt wird. Private Subnetze hosten den EKS-Cluster und alle EC2-Instanzen, die die Knotengruppen unterstützen. Openflow-Laufzeitumgebungen werden innerhalb vom privaten Subnetz 1 ausgeführt.

  • Das NAT-Gateway ist derzeit der Ausgang sowohl für DPA als auch für EKS. Sowohl DPA als auch EKS laufen im privaten Subnetz 1 der Installation.

Für BYO-VPC-Bereitstellungen müssen Sie die folgenden Hinweise beachten:

  • Für Openflow müssen Sie die beiden privaten Subnetze, in denen Openflow ausgeführt wird, und die beiden öffentlichen Subnetze für den AWS Load Balancer angeben.

  • Sie müssen Ihr eigenes Ausgangsrouting zum Internet von diesen privaten Subnetzen bereitstellen, die das zentrale NAT-Gateway sein können.

  • Von Openflow wird kein Internet-Gateway erstellt. Sie müssen ein geeignetes öffentliches Internet-Routing für den ausgehenden Datenverkehr bereitstellen.

Die Netzwerkkonnektivität ist im Allgemeinen wie folgt: Eine Openflow-EC2-Instanz (Agent oder EKS) wird in einem privaten Subnetz mit einem Routentabellen-Eintrag ausgeführt, der Datenverkehr an das NAT-Gateway sendet. Dieses NAT-Gateway verwendet das Internet-Gateway für den Internetzugang (sowohl zu Snowflake als auch zu anderen Diensten).

Beispiel: Einsatz von BYOC mit einer neuen VPC zur Kommunikation mit RDS in einem anderen VPC desselben Kontos

Um die Kommunikation zwischen dem Openflow EKS-Cluster und der RDS-Instanz zu ermöglichen, müssen Sie eine neue Sicherheitsgruppe erstellen, wobei die EKS-Cluster-Sicherheitsgruppe als Quelle für die eingehende Regel für die RDS-Konnektivität dient, und die Gruppe in RDS hinzufügen.

  1. Suchen Sie die EKS-Cluster-Sicherheitsgruppe, navigieren Sie zu EKS und suchen Sie Ihren Bereitstellungsschlüssel. Sie finden es auch in der Openflow UI, indem Sie die folgenden Schritte ausführen:

    1. Melden Sie sich bei Openflow an.

    2. Gehen Sie auf die Registerkarte Deployments.

    3. Wählen Sie das Symbol „Weitere Optionen“ neben Ihrer Bereitstellung.

    4. Wählen Sie View details aus. Der Wert im Feld Key ist Ihr Bereitstellungsschlüssel.

  2. Nachdem Sie den Bereitstellungsschlüssel gefunden haben, können Sie ihn verwenden, um Ihre AWS-Ressourcen nach dem Schlüsselwert zu filtern.

  3. Erstellen Sie eine neue Sicherheitsgruppe, die den Zugriff über den entsprechenden Port der Datenbank (standardmäßig 5432 im Fall von PostgreSQL) auf den Openflow EKS-Cluster erlaubt.

  4. Fügen Sie sie in RDS als neue Sicherheitsgruppe hinzu.

Wenn Sie eine Fehlersuche durchführen müssen, kann der Reachability Analyzer nützlich sein. Sie erhalten detaillierte Informationen darüber, was die Konnektivität blockiert, indem Sie die Ablaufverfolgungsfunktionen innerhalb der AWS-Plattform nutzen.

Siehe die folgenden AWS-Dokumente für den Zugriff auf DB-Instanzen über VPC-Peering und die damit verbundene Konfiguration der Sicherheitsgruppe:

Konfigurieren von privaten Bereitstellungen

Private Bereitstellungen sind ein Feature, mit dem Sie Openflow in einer VPC bereitstellen können, ohne dass ein öffentlicher Internet-Eingang oder - Ausgang erforderlich ist.

Um private Bereitstellungen zu konfigurieren, müssen Sie beim Erstellen einer neuen Bereitstellung die folgenden Optionen wählen:

  1. Im Schritt Deployment location wählen Sie Amazon Web Services als Bereitstellungsort aus.

  2. Im Schritt VPC Configuration wählen Sie Bring your own VPC aus, um eine vorhandene VPC zu verwenden.

  3. Im Schritt PrivateLink aktivieren Sie das PrivateLink-Feature. Das Aktivieren dieser Option erfordert zusätzliche Einstellungen in Ihrem AWS-Konto. Weitere Informationen finden Sie unter Konfigurieren von PrivateLink in AWS. Die Option End user authentication over PrivateLink kann aktiviert oder deaktiviert werden.

  4. Im Schritt Custom ingress aktivieren Sie das Feature für kundenspezifischen Dateneingang. Das Aktivieren dieser Option erfordert zusätzliche Einstellungen in Ihrem AWS-Konto. Weitere Informationen dazu finden Sie unter Konfigurieren von kundenspezifischem Dateneingang in AWS.

Für private Bereitstellungen muss Ihre vorhandene VPC auf die folgenden Domänen zugreifen können:

  • *.amazonaws.com, eine detaillierte Liste der Dienste, auf die zugegriffen wird, umfasst:

    • com.amazonaws.iam

    • com.amazonaws<your-region>.s3

    • com.amazonaws<your-region>.ec2

    • com.amazonaws<your-region>.ecr.api

    • com.amazonaws<your-region>.ecr.dkr

    • com.amazonaws<your-region>.secretsmanager

    • com.amazonaws<your-region>.sts

    • com.amazonaws<your-region>.eks

    • com.amazonaws<your-region>. autoscaling

  • *.privatelink.snowflakecomputing.com

  • odc-ets.<your-region>.api.aws

Konfigurieren von kundenspezifischem Dateneingang in AWS

Das Feature für kundenspezifischen Dateneingang in Openflow ist im Bereitstellungsassistenten verfügbar, wenn Sie eine Openflow-Bereitstellung erstellen. Wenn es ausgewählt ist, müssen Sie einen voll qualifizierten Domänennamen (FQDN) angebe, den Openflow als Hostnamen für die Bereitstellung verwendet. Diese Option löst bestimmte Aktionen innerhalb des Openflow-Bereitstellungsprozesses aus, um einen privaten Load Balancer zu erstellen, den Sie mit Ihren eigenen öffentlichen Eingangsanforderungen integrieren können.

Wenn die CloudFormation-Vorlage wird erstellt, verwendet sie den im Bereitstellungsassistenten angegebenen FQDN. Diese Version der CloudFormation-Vorlage geht davon aus, dass Sie die hier aufgeführten Anweisungen befolgen, um den Eingang zu Openflow-Laufzeitumgebungen wie gewünscht zu verwalten.

Wenn Sie den kundenspezifischen Dateneingang aktivieren, verwaltet Openflow nicht mehr automatisch externe DNS-Datensätze, erstellt nicht automatisch einen öffentlichen Load Balancer und verwaltet keine Zertifikate mehr für die Openflow-Laufzeitumgebungen.

Für die Konfiguration des kundenspezifischen Eingangs müssen die folgenden Schritte ausgeführt werden:

  1. Aktivieren Sie den kundenspezifischen Dateneingang während der Erstellung einer Bereitstellung.

    • Aktivieren Sie während der Erstellung der Bereitstellung die Option Custom ingress und geben Sie Ihren bevorzugten vollqualifizierten Domänennamen (FQDN) im Feld Hostname an.

  2. Wenden Sie die CloudFormation-Vorlage an und warten Sie, bis der interne Network Load Balancer erstellt ist.

    • Sie finden den internen Network Load Balancer in der AWS-Konsole unter EC2 » Load Balancers.

    • Der Load Balancer trägt den Namen runtime-ingress-{deployment-key}, wobei {deployment-key} der Schlüssel Ihrer Openflow-Bereitstellung ist.

  3. Stellen Sie ein TLS-Zertifikat bereit.

    • Beziehen Sie ein TLS-Zertifikat für den Load Balancer, das den Datenverkehr zu den Openflow-Laufzeitumgebungs-UIs verwaltet. Sie können ein Zertifikat entweder mit dem AWS-Zertifikatsmanager (ACM) generieren oder ein vorhandenes Zertifikat importieren.

  4. Beziehen Sie die interne IP-Adresse Ihres internen Network Load Balancers.

    • Nachdem der Load Balancer erstellt wurde, navigieren Sie zur Detailseite, und kopieren Sie den DNS name des Load Balancers.

    • Melden Sie sich bei Ihrer EC2-Agenteninstanz (angegeben als openflow-agent-{deployment-key}) an, und führen Sie den Befehl nslookup {internal-load-balancer-dns-name} aus.

    • Kopieren Sie die IP-Adressen des Load Balancers. Diese werden in einer Zielgruppe für den externen Load Balancer verwendet.

  5. Erstellen Sie den Load Balancer.

    1. Erstellen Sie in Ihrem AWS-Konto einen Network Load Balancer mit der folgenden Konfiguration:

      • Name: Wir empfehlen die Namenskonvention custom-ingress-external-{deployment-key}, wobei {deployment-key} der Schlüssel Ihrer Openflow-Bereitstellung ist.

      • Typ: Network Load Balancer

      • Schema: Internet-facing

      • VPC: Wählen Sie die VPC Ihrer Bereitstellung

      • Verfügbarkeitszonen: Wählen Sie beide Verfügbarkeitszonen aus, in denen Ihre Openflow-Bereitstellung ausgeführt wird.

      • Subnetze: Wählen Sie die öffentlichen Subnetze Ihrer VPC aus

      • Sicherheitsgruppen: Wählen oder erstellen Sie eine Sicherheitsgruppe, die Datenverkehr über Port 443 zulässt

      • Zielgruppe: Erstellen Sie eine neue Zielgruppe mit den folgenden Einstellungen:

        • Zieltyp: IP addresses

        • Protokoll: TLS

        • Port: 443

        • VPC: Stellen Sie sicher, dass die VPC zu Ihrer Bereitstellung passt

        • Geben Sie die IP-Adresse Ihres internen Network Load Balancers (im vorherigen Schritt ermittelt) als Ziel an und klicken Sie auf Include as pending below.

    • Standardmäßig verwendetes SSL/TLS-Serverzertifikat: Importieren Sie Ihr SSL/TLS-Zertifikat

    1. Sobald der Load Balancer erstellt ist, kopieren Sie den DNS-Namen für den Load Balancer. Dieser DNS-Name wird zur Konfiguration Ihres DNS für den Zugriff auf die Openflow-Laufzeitumgebungs-UIs verwendet.

    Weitere Informationen zum Erstellen eines Load Balancers finden Sie unter Erstellen eines Network Load Balancers.

  6. Erstellen Sie DNS-Datensätze für den Load Balancer.

    • Erstellen Sie einen CNAME-Datensatz in Ihrer DNS-Konfiguration, die Ihren FQDN zum externen DNS-Namen des AWS Load Balancers zuordnet.

    • Detaillierte DNS-Konfigurationsanweisungen in Route 53 finden Sie unter Erstellen von Datensätzen in Route 53.

Installationsprozess

Zwischen dem CloudFormation-Stack und dem Openflow Agent gibt es mehrere koordinierte Schritte, die der BYOC-Bereitstellungsinstallationsprozess verwaltet. Das Ziel besteht darin, die Zuständigkeiten zwischen einem Kaltstart, der Unternehmen eine einfache Möglichkeit bietet, Eingaben für ihre BYOC-Bereitstellung zu liefern (gelöst über CloudFormation), und der Konfiguration der Bereitstellung und ihrer Kernsoftwarekomponenten, die im Laufe der Zeit geändert werden müssen (gelöst durch den Openflow Agent), zu trennen.

Der Bereitstellungsagent erleichtert die Erstellung der Openflow-Bereitstellungsinfrastruktur und die Installation der Bereitstellungssoftwarekomponenten, einschließlich des Bereitstellungsdienstes. Der Bereitstellungsagent authentifiziert sich bei der Snowflake System Image Registry, um Openflow-Container-Images zu erhalten.

Die Schritte sind wie folgt:

Bemerkung

Wenn Sie BYO-VPC verwenden, wählen Sie eine VPC-ID und zwei private Subnetz-IDs aus der Vorlage aus, und der CloudFormation-Stapel verwendet die ausgewählten Ressourcen, anstatt die in den Schritten 1a, 1b und 1c genannten Ressourcen zu erstellen.

  1. Die Vorlage CloudFormation erstellt Folgendes und konfiguriert mit den in Konfigurierte AWS-Berechtigungen erwähnten AWS-Berechtigungen:

    1. Eine VPC mit zwei öffentlichen Subnetzen und zwei privaten Subnetzen. Öffentliche Subnetze hosten den AWS Network Load Balancer (wird später erstellt). Private Subnetze hosten den EKS-Cluster und alle EC2-Instanzen, die NodeGroups unterstützen. Openflow-Laufzeiten laufen innerhalb eines privaten Subnetzes.

    2. Internet Gateway für den Austritt aus der VPC

    3. NAT-Gateway für den Austritt aus den privaten Subnetzen

    4. AWS Secrets Manager-Eintrag für die vom Benutzer eingegebene OIDC-Konfiguration

    5. IAM-Rolle und Instanzprofil für den Openflow-Agent, die von seiner EC2-Instanz verwendet werden sollen

    6. Eine EC2-Instanz für den Openflow-Bereitstellungsagenten, komplett mit einem UserData-Skript, um den Initialisierungsprozess automatisch auszuführen. Dieses Skript setzt Umgebungsvariablen für den Openflow-Bereitstellungsagenten, die von den eingegebenenCloudFormation-Parametern abgeleitet werden.

    7. EC2 Instance Connect-Endpunkt für den Openflow-Bereitstellungssagenten, um die Bereitstellung bei Bedarf zu aktualisieren.

      • Wenn Sie BYO-VPC verwenden, erstellt der CloudFormation-Stack standardmäßig einen EC2 Instance Connect-Endpunkt. Dieses Standardverhalten kann jedoch geändert werden. Wenn Sie die verwaltete VPC-Option verwenden, erstellt der CloudFormation-Stack immer einen EC2 Instance Connect-Endpunkt.

      • Der Instance Connect-Endpunkt kann von vielen VPCs gemeinsam genutzt werden.

      • Wenn eine Bereitstellung gelöscht wird, wird zusammen mit dem CloudFormation-Stack auch der Endpunkt entfernt. Dies würde den Zugriff auf andere BYO-VPC-Agenten blockieren, wenn der Endpunkt gemeinsam genutzt wird.

      • Um einen EC2 Instance Connect-Endpunkt hinzuzufügen, führen Sie die folgenden Schritte in Ihrem AWS-Konto aus:

        1. Navigieren Sie im linken Navigationsbereich zu VPC » Endpoints.

        2. Wählen Sie Create Endpoint aus.

        3. Wählen Sie als Endpunkttyp EC2 Instance Connect-Endpunkt.

        4. Wählen Sie VPC aus. Lassen Sie alle Sicherheitsgruppen deaktiviert (nicht ausgewählt), um die VPC-Standardsicherheitsgruppe zu verwenden.

        5. Verwenden Sie bei der Auswahl eines Subnetzes denselben Wert wie Private Subnet 1 in den CloudFormation Parametern.

        6. Wählen Sie Create aus. Es dauert etwa 5 Minuten, bis der Endpunkt erstellt ist.

    8. S3-Bucket, in dem der Terraform-Status, Protokolle und Ausgaben für den Openflow-Agent gespeichert werden.

  2. Der Openflow-Bereitstellungsagent erstellt Folgendes:

    1. Ein EKS -Cluster, der Folgendes enthält:

    • Knotengruppen

    • Automatisch skalierende Gruppen

    • AWS VPC Container-Netzwerkschnittstellen (CNI)-Add-on

    • Amazon Elastic Block Store (EBS)-Add-on

    1. Secrets Manager-Datensätze für PostgreSQL, OAuth Anmeldeinformationen und so weiter.

    2. IAM-Richtlinien und Rollen für verschiedene Konten der K8s-Dienste, um ihre Secrets von AWS Secrets Manager abzurufen.

    3. K8s-Komponenten

    • Namespaces

    • Cluster Autoskalierer

    • EBS CSI erweiterbarer Speicher

    • AWS Load Balancer Controller, der den öffentlich zugänglichen Network Load Balancer erstellt

    • Aussteller des Let’s Encrypt-Zertifikats

    • Nginx Ingress, konfiguriert für Let’s Encrypt

    • Metrik-Server

    • Zertifikatsmanager von Jetstack

    • Operator für externe Secrets

    • Dienstkonten für Temporal, Bereitstellungsservice und OIDC

    • Secrets-Speicher für Temporal, den Bereitstellungsdienst und OIDC

    • Externe Secrets für Temporal und den Bereitstellungsdienst. Das externe Geheimnis für OIDC wird vom Laufzeitbetreiber erstellt und verwaltet.

    • PostgreSQL

    • Temporal

    • Selbstsignierter Zertifikatsaussteller und Ingress-Konfiguration für die Kommunikation zwischen Laufzeitknoten

    • Openflow-Laufzeit-Operator

    • Openflow-Bereitstellungsdienst

Standardmäßig verfügen alle AWS-Konten über ein Kontingent von fünf Elastic-IP-Adressen pro Region, denn öffentliche (IPv4)-Internetadressen sind eine knappe öffentliche Ressource. Snowflake empfiehlt dringend die Verwendung von Elastic-IP-Adressen, vor allem wegen der Möglichkeit, die Adresse im Falle eines Instanzausfalls einer anderen Instanz zuzuordnen, sowie die Verwendung von DNS-Hostnamen für die gesamte andere Kommunikation zwischen den Knoten.

Den Installationsfortschritt verfolgen

Nachdem der CloudFormation-Stack in den Zustand CREATE_COMPLETE übergeht, erstellt der Openflow-Agent automatisch den Rest der Infrastruktur.

Es gibt einige Schritte, die jeweils 10–15 Minuten dauern können, wie z. B:

  1. Erstellen des EKS-Clusters

  2. Installation des EBS CSI Add-ons auf dem EKS-Cluster

  3. Erstellen der RDS PostgreSQL-Datenbank

Statusberichte für den Openflow-Agenten sind noch nicht verfügbar. In der Zwischenzeit können Sie die Protokolle des Openflow-Agent einsehen, um zu überprüfen, ob die BYOC-Bereitstellung für Laufzeiten bereit ist. Führen Sie dazu die folgenden Schritte aus:

  1. Suchen Sie in der Liste der EC2-Instanzen die folgenden beiden Instanzen:

    • openflow-agent-{data-plane-key}: Dies ist der Openflow-Agent, den Sie zur Verwaltung von Laufzeiten verwenden werden.

    • {data-plane-key}-mgmt-group: Dies ist ein Knoten im EKS-Cluster der BYOC-Bereitstellung, auf dem ein Operator und andere Kernsoftware ausgeführt wird.

  2. Klicken Sie mit der rechten Maustaste auf die Instanz „openflow-agent“-{data-plane-key}, und wählen Sie Connect.

  3. Wechseln Sie von EC2 Instance Connect zu Connect using EC2 Instance Connect Endpoint. Lassen Sie den standardmäßigen „EC2 Instance Connect“-Endpunkt bestehen.

  4. Klicken Sie auf Connect. Es wird eine neue Browser-Registerkarte oder ein neues Fenster mit einer Befehlszeilenschnittstelle angezeigt.

  5. Führen Sie den folgenden Befehl aus, um die Installationsprotokolle des Docker-Images zu verfolgen, das Ihre Bereitstellung konfiguriert:

    journalctl -xe -f -n 100 -u docker
    
    Copy
  6. Sobald die Installation abgeschlossen ist, sehen Sie die folgende Ausgabe:

    {timestamp} - app stack applied successfully
    {timestamp} - All resources applied successfully
    

Konfigurierte AWS Berechtigungen

In diesem Abschnitt sind die vom Openflow-BYOC-Stack gemäß den Rollen konfigurierten AWS-Berechtigungen aufgeführt.

Bemerkung

{key} steht für den Bereitstellungsschlüssel, der die von Openflow erstellten und verwalteten Cloud-Ressourcen für eine bestimmte Bereitstellung eindeutig identifiziert.

Administrativer Benutzer

cloudformation und alle der folgenden Berechtigungen.

IAM-Rolle: openflow-agent-role-{key}

{
   "Version": "2012-10-17",
   "Statement": [
      {
            "Action": [
               "autoscaling:DescribeTags",
               "ec2:DescribeImages",
               "ec2:DescribeInstances",
               "ec2:DescribeLaunchTemplates",
               "ec2:DescribeLaunchTemplateVersions",
               "ec2:DescribeNetworkInterfaces",
               "ec2:DescribeSecurityGroups",
               "ec2:DescribeSubnets",
               "ec2:DescribeTags",
               "ec2:DescribeVolumes",
               "ec2:DescribeVpcs",
               "ec2:DescribeVpcAttribute",
               "iam:GetRole",
               "iam:GetOpenIDConnectProvider",
               "ecr:GetAuthorizationToken",
               "ec2:RunInstances",
               "ec2:CreateLaunchTemplate",
               "ec2:CreateSecurityGroup",
               "ec2:CreateTags",
               "ec2:DeleteTags"
            ],
            "Resource": "*",
            "Effect": "Allow"
      },
      {
            "Condition": {
               "StringLike": {
                  "aws:ResourceTag/Name": [
                        "{key}-oidc-provider"
                  ]
               }
            },
            "Action": [
               "iam:CreateOpenIDConnectProvider",
               "iam:DeleteOpenIDConnectProvider",
               "iam:TagOpenIDConnectProvider"
            ],
            "Resource": "arn:aws:iam::{Account_ID}:oidc-provider/oidc.eks.{Region}.amazonaws.com/id/*",
            "Effect": "Allow"
      },
      {
            "Action": [
               "iam:DeletePolicy",
               "iam:CreatePolicy",
               "iam:GetPolicy",
               "iam:GetPolicyVersion",
               "iam:ListPolicyVersions"
            ],
            "Resource": [
               "arn:aws:iam::{Account_ID}:policy/dp-service-role-policy-{key}",
               "arn:aws:iam::{Account_ID}:policy/oauth2-role-policy-{key}",
               "arn:aws:iam::{Account_ID}:policy/temporal-service-role-policy-{key}",
               "arn:aws:iam::{Account_ID}:policy/oidc-service-role-policy-{key}",
               "arn:aws:iam::{Account_ID}:policy/dps-temporal-role-policy-{key}"
               "arn:aws:iam::{Account_ID}:policy/dps-postgres-role-policy-{key}"
            ],
            "Effect": "Allow"
      },
      {
            "Action": [
               "iam:UpdateAssumeRolePolicy",
               "iam:PutRolePolicy",
               "iam:ListInstanceProfilesForRole",
               "iam:ListAttachedRolePolicies",
               "iam:ListRolePolicies",
               "iam:GetRolePolicy",
               "iam:CreateRole",
               "iam:AttachRolePolicy",
               "iam:DeleteRole",
               "iam:DeleteRolePolicy",
               "iam:DetachRolePolicy",
               "iam:TagRole"
            ],
            "Resource": [
               "arn:aws:iam::{Account_ID}:role/openflow-agent-role-{key}",
               "arn:aws:iam::{Account_ID}:role/{key}-*",
               "arn:aws:iam::{Account_ID}:role/dps-temporal-role-{key}",
               "arn:aws:iam::{Account_ID}:role/dps-postgres-role-{key}",
               "arn:aws:iam::{Account_ID}:role/dp-service-role-{key}",
               "arn:aws:iam::{Account_ID}:role/oauth2-role-{key}",
               "arn:aws:iam::{Account_ID}:role/oidc-service-role-{key}"
            ],
            "Effect": "Allow"
      },
      {
            "Action": [
               "autoscaling:CreateOrUpdateTags",
               "autoscaling:DeleteTags"
            ],
            "Resource": "arn:aws:autoscaling:{Region}:{Account_ID}:autoScalingGroup:*:autoScalingGroupName/eks-{key}-*",
            "Effect": "Allow"
      },
      {
            "Condition": {
               "StringLike": {
                  "aws:ResourceTag/Name": [
                        "{key}-EC2SecurityGroup-*",
                        "k8s-traffic-{key}-*",
                        "eks-cluster-sg-{key}-*",
                        "{key}-cluster-sg",
                        "postgres-{key}-sg"
                  ]
               }
            },
            "Action": [
               "ec2:AuthorizeSecurityGroupEgress",
               "ec2:AuthorizeSecurityGroupIngress",
               "ec2:RevokeSecurityGroupEgress",
               "ec2:DeleteSecurityGroup",
               "ec2:CreateTags",
               "ec2:DeleteTags",
               "ec2:CreateNetworkInterface",
               "ec2:DeleteNetworkInterface"
            ],
            "Resource": "arn:aws:ec2:{Region}:{Account_ID}:security-group/*",
            "Effect": "Allow"
      },
      {
            "Condition": {
               "StringLike": {
                  "aws:ResourceTag/elbv2.k8s.aws/cluster": "{key}"
               }
            },
            "Action": [
               "ec2:AuthorizeSecurityGroupEgress",
               "ec2:AuthorizeSecurityGroupIngress",
               "ec2:RevokeSecurityGroupEgress",
               "ec2:DeleteSecurityGroup",
               "ec2:CreateTags",
               "ec2:DeleteTags",
               "ec2:CreateNetworkInterface",
               "ec2:DeleteNetworkInterface"
            ],
            "Resource": "arn:aws:ec2:{Region}:{Account_ID}:security-group/*",
            "Effect": "Allow"
      },
      {
            "Action": [
               "ec2:CreateSecurityGroup"
            ],
            "Resource": "arn:aws:ec2:{Region}:{Account_ID}:vpc/vpc-018d2da0fde903de4",
            "Effect": "Allow"
      },
      {
            "Condition": {
               "StringLike": {
                  "ec2:ResourceTag/Name": "openflow-agent-{key}"
               }
            },
            "Action": [
               "ec2:AttachNetworkInterface"
            ],
            "Resource": "arn:aws:ec2:{Region}:{Account_ID}:instance/*",
            "Effect": "Allow"
      },
      {
            "Condition": {
               "StringLike": {
                  "aws:ResourceTag/Name": "{key}-*-group"
               }
            },
            "Action": [
               "ec2:DeleteLaunchTemplate"
            ],
            "Resource": "arn:aws:ec2:{Region}:{Account_ID}:launch-template/*",
            "Effect": "Allow"
      },
      {
            "Action": [
               "eks:CreateCluster",
               "eks:CreateAccessEntry",
               "eks:CreateAddon",
               "eks:CreateNodegroup",
               "eks:DeleteCluster",
               "eks:DescribeCluster",
               "eks:ListClusters",
               "eks:ListNodeGroups",
               "eks:DescribeUpdate",
               "eks:UpdateClusterConfig",
               "eks:TagResource"
            ],
            "Resource": "arn:aws:eks:{Region}:{Account_ID}:cluster/{key}",
            "Effect": "Allow"
      },
      {
            "Action": [
               "eks:DescribeAddon",
               "eks:DescribeAddonVersions",
               "eks:UpdateAddon",
               "eks:DeleteAddon",
               "eks:DescribeUpdate"
            ],
            "Resource": "arn:aws:eks:{Region}:{Account_ID}:addon/{key}/*",
            "Effect": "Allow"
      },
      {
            "Action": [
               "eks:DeleteNodegroup",
               "eks:DescribeNodegroup",
               "eks:ListNodegroups",
               "eks:UpdateNodegroupConfig",
               "eks:TagResource",
               "eks:DescribeUpdate"
            ],
            "Resource": "arn:aws:eks:{Region}:{Account_ID}:nodegroup/{key}/*",
            "Effect": "Allow"
      },
      {
            "Action": [
               "s3:CreateBucket",
               "s3:ListBucket"
            ],
            "Resource": "arn:aws:s3:::byoc-tf-state-{key}",
            "Effect": "Allow"
      },
      {
            "Action": [
               "s3:DeleteObject",
               "s3:GetObject",
               "s3:PutObject"
            ],
            "Resource": "arn:aws:s3:::byoc-tf-state-{key}/*",
            "Effect": "Allow"
      },
      {
            "Action": [
               "secretsmanager:CreateSecret",
               "secretsmanager:DeleteSecret",
               "secretsmanager:DescribeSecret",
               "secretsmanager:GetResourcePolicy",
               "secretsmanager:GetSecretValue",
               "secretsmanager:PutSecretValue",
               "secretsmanager:UpdateSecretVersionStage"
            ],
            "Resource": "arn:aws:secretsmanager:{Region}:{Account_ID}:secret:*-{key}*",
            "Effect": "Allow"
      },
      {
            "Action": [
               "ecr:BatchCheckLayerAvailability",
               "ecr:BatchGetImage",
               "ecr:DescribeImages",
               "ecr:DescribeRepositories",
               "ecr:GetDownloadUrlForLayer",
               "ecr:ListImages"
            ],
            "Resource": "arn:aws:ecr:{Region}:{Account_ID}:*",
            "Effect": "Allow"
      },
      {
            "Action": [
               "ecr:CreateRepository",
               "ecr:CompleteLayerUpload",
               "ecr:InitiateLayerUpload",
               "ecr:PutImage",
               "ecr:UploadLayerPart"
            ],
            "Resource": "arn:aws:ecr:{Region}:{Account_ID}:repository/snowflake-openflow/*",
            "Effect": "Allow"
      },
      {
            "Condition": {
               "StringLike": {
                  "iam:AWSServiceName": "eks.amazonaws.com"
               }
            },
            "Action": [
               "iam:CreateServiceLinkedRole"
            ],
            "Resource": "arn:aws:iam::*:role/aws-service-role/eks.amazonaws.com/AWSServiceRoleForAmazonEKS",
            "Effect": "Allow"
      },
      {
            "Condition": {
               "StringLike": {
                  "iam:AWSServiceName": "eks-nodegroup.amazonaws.com"
               }
            },
            "Action": [
               "iam:CreateServiceLinkedRole"
            ],
            "Resource": "arn:aws:iam::*:role/aws-service-role/eks-nodegroup.amazonaws.com/AWSServiceRoleForAmazonEKSNodegroup",
            "Effect": "Allow"
      },
      {
            "Action": [
               "eks:AssociateAccessPolicy",
               "eks:ListAssociatedAccessPolicies",
               "eks:DisassociateAccessPolicy"
            ],
            "Resource": "arn:aws:eks:{Region}:{Account_ID}:access-entry/{key}/*",
            "Effect": "Allow"
      },
      {
            "Action": "iam:PassRole",
            "Resource": "*",
            "Effect": "Allow"
      }
   ]
}
Copy

IAM-Rolle: {key}-cluster-ServiceRole

AWS-vewaltete Richtlinien:

  • AmazonEKSClusterPolicy

  • AmazonEKSVPCResourceController

{
   "Version": "2012-10-17",
   "Statement": [
      {
            "Action": [
               "cloudwatch:PutMetricData"
            ],
            "Effect": "Allow",
            "Resource": "*"
      }
   ]
}
{
   "Version": "2012-10-17",
   "Statement": [
      {
            "Action": [
               "ec2:DescribeAccountAttributes",
               "ec2:DescribeAddresses",
               "ec2:DescribeInternetGateways"
            ],
            "Effect": "Allow",
            "Resource": "*"
      }
   ]
}
Copy

IAM Rolle: {key}-addon-vpc-cni-Role

AWS-vewaltete Richtlinien:

  • AmazonEKS_CNI_P-Richtlinie

IAM Rolle: {key}-eks-role

AWS-vewaltete Richtlinien:

  • AmazonEBSCSIDriverPolicy

  • AmazonEC2ContainerRegistryReadOnly

  • AmazonEKS_CNI_P-Richtlinie

  • AmazonEKSWorkerNodePolicy

  • AmazonSSMManagedInstanceCore

  • AutoScalingFullAccess

  • ElasticLoadBalancingFullAccess

{
   "Version": "2012-10-17",
   "Statement": [
      {
            "Action": [
               "ec2:CreateSecurityGroup",
               "ec2:CreateTags"
            ],
            "Effect": "Allow",
            "Resource": [
               "arn:aws:ec2:{Region}:{Account_ID}:security-group/*",
               "arn:aws:ec2:{Region}:{Account_ID}:vpc/{VPC_ID}"
            ],
            "Sid": "CreateOpenflowEKSSecurityGroupAndTags"
      },
      {
            "Action": [
               "ec2:AuthorizeSecurityGroupIngress",
               "ec2:DeleteSecurityGroup"
            ],
            "Condition": {
               "StringLike": {
                  "aws:ResourceTag/Name": "eks-cluster-sg-{key}-*"
               }
            },
            "Effect": "Allow",
            "Resource": [
               "arn:aws:ec2:{Region}:{Account_ID}:security-group/*"
            ],
            "Sid": "OpenflowManageEKSSecurityGroup"
      }
   ]
}
Copy

Bemerkung

{VPC_ID} steht für den Bezeichner der VPC, der entweder von BYOC erstellt oder von BYO-VPC verwendet wurde.

IAM Rolle: oidc-service-role-{key}

{
   "Statement": [
      {
            "Action": [
               "secretsmanager:GetSecretValue",
               "secretsmanager:DescribeSecret",
               "secretsmanager:GetResourcePolicy",
               "secretsmanager:ListSecretVersionIds"
            ],
            "Effect": "Allow",
            "Resource": [
               "arn:aws:secretsmanager:{Region}:{Account_ID}:secret:oidc-{key}*"
            ]
      }
   ],
   "Version": "2012-10-17"
}
Copy

IAM Rolle: dps-postgres-role-{key}

{
   "Statement": [
      {
            "Action": [
               "secretsmanager:GetSecretValue",
               "secretsmanager:DescribeSecret",
               "secretsmanager:GetResourcePolicy",
               "secretsmanager:ListSecretVersionIds"
            ],
            "Effect": "Allow",
            "Resource": [
               "arn:aws:secretsmanager:{Region}:{Account_ID}:secret:postgres_creds-{key}*"
            ]
      }
   ],
   "Version": "2012-10-17"
}
Copy

IAM Rolle: dps-temporal-role-{key}

{
   "Statement": [
      {
            "Action": [
               "secretsmanager:GetSecretValue",
               "secretsmanager:DescribeSecret",
               "secretsmanager:GetResourcePolicy",
               "secretsmanager:ListSecretVersionIds"
            ],
            "Effect": "Allow",
            "Resource": [
               "arn:aws:secretsmanager:{Region}:{Account_ID}:secret:temporal_creds-{key}*"
            ]
      }
   ],
   "Version": "2012-10-17"
}
Copy

IAM Rolle: dp-service-role-{key}

{
   "Statement": [
      {
            "Action": [
               "secretsmanager:GetSecretValue",
               "secretsmanager:DescribeSecret",
               "secretsmanager:GetResourcePolicy",
               "secretsmanager:ListSecretVersionIds"
            ],
            "Effect": "Allow",
            "Resource": [
               "arn:aws:secretsmanager:{Region}:{Account_ID}:secret:dps_creds-{key}*",
               "arn:aws:secretsmanager:{Region}:{Account_ID}:secret:snowflake-oauth2-{key}*"
            ]
      }
   ],
   "Version": "2012-10-17"
}
Copy

IAM Rolle: oauth2-role-{key}

{
   "Statement": [
      {
            "Action": [
               "secretsmanager:GetSecretValue",
               "secretsmanager:DescribeSecret",
               "secretsmanager:GetResourcePolicy",
               "secretsmanager:ListSecretVersionIds"
            ],
            "Effect": "Allow",
            "Resource": [
               "arn:aws:secretsmanager:{Region}:{Account_ID}:secret:snowflake-oauth2-{key}*"
            ]
      }
   ],
   "Version": "2012-10-17"
}
Copy

IAM Rolle: {key}-nodegroup-NodeInstanceRole

AWS-vewaltete Richtlinien:

  • AmazonEBSCSIDriverPolicy

  • AmazonEC2ContainerRegistryReadOnly

  • AmazonEKS_CNI_P-Richtlinie

  • AmazonEKSWorkerNodePolicy

  • AmazonSSMManagedInstanceCore

  • AutoScalingFullAccess

  • ElasticLoadBalancingFullAccess

{
   "Version": "2012-10-17",
   "Statement": [
      {
            "Action": [
               "servicediscovery:CreateService",
               "servicediscovery:DeleteService",
               "servicediscovery:GetService",
               "servicediscovery:GetInstance",
               "servicediscovery:RegisterInstance",
               "servicediscovery:DeregisterInstance",
               "servicediscovery:ListInstances",
               "servicediscovery:ListNamespaces",
               "servicediscovery:ListServices",
               "servicediscovery:GetInstancesHealthStatus",
               "servicediscovery:UpdateInstanceCustomHealthStatus",
               "servicediscovery:GetOperation",
               "route53:GetHealthCheck",
               "route53:CreateHealthCheck",
               "route53:UpdateHealthCheck",
               "route53:ChangeResourceRecordSets",
               "route53:DeleteHealthCheck",
               "appmesh:*"
            ],
            "Effect": "Allow",
            "Resource": "*"
      }
   ]
}
{
   "Version": "2012-10-17",
   "Statement": [
      {
            "Action": [
               "autoscaling:DescribeAutoScalingGroups",
               "autoscaling:DescribeAutoScalingInstances",
               "autoscaling:DescribeLaunchConfigurations",
               "autoscaling:DescribeScalingActivities",
               "autoscaling:DescribeTags",
               "ec2:DescribeInstanceTypes",
               "ec2:DescribeLaunchTemplateVersions"
            ],
            "Effect": "Allow",
            "Resource": "*"
      },
      {
            "Action": [
               "autoscaling:SetDesiredCapacity",
               "autoscaling:TerminateInstanceInAutoScalingGroup",
               "ec2:DescribeImages",
               "ec2:GetInstanceTypesFromInstanceRequirements",
               "eks:DescribeNodegroup"
            ],
            "Effect": "Allow",
            "Resource": "*"
      }
   ]
}
{
   "Version": "2012-10-17",
   "Statement": [
      {
            "Action": [
               "iam:CreateServiceLinkedRole"
            ],
            "Condition": {
               "StringEquals": {
                  "iam:AWSServiceName": "elasticloadbalancing.amazonaws.com"
               }
            },
            "Effect": "Allow",
            "Resource": "*"
      },
      {
            "Action": [
               "ec2:DescribeAccountAttributes",
               "ec2:DescribeAddresses",
               "ec2:DescribeAvailabilityZones",
               "ec2:DescribeInternetGateways",
               "ec2:DescribeVpcs",
               "ec2:DescribeVpcPeeringConnections",
               "ec2:DescribeSubnets",
               "ec2:DescribeSecurityGroups",
               "ec2:DescribeInstances",
               "ec2:DescribeNetworkInterfaces",
               "ec2:DescribeTags",
               "ec2:GetCoipPoolUsage",
               "ec2:DescribeCoipPools",
               "elasticloadbalancing:DescribeLoadBalancers",
               "elasticloadbalancing:DescribeLoadBalancerAttributes",
               "elasticloadbalancing:DescribeListeners",
               "elasticloadbalancing:DescribeListenerCertificates",
               "elasticloadbalancing:DescribeSSLPolicies",
               "elasticloadbalancing:DescribeRules",
               "elasticloadbalancing:DescribeTargetGroups",
               "elasticloadbalancing:DescribeTargetGroupAttributes",
               "elasticloadbalancing:DescribeTargetHealth",
               "elasticloadbalancing:DescribeTags"
            ],
            "Effect": "Allow",
            "Resource": "*"
      },
      {
            "Action": [
               "cognito-idp:DescribeUserPoolClient",
               "acm:ListCertificates",
               "acm:DescribeCertificate",
               "iam:ListServerCertificates",
               "iam:GetServerCertificate",
               "waf-regional:GetWebACL",
               "waf-regional:GetWebACLForResource",
               "waf-regional:AssociateWebACL",
               "waf-regional:DisassociateWebACL",
               "wafv2:GetWebACL",
               "wafv2:GetWebACLForResource",
               "wafv2:AssociateWebACL",
               "wafv2:DisassociateWebACL",
               "shield:GetSubscriptionState",
               "shield:DescribeProtection",
               "shield:CreateProtection",
               "shield:DeleteProtection"
            ],
            "Effect": "Allow",
            "Resource": "*"
      },
      {
            "Action": [
               "ec2:AuthorizeSecurityGroupIngress",
               "ec2:RevokeSecurityGroupIngress"
            ],
            "Effect": "Allow",
            "Resource": "*"
      },
      {
            "Action": [
               "ec2:CreateSecurityGroup"
            ],
            "Effect": "Allow",
            "Resource": "*"
      },
      {
            "Action": [
               "ec2:CreateTags"
            ],
            "Condition": {
               "Null": {
                  "aws:RequestTag/elbv2.k8s.aws/cluster": "false"
               },
               "StringEquals": {
                  "ec2:CreateAction": "CreateSecurityGroup"
               }
            },
            "Effect": "Allow",
            "Resource": "arn:aws:ec2:*:*:security-group/*"
      },
      {
            "Action": [
               "ec2:CreateTags",
               "ec2:DeleteTags"
            ],
            "Condition": {
               "Null": {
                  "aws:RequestTag/elbv2.k8s.aws/cluster": "true",
                  "aws:ResourceTag/elbv2.k8s.aws/cluster": "false"
               }
            },
            "Effect": "Allow",
            "Resource": "arn:aws:ec2:*:*:security-group/*"
      },
      {
            "Action": [
               "ec2:AuthorizeSecurityGroupIngress",
               "ec2:RevokeSecurityGroupIngress",
               "ec2:DeleteSecurityGroup"
            ],
            "Condition": {
               "Null": {
                  "aws:ResourceTag/elbv2.k8s.aws/cluster": "false"
               }
            },
            "Effect": "Allow",
            "Resource": "*"
      },
      {
            "Action": [
               "elasticloadbalancing:CreateLoadBalancer",
               "elasticloadbalancing:CreateTargetGroup"
            ],
            "Condition": {
               "Null": {
                  "aws:RequestTag/elbv2.k8s.aws/cluster": "false"
               }
            },
            "Effect": "Allow",
            "Resource": "*"
      },
      {
            "Action": [
               "elasticloadbalancing:CreateListener",
               "elasticloadbalancing:DeleteListener",
               "elasticloadbalancing:CreateRule",
               "elasticloadbalancing:DeleteRule"
            ],
            "Effect": "Allow",
            "Resource": "*"
      },
      {
            "Action": [
               "elasticloadbalancing:AddTags",
               "elasticloadbalancing:RemoveTags"
            ],
            "Condition": {
               "Null": {
                  "aws:RequestTag/elbv2.k8s.aws/cluster": "true",
                  "aws:ResourceTag/elbv2.k8s.aws/cluster": "false"
               }
            },
            "Effect": "Allow",
            "Resource": [
               "arn:aws:elasticloadbalancing:*:*:targetgroup/*/*",
               "arn:aws:elasticloadbalancing:*:*:loadbalancer/net/*/*",
               "arn:aws:elasticloadbalancing:*:*:loadbalancer/app/*/*"
            ]
      },
      {
            "Action": [
               "elasticloadbalancing:AddTags",
               "elasticloadbalancing:RemoveTags"
            ],
            "Effect": "Allow",
            "Resource": [
               "arn:aws:elasticloadbalancing:*:*:listener/net/*/*/*",
               "arn:aws:elasticloadbalancing:*:*:listener/app/*/*/*",
               "arn:aws:elasticloadbalancing:*:*:listener-rule/net/*/*/*",
               "arn:aws:elasticloadbalancing:*:*:listener-rule/app/*/*/*"
            ]
      },
      {
            "Action": [
               "elasticloadbalancing:ModifyLoadBalancerAttributes",
               "elasticloadbalancing:SetIpAddressType",
               "elasticloadbalancing:SetSecurityGroups",
               "elasticloadbalancing:SetSubnets",
               "elasticloadbalancing:DeleteLoadBalancer",
               "elasticloadbalancing:ModifyTargetGroup",
               "elasticloadbalancing:ModifyTargetGroupAttributes",
               "elasticloadbalancing:DeleteTargetGroup"
            ],
            "Condition": {
               "Null": {
                  "aws:ResourceTag/elbv2.k8s.aws/cluster": "false"
               }
            },
            "Effect": "Allow",
            "Resource": "*"
      },
      {
            "Action": [
               "elasticloadbalancing:AddTags"
            ],
            "Condition": {
               "Null": {
                  "aws:RequestTag/elbv2.k8s.aws/cluster": "false"
               },
               "StringEquals": {
                  "elasticloadbalancing:CreateAction": [
                        "CreateTargetGroup",
                        "CreateLoadBalancer"
                  ]
               }
            },
            "Effect": "Allow",
            "Resource": [
               "arn:aws:elasticloadbalancing:*:*:targetgroup/*/*",
               "arn:aws:elasticloadbalancing:*:*:loadbalancer/net/*/*",
               "arn:aws:elasticloadbalancing:*:*:loadbalancer/app/*/*"
            ]
      },
      {
            "Action": [
               "elasticloadbalancing:RegisterTargets",
               "elasticloadbalancing:DeregisterTargets"
            ],
            "Effect": "Allow",
            "Resource": "arn:aws:elasticloadbalancing:*:*:targetgroup/*/*"
      },
      {
            "Action": [
               "elasticloadbalancing:SetWebAcl",
               "elasticloadbalancing:ModifyListener",
               "elasticloadbalancing:AddListenerCertificates",
               "elasticloadbalancing:RemoveListenerCertificates",
               "elasticloadbalancing:ModifyRule"
            ],
            "Effect": "Allow",
            "Resource": "*"
      }
   ]
}
{
   "Version": "2012-10-17",
   "Statement": [
      {
            "Action": [
               "route53:ChangeResourceRecordSets"
            ],
            "Effect": "Allow",
            "Resource": "arn:aws:route53:::hostedzone/*"
      }
   ]
}
{
   "Version": "2012-10-17",
   "Statement": [
      {
            "Action": [
               "route53:GetChange"
            ],
            "Effect": "Allow",
            "Resource": "arn:aws:route53:::change/*"
      }
   ]
}
{
   "Version": "2012-10-17",
   "Statement": [
      {
            "Action": [
               "route53:ListResourceRecordSets",
               "route53:ListHostedZonesByName"
            ],
            "Effect": "Allow",
            "Resource": "*"
      }
   ]
}
{
   "Version": "2012-10-17",
   "Statement": [
      {
            "Action": [
               "ec2:CreateSnapshot",
               "ec2:AttachVolume",
               "ec2:DetachVolume",
               "ec2:ModifyVolume",
               "ec2:DescribeAvailabilityZones",
               "ec2:DescribeInstances",
               "ec2:DescribeSnapshots",
               "ec2:DescribeTags",
               "ec2:DescribeVolumes",
               "ec2:DescribeVolumesModifications"
            ],
            "Effect": "Allow",
            "Resource": "*"
      },
      {
            "Action": [
               "ec2:CreateTags"
            ],
            "Condition": {
               "StringEquals": {
                  "ec2:CreateAction": [
                        "CreateVolume",
                        "CreateSnapshot"
                  ]
               }
            },
            "Effect": "Allow",
            "Resource": [
               "arn:aws:ec2:*:*:volume/*",
               "arn:aws:ec2:*:*:snapshot/*"
            ]
      },
      {
            "Action": [
               "ec2:DeleteTags"
            ],
            "Effect": "Allow",
            "Resource": [
               "arn:aws:ec2:*:*:volume/*",
               "arn:aws:ec2:*:*:snapshot/*"
            ]
      },
      {
            "Action": [
               "ec2:CreateVolume"
            ],
            "Condition": {
               "StringLike": {
                  "aws:RequestTag/ebs.csi.aws.com/cluster": "true"
               }
            },
            "Effect": "Allow",
            "Resource": "*"
      },
      {
            "Action": [
               "ec2:CreateVolume"
            ],
            "Condition": {
               "StringLike": {
                  "aws:RequestTag/CSIVolumeName": "*"
               }
            },
            "Effect": "Allow",
            "Resource": "*"
      },
      {
            "Action": [
               "ec2:DeleteVolume"
            ],
            "Condition": {
               "StringLike": {
                  "ec2:ResourceTag/ebs.csi.aws.com/cluster": "true"
               }
            },
            "Effect": "Allow",
            "Resource": "*"
      },
      {
            "Action": [
               "ec2:DeleteVolume"
            ],
            "Condition": {
               "StringLike": {
                  "ec2:ResourceTag/CSIVolumeName": "*"
               }
            },
            "Effect": "Allow",
            "Resource": "*"
      },
      {
            "Action": [
               "ec2:DeleteVolume"
            ],
            "Condition": {
               "StringLike": {
                  "ec2:ResourceTag/kubernetes.io/created-for/pvc/name": "*"
               }
            },
            "Effect": "Allow",
            "Resource": "*"
      },
      {
            "Action": [
               "ec2:DeleteSnapshot"
            ],
            "Condition": {
               "StringLike": {
                  "ec2:ResourceTag/CSIVolumeSnapshotName": "*"
               }
            },
            "Effect": "Allow",
            "Resource": "*"
      },
      {
            "Action": [
               "ec2:DeleteSnapshot"
            ],
            "Condition": {
               "StringLike": {
                  "ec2:ResourceTag/ebs.csi.aws.com/cluster": "true"
               }
            },
            "Effect": "Allow",
            "Resource": "*"
      }
   ]
}
{
   "Version": "2012-10-17",
   "Statement": [
      {
            "Action": [
               "route53:ChangeResourceRecordSets"
            ],
            "Effect": "Allow",
            "Resource": "arn:aws:route53:::hostedzone/*"
      }
   ]
}
{
   "Version": "2012-10-17",
   "Statement": [
      {
            "Action": [
               "route53:ListHostedZones",
               "route53:ListResourceRecordSets",
               "route53:ListTagsForResource"
            ],
            "Effect": "Allow",
            "Resource": "*"
      }
   ]
}
Copy