Configuração do Openflow - BYOC

Este tópico descreve as etapas para configurar o Openflow.

A configuração do Openflow envolve as seguintes etapas:

Pré-requisitos

Os pré-requisitos a serem cumpridos em suas contas Snowflake e AWS são os seguintes:

Conta Snowflake

Você precisará primeiro definir os privilégios no nível da conta Snowflake.

  1. Execute os seguintes comandos SQL para conceder os privilégios necessários à função de administrador do OpenFlow:

    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

    Os novos privilégios são atribuídos à função ACCOUNTADMIN como parte do conjunto padrão de privilégios, e essa função pode conceder os privilégios a uma função de sua escolha para a função de administrador do OpenFlow, denotada como $openflow_admin_role no código.

  2. Em seguida, defina default_secondary_roles como ALL para todos os usuários do Openflow:

    1. Faça login no Snowflake com uma função que seu ACCOUNTADMIN atribuiu para usar o Openflow.

      Não ser nenhuma das seguintes funções: ACCOUNTADMIN, ORGADMIN, GLOBALORGADMIN ou SECURITYADMIN.

      Se você vir uma tela em branco ou a mensagem de erro «message: Invalid consent request» ao fazer login no Openflow, altere sua função para uma que não esteja entre essas listadas.

      Para obter mais informações, consulte Pré-requisitos.

    2. Execute o seguinte código, substituindo $openflow_user por cada usuário do Openflow:

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

    Essa configuração é necessária porque as ações do Openflow são autorizadas usando qualquer uma das funções do usuário autenticado, e não apenas a função padrão.

Privilégios de integração de implementação

O objeto de integração de implementação representa um conjunto de recursos provisionados para implementar um ou mais tempos de execução do Snowflake Openflow. Para organizações que trazem seus próprios recursos de nuvem, o objeto de integração de implementação representa um cluster Kubernetes gerenciado com seus nós associados.

Os usuários com o privilégio CREATE DATA PLANE INTEGRATION na conta Snowflake podem criar e excluir os objetos de integração da implementação.

Privilégios adicionais podem ser definidos diretamente nos objetos de integração de implementação para oferecer suporte à diferenciação de acesso.

Você pode conceder os seguintes privilégios em um objeto de integração de implementação:

  • OWNERSHIP: permite controle total sobre os objetos de ações de implementação, inclusive a exclusão da implementação.

  • USAGE: permite a criação de objetos filho em tempo de execução.

Privilégios de tempo de execução

O objeto de tempo de execução representa um cluster de um ou mais servidores de tempo de execução do Snowflake Openflow, provisionados para executar definições de fluxo. Para implantações do Kubernetes, o objeto de tempo de execução representa um conjunto com estado de contêineres de tempo de execução do Snowflake Openflow implantados em um namespace, junto dos componentes de suporte.

Os usuários com o privilégio OWNERSHIP no objeto de integração de implementação pai e o privilégio de nível de conta CREATE RUNTIME INTEGRATION podem criar objetos de integração de tempo de execução. Privilégios adicionais podem ser definidos diretamente nos objetos de integração em tempo de execução para oferecer suporte à diferenciação de acesso.

Você pode conceder os seguintes privilégios em um objeto de integração de tempo de execução:

  • OWNERSHIP: permite controle total sobre as ações de tempo de execução, incluindo a exclusão do tempo de execução associado e a modificação das definições de fluxo de tempo de execução.

  • USAGE: permite o acesso de leitura ao tempo de execução implantado para observar a integridade e o status, sem fazer nenhuma alteração.

Função Snowflake

Uma função do Snowflake está associada a um tempo de execução específico do Openflow e utilizada para as seguintes tarefas:

  • Conceder acesso aos recursos do Snowflake.

  • Conceder acesso a recursos específicos do conector

Snowflake roles are linked to Openflow Snowflake Managed Token, avoiding the need for customers to create separate service users and key pairs for authentication to Snowflake.

Nota

<RUNTIMENAME> indica o nome do tempo de execução associado.

