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¶
You’ll need to first define privileges at the Snowflake account level.
Run the following SQL commands to grant the required privileges to the Openflow admin role:
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;
The new privileges are assigned to the ACCOUNTADMIN role as part of the default set of privileges, and that role can grant the privileges to a role of their choosing for the Openflow admin role, denoted as $openflow_admin_role in the code.
Em seguida, defina
default_secondary_rolescomoALLpara todos os usuários do Openflow: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.
Run the following code, replacing $openflow_user for each Openflow user:
USE ROLE ACCOUNTADMIN; ALTER USER $openflow_user SET DEFAULT_SECONDARY_ROLES = ('ALL');
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¶
The runtime object represents a cluster of one or more Snowflake Openflow runtime servers, provisioned to run flow definitions. For Kubernetes deployments, the runtime object represents a stateful set of Snowflake Openflow runtime containers deployed in a namespace, along with supporting components.
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: Enables read access to the deployed runtime for observing health and status, without making any changes.
Snowflake role¶
A Snowflake role is a Snowflake role that is associated with a specific Openflow runtime and used for the following tasks:
Conceder acesso aos recursos do Snowflake.
Conceder acesso a recursos específicos do conector
Snowflake roles are linked to Openflow Snowflake managed tokens, avoiding the need for customers to create separate service users and key pairs for authentication to Snowflake. Snowflake roles require CREATE USER privilege to set Snowflake roles as OpenFlow helps manage the service users used by Workload identity federation.
Nota
<RUNTIMENAME> indica o nome do tempo de execução associado.
To create a Snowflake role:
Create the required Snowflake role.
USE ROLE ACCOUNTADMIN; CREATE ROLE IF NOT EXISTS OPENFLOW_RUNTIME_ROLE_<RUNTIMENAME>
Grant the Snowflake role access to a warehouse. Snowflake recommends using a dedicated warehouse for data ingestion. This warehouse should be used when configuring your connectors for runtimes where you will be using this Snowflake role.
GRANT USAGE, OPERATE ON WAREHOUSE <OPENFLOW_INGEST_WAREHOUSE> TO ROLE OPENFLOW_RUNTIME_ROLE_<RUNTIMENAME>;
Allow the Snowflake role to use, create or otherwise access Snowflake objects.
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>;
Allow the runtime manager to manage Snowflake role
GRANT OWNERSHIP ON ROLE OPENFLOW_RUNTIME_ROLE_<RUNTIMENAME> TO ROLE deployment1_runtime_manager_1; GRANT ROLE OPENFLOW_RUNTIME_ROLE_<RUNTIMENAME> TO ROLE deployment1_runtime_manager_1;
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: Can create a runtime only within deployment 1. It can modify and delete a runtime that it created within deployment 1, but not a runtime created by deployment1_runtime_manager_2.
deployment1_runtime_manager_2: Can create a runtime only within deployment 1. It can modify and delete a runtime that it created within deployment 1, but not a runtime created by 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:
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>;
Para criar uma implantação, siga estas etapas:
Faça login no Snowsight como deployment_manager.
No menu de navegação, selecione Ingestion » Openflow.
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.
Para criar a implantação 2, selecione Create a deployment e conceda o privilégio USAGE para deployment2_runtime_manager.
Para criar um tempo de execução na implantação 1, siga estas etapas:
Faça login como deployment1_runtime_manager_1.
Create a runtime as described in the following sections. deployment1_runtime_manager_1 should be able to create runtimes and manage any runtimes it created within this deployment.
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)¶
If you want to use an existing VPC and your own subnets, ensure that you have the following:
Para entrada gerenciada pelo Snowflake, duas sub-redes públicas com:
Different availability zones
No mínimo, intervalos CIDR /27 com 32 IPs disponíveis.
Routes for destination 0.0.0.0/0 and target internet gateway or some other egress routing to the internet.
Uma tag que permite ao Openflow criar um balanceador de carga:
Key:
kubernetes.io/role/elbValue:
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}Value:
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:
Different availability zones
At least /24 CIDR ranges with 255 available IPs. This limits the number and scale of runtimes you can create, so it may be more appropriate to use a larger range for the deployment.
Connectivity to Snowflake and AWS services from Private Subnet 1 where the Openflow deployment runs.
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.
Without this connectivity, the Openflow deployment will not initialize or set up properly and no infrastructure will be provisioned.
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.
Faça login no Snowflake como um usuário com a função ORGADMIN.
No menu de navegação, selecione Ingestion » Openflow.
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.
No menu de navegação, selecione Ingestion » Openflow.
Selecione Launch Openflow.
Na UI do Openflow, selecione Create a deployment.
Na aba Deployments, selecione Create a deployment. O assistente Creating a deployment é exibido.
Na etapa Prerequisites, certifique-se de que você atenda a todos os requisitos e, em seguida, selecione Next.
Na etapa Deployment location, selecione Amazon Web Services como o local de implantação, insira um nome para sua implantação e selecione Next.
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.
Na etapa PrivateLink, você pode selecionar se deseja estabelecer comunicação com o Snowflake por meio do link privado. Ativar esta opção requer configuração adicional na sua conta AWS. Para obter mais informações, consulte AWS PrivateLink e Snowflake.
Se a opção PrivateLink estiver habilitada, a etapa End user authentication over PrivateLink é exibida.
Se habilitada, a autenticação baseada no navegador redireciona o uso dos pontos de extremidade do PrivateLink.
If disabled, end-user authentication uses public Snowflake URLs.
Independentemente desta configuração, as comunicações de implantação com o Snowflake usarão PrivateLink.
Se você acessar o Snowsight por um URL do PrivateLink, certifique-se de que ele esteja habilitado. Se você acessar o Snowsight por meio de um URL não pertencente ao PrivateLink, deixe-o desativado.
Na etapa Custom Ingress, você pode optar por gerenciar sua própria configuração de entrada para a implantação do Openflow, como especificar grupos de segurança personalizados, configurações do balanceador de carga ou outros controles de rede.
Enabling this option requires additional setup in your AWS account. For more information, see BYOC do Openflow – Configurar entrada personalizada.
Selecione Create Deployment.
Após a configuração da sua implantação, uma caixa de diálogo será exibida, permitindo que você baixe o modelo CloudFormation para concluir o processo de configuração na sua conta AWS. Baixe esse modelo. Observe que o Openflow não oferece suporte à modificação do modelo do CloudFormation. Não modifique nenhum valor após baixar o modelo, apenas selecione as opções do menu suspenso.
(Opcional) Para criptografar volumes EBS para sua implementação BYOC do , consulte BYOC do Openflow: configuração de volumes EBS criptografados.
Aplicação do modelo do CloudFormation à sua conta da AWS¶
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.
Navegue até sua conta Snowflake.
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.
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');
Encontre sua política de redes atualmente ativa.
SHOW PARAMETERS LIKE 'NETWORK_POLICY' IN ACCOUNT;
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);
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';
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;
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';
Verificação da implementação¶
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¶
No Openflow Control Plane, selecione Create a runtime. A caixa de diálogo Create Runtime aparece.
Na lista suspensa Deployment, escolha a implementação na qual deseja criar um tempo de execução.
Digite um nome para seu tempo de execução.
Escolha um tipo de nó na lista suspensa Node type. Isso especifica o tamanho de seus nós.
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.
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.
The network connectivity generally is as follows: An Openflow EC2 Instance (Agent or EKS) runs in a private subnet that requires Route Table entries to send egress traffic to a Transit Gateway, a PrivateLink VPC Endpoint, or a NAT Gateway connected to an Internet Gateway.
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.
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:
Faça login no Openflow.
Acesse a guia Deployments.
Selecione o ícone Mais opções ao lado de sua implementação.
Selecione View details. O valor no campo Key é sua chave de implementação.
Após encontrar a chave de implementação, você pode usá-la para filtrar os recursos AWS pelo valor da chave.
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.
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 do PrivateLink na AWS¶
Esta seção explica como acessar e configurar o Openflow usando conectividade privada.
Acessar o Openflow por PrivateLink¶
Antes de iniciar a configuração do link privado, habilite o PrivateLink para sua conta, conforme descrito em AWS PrivateLink e Snowflake.
Usando a função
ACCOUNTADMIN, chame a funçãoSYSTEM$GET_PRIVATELINK_CONFIGem sua conta Snowflake e identifique o valor paraopenflow-privatelink-url. Este é o URL para acessar o Openflow pelo PrivateLink.Crie um registro
CNAMEem seu DNS para resolver o valor do URL para o ponto de extremidade da sua VPC.Confirme se as configurações de DNS conseguem resolver o valor.
Confirme se você consegue se conectar à UI do Openflow usando esse URL em seu navegador.
Configurar uma nova implantação usando o PrivateLink¶
Nota
A Snowflake recomenda que você use a versão Bring your own VPC da implantação do Openflow e crie um ponto de extremidade de VPC em sua VPC antes de aplicar o modelo do CloudFormation.
Antes de iniciar a configuração do PrivateLink, certifique-se de que o PrivateLink esteja ativado para sua conta, conforme descrito em AWS PrivateLink e Snowflake.
Execute as seguintes etapas:
Recupere o ID do serviço de ponto de extremidade de VPC do Snowflake e os URLs do Openflow PrivateLink:
Execute o seguinte comando SQL usando a função
ACCOUNTADMIN:SELECT SYSTEM$GET_PRIVATELINK_CONFIG()
Na saída, identifique e salve os valores para as seguintes chaves:
privatelink-vpce-idopenflow-privatelink-urlexternal-telemetry-privatelink-url
Crie um ponto de extremidade de VPC com os parâmetros:
Tipo: PrivateLink Ready partner services
Serviço: valor
privatelink-vpce-idobtido na etapa anterior.VPC: a VPC onde sua implantação do Openflow será executada.
Sub-redes: selecione duas zonas de disponibilidade e sub-redes privadas onde sua implantação do Openflow será executada.
Configure a zona hospedada privada do Route 53 com os seguintes parâmetros:
Domínio:
privatelink.snowflakecomputing.comTipo: Private hosted zone
Selecione a região e a VPC onde sua implantação do Openflow será executada.
Adicione dois registros
CNAMEpara os URLs identificados na primeira etapa:Para
openflow-privatelink-urlNome do registro: valor
openflow-privatelink-urlobtido na primeira etapaTipo de registro:
CNAMEValor: nome DNS do ponto de extremidade da sua VPC
Para
external-telemetry-privatelink-urlNome do registro: valor
external-telemetry-privatelink-urlobtido na primeira etapaTipo de registro:
CNAMEValor: nome DNS do ponto de extremidade da sua VPC
Crie um grupo de segurança dedicado para a implantação e habilite o tráfego do grupo de segurança para o ponto de extremidade de VPC:
Abra o grupo de segurança associado ao ponto de extremidade da sua VPC.
Adicione uma regra de entrada ao grupo de segurança que permita All traffic do grupo de segurança criado para sua implantação.
Crie uma nova implantação e aplique a pilha do CloudFormation seguindo as instruções na seção Criar uma implantação na sua nuvem e certifique-se de que:
A opção PrivateLink esteja ativada. A opção End user authentication over PrivateLink pode ser habilitada ou desabilitada.
O grupo de segurança criado para a implantação seja usado ao criar a pilha do CloudFormation.
Aguarde até que o cluster do EKS para sua implantação seja criado. Para confirmar a criação bem-sucedida, navegue até o console da AWS em Elastic Kubernetes Service. Verifique se um cluster identificado como
<deployment-key>exibe o status ACTIVE.Permita tráfego do seu EKS para o ponto de extremidade de VPC:
Abra o grupo de segurança associado ao ponto de extremidade da sua VPC.
Adicione uma regra de entrada ao grupo de segurança que permita All traffic do grupo de segurança atribuído ao cluster do EKS. O grupo de segurança do cluster do EKS começa com
eks-cluster-sg-<deployment-key>-.
Configuração de pontos de extremidade do gateway da VPC para S3 em AWS¶
Configurar um ponto de extremidade de VPC do gateway da AWS para S3 é o método principal para permitir que uma instância do EC2 do agente em uma sub-rede privada acesse o repositório do Amazon Linux 2023 de forma privada, sem a necessidade de um gateway de Internet, um gateway NAT ou um endereço IP público na instância. A instância do EC2 do agente usa este repositório para instalar as dependências, por exemplo, o Docker.
Para configurar um ponto de extremidade do gateway de VPC para S3:
Abra um navegador no painel VPC da AWS.
No painel de navegação, selecione Endpoints.
Clique em Create endpoint e crie um novo ponto de extremidade de VPC com os parâmetros:
Tipo: AWS services
Serviço:
com.amazonaws.<your-region>.s3do tipoGatewayVPC: selecione a VPC da sua implantação
Tabelas de rotas: selecione a(s) tabela(s) de rotas associada(s) à(s) sua(s) sub-rede(s) privada(s)
Política: escolha Full access
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:
Na etapa Deployment location, selecione Amazon Web Services como o local da implantação.
Na etapa VPC Configuration, selecione Bring your own VPC para usar uma VPC existente.
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.
In the Custom ingress step, enable the custom ingress feature. Enabling this option requires additional setup in your AWS account. For more information, see 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.iamcom.amazonaws.<your-region>.s3com.amazonaws.<your-region>.ec2com.amazonaws.<your-region>.ecr.apicom.amazonaws.<your-region>.ecr.dkrcom.amazonaws.<your-region>.secretsmanagercom.amazonaws.<your-region>.stscom.amazonaws.<your-region>.ekscom.amazonaws.<your-region>.autoscaling
*.privatelink.snowflakecomputing.comoidc-eks.<your-region>.api.awsshield.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.
O modelo CloudFormation cria o seguinte e o configura com as permissões AWS mencionadas em Permissões AWS configuradas:
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.
Gateway de Internet para saída da VPC
Gateway NAT para saída das sub-redes privadas
Entrada do gerenciador de segredos AWS para a configuração do OIDC inserida pelo usuário
Função IAM e perfil de instância para o Openflow Agent usar a partir de sua instância EC2
An EC2 instance for Openflow deployment agent, complete with a UserData script to automatically run the initialization process. This script sets environment variables for the Openflow deployment agent to use, derived from the input CloudFormation parameters.
EC2 Instance Connect endpoint for the Openflow deployment agent to upgrade the deployment when needed.
When using BYO-VPC, by default the CloudFormation stack will create an EC2 Instance Connect endpoint. However, this default behavior can be modified. When using the managed VPC option, the CloudFormation stack will always create an EC2 Instance Connect endpoint.
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:
Na navegação à esquerda, navegue até VPC » Endpoints.
Selecione Create Endpoint.
Choose the endpoint type as EC2 Instance Connect Endpoint.
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.
Ao selecionar uma sub-rede, use o mesmo valor da Private Subnet 1 nos parâmetros de CloudFormation.
Select Create. It takes approximately 5 minutes for the endpoint to be created.
Bucket S3 que armazena o estado, os registros e as saídas do Terraform para o Openflow Agent
O agente de implementação do Openflow cria o seguinte:
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
Registros do gerenciador de segredos para PostgreSQL, credenciais OAuth e assim por diante.
Políticas e funções IAM de várias contas de serviço K8s para recuperar seus segredos no gerenciador de segredos AWS.
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
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:
Criação do cluster EKS
Instalação do complemento EBS CSI no cluster EKS
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:
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
Clique com o botão direito do mouse na instância do openflow-agent-{data-plane-key} e selecione Connect.
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.
Click Connect. A new browser tab or window will appear with a command-line interface.
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
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"
}
]
}
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": "*"
}
]
}
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"
}
]
}
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"
}
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"
}
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"
}
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"
}
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"
}
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": "*"
}
]
}