Openflow einrichten¶
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 Bild-Repositorys in Ihrem Snowflake-Konto verwendet haben, müssen Sie die folgenden Einstellungen vornehmen, um sicherzustellen, dass der Bereitstellungsdienst die Openflow-Bilder aus Snowflake abrufen kann.
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;
Die Einrichtung von Openflow erfordert die Definition neuer Berechtigungen auf der Ebene des Snowflake-Kontos. Die neuen Berechtigungen werden der Rolle ACCOUNTADMIN als Teil der Standardberechtigungen zugewiesen. ACCOUNTADMIN verfügt automatisch über die folgenden beiden Berechtigungen und kann sie einer Rolle seiner Wahl für die Openflow-Administratorrolle gewähren, die im folgenden Code als $OPENFLOW_ADMIN_ROLE bezeichnet wird:
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;
Außerdem müssen Sie
default_secondary_roles
für alle Openflow-Benutzer aufALL
einstellen. Dies liegt daran, dass Openflow-Aktionen durch die Verwendung einer beliebigen Rolle des authentifizierten Benutzers autorisiert werden und nicht nur durch die Standardrolle. Ersetzen Sie $OPENFLOW_USER im folgenden Code für jeden Openflow-Benutzer:USE ROLE ACCOUNTADMIN; ALTER USER $OPENFLOW_USER SET DEFAULT_SECONDARY_ROLES = ('ALL');
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¶
Betrachten wir das folgende Szenario, in dem wir die folgenden Rollen einrichten möchten:
accountadmin: Die Standardrolle von Snowflake, die über diese beiden CREATE-Berechtigungen verfügt:
CREATE OPENFLOW DATA PLANE INTEGRATION
CREATE OPENFLOW RUNTIME INTEGRATION
deployment_manager: eine Rolle, die Bereitstellungen erstellen, verwalten und löschen kann
deployment1_runtime_manager_1: eine Rolle, die eine Laufzeit nur innerhalb von Bereitstellung 1 erstellen kann. Sie kann eine von ihr erstellte Laufzeit innerhalb von Bereitstellung 1 ändern und löschen, nicht aber die von deployment1_runtime_manager_2 erstellte Laufzeit.
deployment1_runtime_manager_2: eine Rolle, die eine Laufzeit nur innerhalb von Bereitstellung 1 erstellen kann. Sie kann eine von ihr erstellte Laufzeit innerhalb von Bereitstellung 1 ändern und löschen, nicht aber eine von deployment1_runtime_manager_1 erstellte Laufzeit.
deployment1_runtime_viewer_1: eine Rolle, die das Laufzeit-Canvas innerhalb von deployment 1 anzeigen kann, das von deployment1_runtime_manager_1 erstellt wurde.
deployment1_runtime_viewer_2: eine Rolle, die das Laufzeit-Canvas innerhalb von deployment 1 anzeigen kann, das von deployment1_runtime_manager_2 erstellt wurde.
deployment2_runtime_manager: eine Rolle, die eine Laufzeit nur innerhalb von deployment 2 erstellen kann.
deployment2_runtime_viewer: eine Rolle, die ein Laufzeit-Canvas innerhalb von deployment 2 anzeigen kann.
Um Openflow mit diesen Rollen einzurichten, gehen Sie wie folgt vor:
Erstellen Sie neue Rollen und weisen Sie 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, since 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, since this privilege cannot be granted in cp 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 these roles to desired users grant role <role name> to user <username>; ........
Erstellen Sie eine Bereitstellung.
Melden Sie sich als deployment_manager an.
Erstellen Sie Bereitstellung 1 in der Openflow-UI. Erteilen Sie die USAGE-Berechtigung für deployment1_runtime_manager_1 und deployment1_runtime_manager_2.
Erstellen Sie Bereitstellung 2 in der Openflow-UI. Erteilen Sie dem deployment2_runtime_manager die USAGE-Berechtigung.
Sie benötigen sowohl die Berechtigung CREATE OPENFLOW RUNTIME INTEGRATION als auch die USAGE-Berechtigung für eine Bereitstellung, um eine Laufzeit in dieser Bereitstellung erstellen zu können.
Erstellen Sie Laufzeiten in Bereitstellung 1 als deployment1_runtime_manager_1.
Melden Sie sich als deployment1_runtime_manager_1 an.
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.
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.
Sie haben einen AWS-Administrator in Ihrer Organisation, der die Möglichkeit hat, das CloudFormation-Skript auszuführen, um EKS innerhalb eine neuen VPC (erstellt durch CloudFormation) oder einer bestehenden VPC einzurichten. 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.
Hier sind einige Punkte, die Sie beachten sollten:
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.
Melden Sie sich bei Snowflake als Benutzer mit der Rolle ORGADMIN an.
Navigieren Sie zu Data » Openflow.
Akzeptieren Sie die Openflow-Servicebedingungen.
Erstellen einer Bereitstellung in Ihrer Cloud¶
Wichtig
Benutzer können sich nicht bei Openflow anmelden, wenn ihre Standardrolle ACCOUNTADMIN, ORGADMIN, GLOBALORGADMIN oder SECURITYADMIN lautet. Sie müssen die Standardrolle für Ihren Benutzer in eine andere Rolle als ACCOUNTADMIN, ORGADMIN, GLOBALORGADMIN oder SECURITYADMIN ändern, um sich bei Openflow anmelden zu können. Weitere Informationen finden Sie unter Voraussetzungen.
Melden Sie sich bei Snowflake mit einer Rolle an, die Sie ACCOUNTADMIN für die Verwendung von Openflow zugewiesen hat.
Navigieren Sie zu Data » Openflow.
Wählen Sie Launch Openflow aus.
Wählen Sie in der Openflow-UI die Option Create a deployment. Die Registerkarte Deployments wird geöffnet.
Wählen Sie Create a deployment aus. Der Assistent zum Erstellen einer Bereitstellung wird geöffnet.
Stellen Sie im Schritt Prerequisites sicher, dass Sie alle Anforderungen erfüllen. Wählen Sie Next aus.
Wählen Sie im Schritt Deployment location Amazon Web Services als Bereitstellungsort. Geben Sie einen Namen für Ihre Bereitstellung ein. Wählen Sie Next aus.
Im Configuration-Schritt können Sie eine der folgenden Konfigurationsoptionen auswählen:
Fully managed VPC: Wählen Sie diese Option, wenn Sie möchten, dass Ihre VPC von Snowflake verwaltet wird
Bring your own VPC: Wählen Sie diese Option, wenn Sie eine vorhandene VPC verwenden möchten.
Wählen Sie Create Deployment aus.
Sobald Ihre Bereitstellung konfiguriert ist, wird ein Dialogfeld angezeigt, in dem Sie die CloudFormation-Vorlage herunterladen können, um den Einrichtungsprozess in Ihrem AWS-Konto abzuschließen. Laden Sie diese Vorlage herunter und navigieren Sie zu Ihrem AWS-Konto.
Erstellen Sie in Ihrem AWS-Konto einen neuen CloudFormation-Batch unter Verwendung der Vorlage. Nachdem die EC2-Instanz des Openflow-Bereitstellungsagenten erstellt wurde, führt er den Rest des Installationsprozesses mithilfe von Infrastruktur-als-Code-Skripten durch. Sie können den Fortschritt der Installation verfolgen, wie unter Den Installationsfortschritt verfolgen beschrieben.
Wenn Sie eine bestehende VPC verwenden, wählen Sie beim Hochladen der Vorlage CloudFormation die entsprechenden Werte in den Dropdown-Listen für die beiden privaten Subnetze und Ihre VPC aus.
Navigieren Sie zu Ihrem Snowflake Konto.
[Optional] Dieser Schritt ist nur erforderlich, wenn Sie Netzwerkrichtlinien verwenden, um den Zugriff auf Snowflake zu kontrollieren. Erstellen Sie eine Netzwerkrichtlinie für Openflow, und fügen Sie sie zu Ihrer bestehenden Netzwerkrichtlinie für Ihr Snowflake-Konto hinzu. Eine Netzwerkrichtlinie ist eine Reihe von Regeln, die steuern, welche IP-Adressen auf Ihr Snowflake Konto zugreifen können. Ersetzen Sie {$NAT_GATEWAY_PUBLIC_IP} im folgenden Codeausschnitt durch die öffentliche IP-Adresse des NAT-Gateways, das als Teil des CloudFormation-Stacks erstellt wurde (suchen Sie auf der AWS-Konsole nach NAT-Gateway oder überprüfen Sie die Ausgabe des CFN-Stacks). Das NAT-Gateway ist für den Openflow-Ausgang sowohl für DPA als auch für EKS zuständig. Sowohl DPA als auch EKS laufen im privaten Subnetz 1 der Installation.
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'); -- Run this command to find your currently active network policy and copy the value column SHOW PARAMETERS LIKE 'NETWORK_POLICY' IN ACCOUNT; -- Now add the new network rule to this policy ALTER NETWORK POLICY {ENTER_YOUR_ACTIVE_NETWORK_POLICY_NAME} ADD ALLOWED_NETWORK_RULE_LIST = (allow_openflow_deployment);
Erstellen Sie eine Ereignistabelle. Eine Ereignistabelle dient zum Speichern und Verwalten von Ereignisdaten, wie z. B. Benutzeraktionen, Systemprotokolle und Transaktionen. Sie können wählen, ob Sie eine Openflow-spezifische Ereignistabelle oder eine kontospezifische Ereignistabelle verwenden möchten.
Eine Openflow-spezifische Ereignistabelle erstellen
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_deployment_UUID SET event_table = 'openflow.openflow.openflow_events';
Eine kontenspezifische Ereignistabelle erstellen
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;
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¶
Wählen Sie in Openflow Control Plane die Option Create a runtime aus. Das Dialogfeld Create Runtime wird geöffnet.
Wählen Sie in der Dropdown-Liste Deployment die Bereitstellung, in der Sie eine Laufzeit erstellen möchten.
Geben Sie einen Namen für Ihre Laufzeit ein.
Wählen Sie einen Knotentyp aus der Dropdown-Liste Node type aus. Hier wird die Größe Ihrer Knoten angegeben.
Wählen Sie in der Bereichsauswahl Min/Max node einen Bereich aus. Der Mindestwert gibt die Anzahl der Knoten an, die beim Start der Laufzeit erstellt werden, und der Maximalwert gibt die Anzahl der Knoten an, auf die die Laufzeit bei hohem Datenaufkommen oder CPU-Auslastung skalieren kann.
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¶
Der Openflow CloudFormation-Stack erstellt:
Eine VPC mit zwei öffentlichen Subnetzen 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-Laufzeiten laufen im privaten Subnetz 1.
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.
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.
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:
Melden Sie sich bei Openflow an.
Gehen Sie auf die Registerkarte Deployments.
Wählen Sie das Symbol „Weitere Optionen“ neben Ihrer Bereitstellung.
Wählen Sie View details aus. Der Wert im Feld Key ist Ihr Bereitstellungsschlüssel.
Nachdem Sie den Bereitstellungsschlüssel gefunden haben, können Sie ihn verwenden, um Ihre AWS-Ressourcen nach dem Schlüsselwert zu filtern.
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.
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:
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.
Die Vorlage CloudFormation erstellt Folgendes und konfiguriert mit den in Konfigurierte AWS-Berechtigungen erwähnten AWS-Berechtigungen:
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.
Internet Gateway für den Austritt aus der VPC
NAT-Gateway für den Austritt aus den privaten Subnetzen
AWS Secrets Manager-Eintrag für die vom Benutzer eingegebene OIDC-Konfiguration
IAM-Rolle und Instanzprofil für den Openflow-Agent, die von seiner EC2-Instanz verwendet werden sollen
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.
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:
Navigieren Sie in der linken Navigation zu VPC » Endpoints.
Wählen Sie Create Endpoint aus.
Wählen Sie als Endpunkttyp EC2 Instance Connect-Endpunkt.
Wählen Sie VPC aus. Lassen Sie alle Sicherheitsgruppen deaktiviert (nicht ausgewählt), um die VPC-Standardsicherheitsgruppe zu verwenden.
Verwenden Sie bei der Auswahl eines Subnetzes denselben Wert wie Private Subnet 1 in den CloudFormation Parametern.
Wählen Sie Create aus. Es dauert etwa 5 Minuten, bis der Endpunkt erstellt ist.
S3-Bucket, in dem der Terraform-Status, Protokolle und Ausgaben für den Openflow-Agent gespeichert werden.
Der Openflow-Bereitstellungsagent erstellt Folgendes:
Ein EKS -Cluster, der Folgendes enthält:
Knotengruppen
Automatisch skalierende Gruppen
VPC CNI-Add-on
EBS CSI-Add-on
Secrets Manager-Datensätze für PostgreSQL, OAuth Anmeldeinformationen und so weiter.
IAM-Richtlinien und Rollen für verschiedene Konten der K8s-Dienste, um ihre Secrets von AWS Secrets Manager abzurufen.
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
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:
Erstellen des EKS-Clusters
Installation des EBS CSI Add-ons auf dem EKS-Cluster
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:
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.
Klicken Sie mit der rechten Maustaste auf die Instanz „openflow-agent“-{data-plane-key}, und wählen Sie Connect.
Wechseln Sie von EC2 Instance Connect zu Connect using EC2 Instance Connect Endpoint. Lassen Sie den standardmäßigen „EC2 Instance Connect“-Endpunkt bestehen.
Klicken Sie auf Connect. Es wird eine neue Browser-Registerkarte oder ein neues Fenster mit einer Befehlszeilenschnittstelle angezeigt.
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
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"
}
]
}
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": "*"
}
]
}
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"
}
]
}
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"
}
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"
}
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"
}
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"
}
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"
}
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": "*"
}
]
}