Para criar uma função Snowflake:

  1. Crie a função Snowflake necessária.

    USE ROLE ACCOUNTADMIN;
    CREATE ROLE IF NOT EXISTS OPENFLOW_RUNTIME_ROLE_<RUNTIMENAME>
    
    Copy
  2. Conceda à função Snowflake acesso a um warehouse. A Snowflake recomenda o uso de um warehouse dedicado para ingestão de dados. Este warehouse deve ser utilizado ao configurar seus conectores para tempos de execução nos quais você usará esta função do Snowflake.

    GRANT USAGE, OPERATE ON WAREHOUSE <OPENFLOW_INGEST_WAREHOUSE> TO ROLE OPENFLOW_RUNTIME_ROLE_<RUNTIMENAME>;
    
    Copy
  3. Permitir que a função do Snowflake use, crie ou acesse objetos Snowflake.

    Nota

    Dependendo do conector Openflow que está sendo criado, os objetos subjacentes necessários variam. O exemplo abaixo serve apenas para fins ilustrativos.

    GRANT USAGE ON DATABASE <OPENFLOW_DATABASE> TO ROLE OPENFLOW_RUNTIME_ROLE_<RUNTIMENAME>;
    GRANT USAGE ON SCHEMA <OPENFLOW_SCHEMA> TO ROLE OPENFLOW_RUNTIME_ROLE_<RUNTIMENAME>;
    
    Copy
  4. Allow the user to use the Snowflake role

    GRANT ROLE OPENFLOW_RUNTIME_ROLE_<RUNTIMENAME> TO USER <username>;
    
    Copy

Exemplo de configuração de função

Considere um cenário em que as seguintes funções devem ser definidas:

  • accountadmin: função pronta para uso do Snowflake, que tem esses dois privilégios CREATE:

    • CREATE OPENFLOW DATA PLANE INTEGRATION

    • CREATE OPENFLOW RUNTIME INTEGRATION

  • deployment_manager: pode criar, gerenciar e excluir implantações.

  • deployment1_runtime_manager_1: só pode criar um tempo de execução na implantação 1. Ele pode modificar e excluir um tempo de execução criado na implementação 1, mas não um tempo de execução criado por deployment1_runtime_manager_2.

  • deployment1_runtime_manager_2: só pode criar um tempo de execução na implantação 1. Ele pode modificar e excluir um tempo de execução criado na implementação 1, mas não um tempo de execução criado por deployment1_runtime_manager_1.

  • deployment1_runtime_viewer_1: pode visualizar uma tela de tempo de execução na implantação 1 que foi criada por deployment1_runtime_manager_1.

  • deployment1_runtime_viewer_2: pode visualizar uma tela de tempo de execução na implantação 1 que foi criada por deployment1_runtime_manager_2.

  • deployment2_runtime_manager: só pode criar um tempo de execução na implantação 2.

  • deployment2_runtime_viewer: pode visualizar uma tela de tempo de execução na implantação 2.

Para configurar o Openflow com essas funções, siga estas etapas:

  1. Crie novas funções e designe os privilégios relevantes:

    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. Para criar uma implantação, siga estas etapas:

    1. Faça login no Snowsight como deployment_manager.

    2. No menu de navegação, selecione Ingestion » Openflow.

    3. Para criar a implantação 1, selecione Create a deployment e conceda o privilégio USAGE para deployment1_runtime_manager_1 e deployment1_runtime_manager_2.

    4. Para criar a implantação 2, selecione Create a deployment e conceda o privilégio USAGE para deployment2_runtime_manager.

  3. Para criar um tempo de execução na implantação 1, siga estas etapas:

    1. Faça login como deployment1_runtime_manager_1.

    2. Crie um tempo de execução conforme descrito nas seções a seguir. deployment1_runtime_manager_1 deve ser capaz de criar tempos de execução e gerenciar quaisquer tempos de execução que ele tenha criado nessa implantação.

    3. Na UI do Openflow, selecione deployment1_runtime_viewer_1 e conceda a ela o privilégio USAGE.

Conta AWS

Verifique o seguinte em sua conta AWS:

  • Você tem uma conta AWS com as permissões necessárias para criar uma pilha CloudFormation.

  • Um administrador da AWS em sua organização pode executar o script CloudFormation para configurar um Amazon Elastic Kubernetes Service (EKS) dentro de uma nova VPC (criada pelo CloudFormation) ou uma VPC existente. Consulte Pré-requisitos para BYO-VPC (VPC existente).

Nota

Para saber como a instalação do Openflow ocorre em sua conta AWS e as permissões configuradas pelo modelo CloudFormation, consulte Processo de instalação.

Pré-requisitos para BYO-VPC (VPC existente)

Se quiser usar uma VPC existente e as próprias sub-redes, você deve ter o seguinte:

  • Para entrada gerenciada pelo Snowflake, duas sub-redes públicas com:

    • Zonas de disponibilidade diferentes

    • No mínimo, intervalos CIDR /27 com 32 IPs disponíveis.

    • Rotas para o destino 0.0.0.0/0 e gateway de internet de destino ou algum outro roteamento de saída para a internet.

    • Uma tag que permite ao Openflow criar um balanceador de carga:

      • Chave: kubernetes.io/role/elb

      • Valor: 1

    • Se as sub-redes públicas forem usadas por outros clusters EKS, uma tag que permite ao Openflow criar um balanceador de carga junto com outros balanceadores de carga:

      • Chave: kubernetes.io/cluster/{deployment-key}

      • Valor: 1

    Nota

    O gerenciamento da sua própria entrada elimina a necessidade de sub-redes públicas, mas requer configuração adicional em sua conta AWS. Para obter mais informações, consulte BYOC do Openflow – Configurar entrada personalizada.

  • Duas sub-redes privadas com:

    • Zonas de disponibilidade diferentes

    • No mínimo, intervalos CIDR /24 com 255 IPs disponíveis. Isso limita o número e a escala de tempos de execução que você pode criar; portanto, pode ser mais apropriado usar um intervalo maior para a implementação.

    • Conectividade com os serviços Snowflake e AWS da sub-rede privada 1 em que a implantação do Openflow é executada.

      • Entre muitas opções, você pode se conectar usando tabelas de rotas com um Gateway da NAT, um Transit Gateway ou pontos de extremidade de VPC PrivateLink.

      • Sem essa conectividade, a implantação do Openflow não será inicializada ou configurada corretamente e nenhuma infraestrutura será provisionada.

    • Para entrada gerenciada pelo Snowflake, conectividade de saída com LetsEncrypt.org, que fornecerá um certificado TLS.

Aceite os termos de serviço do Openflow

Esta etapa é necessária apenas uma vez para sua organização.

  1. Faça login no Snowflake como um usuário com a função ORGADMIN.

  2. No menu de navegação, selecione Ingestion » Openflow.

  3. Aceite os termos de serviço do Openflow.

Crie uma implementação em sua nuvem

Configuração da implantação em sua conta Snowflake

Importante

Faça login no Snowflake com uma função que seu ACCOUNTADMIN atribuiu para usar o Openflow.

Não ser nenhuma das seguintes funções: ACCOUNTADMIN, ORGADMIN, GLOBALORGADMIN ou SECURITYADMIN.

Se você vir uma tela em branco ou o erro: «message: Invalid consent request» ao fazer login no Openflow, altere sua função para uma que não esteja entre essas listadas.

Para obter mais informações, consulte Pré-requisitos.

  1. No menu de navegação, selecione Ingestion » Openflow.

  2. Selecione Launch Openflow.

  3. Na UI do Openflow, selecione Create a deployment.

  4. Na aba Deployments, selecione Create a deployment. O assistente Creating a deployment é exibido.

  5. Na etapa Prerequisites, certifique-se de que você atenda a todos os requisitos e, em seguida, selecione Next.

  6. Na etapa Deployment location, selecione Amazon Web Services como o local de implantação, insira um nome para sua implantação e selecione Next.

  7. Selecione uma das seguintes opções na etapa Configuration:

    • Managed VPC: escolha esta opção se deseja que sua VPC seja gerenciada pelo Snowflake.

    • Bring your own VPC: escolha essa opção se quiser usar uma VPC existente.

Aplicação do modelo do CloudFormation à sua conta da AWS

  1. Em sua conta da AWS, crie uma nova pilha do CloudFormation usando o modelo. Após a criação da instância do Amazon Elastic Compute Cloud (EC2) do agente de implantação do Openflow, essa instância conclui o restante do processo de instalação usando scripts de infraestrutura como código. Você pode acompanhar o progresso da instalação conforme descrito em Acompanhamento do progresso da instalação.

    Se você estiver usando uma VPC existente, ao carregar o modelo CloudFormation, selecione os respectivos valores nas listas suspensas para as duas sub-redes privadas e sua VPC.

Criação de uma regra de rede para o Openflow em sua conta Snowflake

Esta etapa é necessária somente se você está usando políticas de rede para controlar o acesso ao Snowflake. Uma política de redes é um conjunto de regras que controlam quais endereços IP podem acessar sua conta Snowflake.

  1. Navegue até sua conta Snowflake.

  2. Identifique o endereço IP público do gateway NAT que foi criado como parte da pilha do CloudFormation. Você pode encontrar isso pesquisando por gateway NAT no Console da AWS ou verificando a saída da pilha do CloudFormation.

    O gateway NAT é responsável pela saída do Openflow para o Data Plane Agent (DPA) e o EKS. DPA e EKS são executados na sub-rede privada 1 da instalação.

  3. Crie uma regra de rede para o Openflow e adicione-o à sua política de redes existente. Substitua {$NAT_GATEWAY_PUBLIC_IP} no seguinte trecho de código com o endereço IP público do gateway NAT que foi criado como parte da pilha do CloudFormation.

    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. Encontre sua política de redes atualmente ativa.

    SHOW PARAMETERS LIKE 'NETWORK_POLICY' IN ACCOUNT;
    
    Copy
  5. Copie a coluna valor da saída e use-a para criar uma regra de rede:

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

Configuração de uma tabela de eventos para registrar em log os eventos do Openflow (obrigatório)

Use uma das seguintes opções para configurar uma tabela de eventos:

  • Crie uma nova tabela de eventos específica do Openflow (recomendado):

    USE ROLE ACCOUNTADMIN;
    
    CREATE DATABASE IF NOT EXISTS openflow;
    USE openflow;
    CREATE SCHEMA IF NOT EXISTS openflow;
    USE SCHEMA openflow;
    
    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
  • Crie uma tabela de eventos específica da conta:

    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
  • Use uma tabela de eventos específica da conta existente:

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

Verificação da implementação

  1. Navegue até a UI do Openflow. A criação de uma implementação leva cerca de 45 minutos no AWS. Depois de criada, você pode visualizar a implementação na guia Implementações da UI do Openflow com seu estado marcado como Active.

Crie um ambiente de tempo de execução em sua nuvem

  1. No Openflow Control Plane, selecione Create a runtime. A caixa de diálogo Create Runtime aparece.

  2. Na lista suspensa Deployment, escolha a implementação na qual deseja criar um tempo de execução.

  3. Digite um nome para seu tempo de execução.

  4. Escolha um tipo de nó na lista suspensa Node type. Isso especifica o tamanho de seus nós.

  5. No seletor de intervalo Min/Max node, selecione um intervalo. O valor mínimo especifica o número de nós com os quais o tempo de execução inicia quando ocioso, e o valor máximo especifica o número de nós para os quais o tempo de execução pode ser escalonado, em caso de alto volume de dados ou carga de CPU.

  6. Selecione Create. O tempo de execução leva alguns minutos para ser criado.

Depois de criado, você pode visualizar o tempo de execução navegando até a guia Runtimes do plano de controle do Openflow. Clique no tempo de execução para abrir a tela do Openflow.

Próxima etapa

Implemente um conector em um tempo de execução. Para obter uma lista dos conectores disponíveis no Openflow, consulte Conectores Openflow.

Considerações sobre a rede: Openflow EKS para sistemas de origem

Para implantações BYOC, observe as seguintes considerações:

  • A pilha do Openflow CloudFormation cria uma VPC com duas sub-redes públicas e duas sub-redes privadas.

  • As sub-redes públicas hospedam o balanceador de carga de rede da AWS, que é criado posteriormente. As sub-redes privadas hospedam o cluster EKS e todas as instâncias do EC2 que suportam os grupos de nós. Os tempos de execução do Openflow são executados na sub-rede privada 1.

  • No momento, o gateway NAT é a saída para DPA e EKS. Tanto DPA quanto EKS são executados na sub-rede privada 1 da instalação.

Para implantações BYO-VPC, observe as seguintes considerações:

  • O Openflow exige que você insira as duas sub-redes privadas que executarão o Openflow e duas sub-redes públicas para o balanceador de carga da AWS.

  • Você precisa fornecer seu próprio roteamento de saída para a Internet a partir dessas sub-redes privadas, que podem ser o gateway NAT central.

  • Nenhum gateway de Internet é criado pelo Openflow. Você precisa fornecer o roteamento de saída de Internet público apropriado.

Geralmente, a conectividade de rede segue este padrão: uma instância EC2 do Openflow (agente ou EKS) é executada em uma sub-rede privada que requer entradas da tabela de rotas para enviar o tráfego de saída a um Transit Gateway, um ponto de extremidade de VPC PrivateLink ou um Gateway da NAT conectado a um gateway de internet.

Exemplo: implementação de BYOC com uma nova VPC para se comunicar com RDS em uma VPC diferente da mesma conta

Para permitir a comunicação entre o cluster do Openflow EKS e a instância RDS, você precisa criar um novo grupo de segurança, com o grupo de segurança do cluster EKS como a origem da regra de entrada para a conectividade RDS, e anexar o grupo no RDS.

  1. Localize o grupo de segurança do cluster EKS, navegue até o EKS e encontre sua chave de implementação. Você também pode encontrá-lo na UI do Openflow executando as seguintes etapas:

    1. Faça login no Openflow.

    2. Acesse a guia Deployments.

    3. Selecione o ícone Mais opções ao lado de sua implementação.

    4. Selecione View details. O valor no campo Key é sua chave de implementação.

  2. Após encontrar a chave de implementação, você pode usá-la para filtrar os recursos AWS pelo valor da chave.

  3. Crie um novo grupo de segurança que permita o acesso pela porta do banco de dados relevante (5432 no caso de PostgreSQL por padrão) ao cluster do Openflow EKS.

  4. Anexe-o no RDS como um novo grupo de segurança.

Se precisar solucionar problemas, o Analisador de acessibilidade pode ser útil. Ele fornecerá a você informações detalhadas sobre o que pode estar bloqueando a conectividade, usando os recursos de rastreamento da plataforma AWS.

Consulte os seguintes documentos AWS para acessar as instâncias de DB usando o peering de VPC e a configuração do grupo de segurança associado:

Configuração de implementações privadas

Implantações privadas são um recurso que permite implantar o Openflow em uma VPC sem a necessidade de entrada ou saída de Internet pública.

Para configurar implantações privadas, você precisa escolher as seguintes opções ao criar uma nova implantação:

  1. Na etapa Deployment location, selecione Amazon Web Services como o local da implantação.

  2. Na etapa VPC Configuration, selecione Bring your own VPC para usar uma VPC existente.

  3. Na etapa PrivateLink, ative o recurso PrivateLink. A ativação desta opção requer configuração adicional na sua conta AWS. Consulte Configuração do PrivateLink na AWS. A opção End user authentication over PrivateLink pode ser habilitada ou desabilitada.

  4. Na etapa Custom ingress, ative o recurso de entrada personalizada. Ativar esta opção requer configuração adicional na sua conta AWS. Para obter mais informações, consulte BYOC do Openflow – Configurar entrada personalizada.

Implantações privadas exigem que a VPC existente consiga acessar os seguintes domínios:

  • *.amazonaws.com, uma lista detalhada dos serviços acessados ​ inclui:

    • 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

  • oidc-eks.<your-region>.api.aws

  • shield.us-east-1.amazonaws.com

Processo de instalação

Entre a pilha CloudFormation e o Openflow Agent, há várias etapas coordenadas que o processo de instalação da implementação BYOC gerencia. O objetivo é separar as responsabilidades entre uma inicialização a frio que ofereça às organizações uma maneira fácil de fornecer entradas para a implementação de BYOC (resolvida por meio de CloudFormation) e a configuração da implementação e seus principais componentes de software que precisarão ser alterados ao longo do tempo (resolvida pelo Openflow Agent).

O Agent de implementação facilita a criação da infraestrutura de implementação do Openflow e a instalação dos componentes de software de implementação, incluindo o serviço de implementação. O agente de implementação se autentica no Snowflake System Image Registry para obter imagens de contêineres do Openflow.

As etapas são as seguintes:

Nota

Ao usar BYO-VPC, você escolherá um VPC ID e dois IDs de sub-rede privada no modelo, bem como a pilha CloudFormation usará os selecionados em vez de criar os recursos mencionados nas etapas 1a, 1b e 1c.

  1. O modelo CloudFormation cria o seguinte e o configura com as permissões AWS mencionadas em Permissões AWS configuradas:

    1. Uma VPC com duas sub-redes públicas e duas sub-redes privadas. As sub-redes públicas hospedam o balanceador de carga de rede AWS (criado posteriormente). As sub-redes privadas hospedam o cluster EKS e todas as instâncias EC2 que fazem backup de NodeGroups. Os tempos de execução do Openflow são executados em uma sub-rede privada.

    2. Gateway de Internet para saída da VPC

    3. Gateway NAT para saída das sub-redes privadas

    4. Entrada do gerenciador de segredos AWS para a configuração do OIDC inserida pelo usuário

    5. Função IAM e perfil de instância para o Openflow Agent usar a partir de sua instância EC2

    6. Uma instância EC2 para o agente de implantação do OpenFlow, completa com um script UserData para executar automaticamente o processo de inicialização. Esse script define variáveis ​​de ambiente para o agente de implantação do OpenFlow usar, derivadas dos parâmetros de entrada CloudFormation.

    7. Ponto de extremidade do EC2 Instance Connect para o agente de implantação do OpenFlow atualizar a implantação quando necessário.

      • Ao usar BYO-VPC, por padrão, a pilha CloudFormation criará um ponto de extremidade do EC2 Instance Connect. No entanto, esse comportamento padrão pode ser modificado. Ao usar a opção de VPC gerenciada, a pilha CloudFormation sempre criará um ponto de extremidade do EC2 Instance Connect.

      • O ponto de extremidade Instance Connect pode ser compartilhado entre várias VPCs.

      • Se uma implementação for excluída, juntamente com a exclusão da pilha CloudFormation, ela também removerá o ponto de extremidade. Isso bloquearia o acesso a outros agentes BYO-VPC se o ponto de extremidade for compartilhado.

      • Para adicionar um ponto de extremidade do EC2 Instance Connect, execute as seguintes etapas em sua conta AWS:

        1. Na navegação à esquerda, navegue até VPC » Endpoints.

        2. Selecione Create Endpoint.

        3. Escolha o tipo de ponto de extremidade como EC2 Instance Connect.

        4. Selecione um VPC. Deixe todos os grupos de segurança desmarcados (não selecionados) para usar o grupo de segurança padrão da VPC.

        5. Ao selecionar uma sub-rede, use o mesmo valor da Private Subnet 1 nos parâmetros de CloudFormation.

        6. Selecione Create. A criação do ponto de extremidade leva aproximadamente cinco minutos.

    8. Bucket S3 que armazena o estado, os registros e as saídas do Terraform para o Openflow Agent

  2. O agente de implementação do Openflow cria o seguinte:

    1. Um cluster EKS contendo:

    • Grupos de nós

    • Grupos de dimensionamento automático

    • Complemento AWS VPC Container Network Interface (CNI)

    • Complemento Amazon Elastic Block Store (EBS) CSI

    1. Registros do gerenciador de segredos para PostgreSQL, credenciais OAuth e assim por diante.

    2. Políticas e funções IAM de várias contas de serviço K8s para recuperar seus segredos no gerenciador de segredos AWS.

    3. Componentes do K8s

    • Namespaces

    • Escalonador automático de cluster

    • Armazenamento expansível EBS CSI

    • Controlador de balanceador de carga AWS, que cria o balanceador de carga de rede publicamente acessível

    • Emissor do certificado Let’s Encrypt

    • Nginx Ingress, configurado para Let’s Encrypt

    • Servidor de métricas

    • Gerenciador de certificados do Jetstack

    • Operador de segredos externos

    • Contas de serviço para Temporal, serviço de implementação e OIDC

    • Armazenamento de segredos para Temporal, serviço de implementação e OIDC

    • Segredos externos para o serviço Temporal e de implementação. O segredo externo para OIDC é criado e gerenciado pelo operador de tempo de execução.

    • PostgreSQL

    • Temporal

    • Emissor de certificado autoassinado e configuração de entrada para comunicações entre nós de tempo de execução

    • Operador de tempo de execução do Openflow

    • Serviço de implementação do Openflow

Por padrão, todas as contas AWS têm uma cota de cinco endereços IP Elastic por região, pois os endereços de Internet públicos (IPv4) são um recurso público escasso. A Snowflake recomenda enfaticamente que você use os endereços IP Elastic principalmente por sua capacidade de remapear o endereço para outra instância em caso de falha da instância, e use os nomes de host DNS para todas as outras comunicações entre nós.

Acompanhe o progresso da instalação

Depois que a pilha CloudFormation passa para o estado CREATE_COMPLETE, o agente Openflow cria automaticamente o restante da infraestrutura.

Há algumas etapas que podem levar de 10 a 15 minutos cada uma, como, por exemplo:

  1. Criação do cluster EKS

  2. Instalação do complemento EBS CSI no cluster EKS

  3. Criação do banco de dados RDS PostgreSQL

O relatório de status do agente Openflow ainda não está disponível. Enquanto isso, você pode visualizar os registros no agente Openflow para verificar se a implementação do BYOC está pronta para os tempos de execução. Para fazer isso, execute as seguintes etapas:

  1. Na lista de instâncias EC2, localize as duas instâncias a seguir:

    • openflow-agent-{data-plane-key}: este é o agente do Openflow que você usará para gerenciar os tempos de execução

    • {data-plane-key}-mgmt-group: esse é um nó no cluster EKS da implementação do BYOC que executa um operador e outros softwares principais

  2. Clique com o botão direito do mouse na instância do openflow-agent-{data-plane-key} e selecione Connect.

  3. Mudar de EC2 Instance Connect para Connect using EC2 Instance Connect Endpoint. Deixe o ponto de extremidade padrão do EC2 Instance Connect no lugar.

  4. Clique em Connect. Uma nova guia ou janela do navegador aparecerá com uma interface de linha de comando.

  5. Execute o seguinte comando tail para monitorar os logs de instalação da imagem do docker que está configurando sua implementação:

    journalctl -xe -f -n 100 -u docker
    
    Copy
  6. Quando a instalação for concluída, você verá a seguinte saída:

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

Permissões configuradas no AWS

Esta seção lista as permissões do AWS configuradas pela pilha Openflow BYOC com base nas funções.

Nota

{key} representa a chave de implementação que identifica com exclusividade os recursos de nuvem criados e gerenciados pelo Openflow para uma implementação específica.

Usuário administrativo

cloudformation e todas as permissões a seguir.

Função IAM: 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

Função IAM: {key}-cluster-ServiceRole

Políticas gerenciadas por AWS:

  • 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

Função IAM: {key}-addon-vpc-cni-Role

Políticas gerenciadas por AWS:

  • AmazonEKS_CNI_Policy

Função IAM: {key}-eks-role

Políticas gerenciadas por AWS:

  • AmazonEBSCSIDriverPolicy

  • AmazonEC2ContainerRegistryReadOnly

  • AmazonEKS_CNI_Policy

  • 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

Nota

{VPC_ID} representa o identificador do VPC criado por BYOC ou usado por BYO-VPC.

Função IAM: 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

Função IAM: 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

Função IAM: 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

Função IAM: 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

Função IAM: 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

Função IAM: {key}-nodegroup-NodeInstanceRole

Políticas gerenciadas por AWS:

  • AmazonEBSCSIDriverPolicy

  • AmazonEC2ContainerRegistryReadOnly

  • AmazonEKS_CNI_Policy

  • 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