Configurar o Openflow¶
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¶
Se você nunca usou repositórios de imagem em sua conta Snowflake, precisará definir o seguinte para garantir que o serviço de implementação possa extrair as imagens do Openflow do Snowflake.
USE ROLE ACCOUNTADMIN; CREATE DATABASE IF NOT EXISTS OPENFLOW; USE OPENFLOW; CREATE SCHEMA IF NOT EXISTS OPENFLOW; USE SCHEMA OPENFLOW; CREATE IMAGE REPOSITORY IF NOT EXISTS OPENFLOW; grant usage on database OPENFLOW to role public; grant usage on schema OPENFLOW to role public; grant read on image repository OPENFLOW.OPENFLOW.OPENFLOW to role public;
A configuração do Openflow exige a definição de novos privilégios no nível da conta Snowflake. Os novos privilégios são atribuídos à função ACCOUNTADMIN como parte do conjunto padrão de privilégios. ACCOUNTADMIN terá automaticamente os dois privilégios a seguir e poderá concedê-los a uma função de sua escolha para a função de administrador do Openflow, indicada como $OPENFLOW_ADMIN_ROLE no código a seguir:
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;
Além disso, você precisa definir
default_secondary_roles
comoALL
para todos os usuários do Openflow. Isso ocorre 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. Substitua $OPENFLOW_USER no código a seguir para cada usuário do Openflow:USE ROLE ACCOUNTADMIN; ALTER USER $OPENFLOW_USER SET DEFAULT_SECONDARY_ROLES = ('ALL');
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 implementações do Kubernetes, o objeto de tempo de execução representa um conjunto com estado de contêineres do Snowflake Openflow Runtime implementados em um namespace, juntamente com 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 implementado para observar a integridade e o status, sem fazer nenhuma alteração.
Exemplo de configuração de função¶
Vamos considerar o seguinte cenário em que queremos que as seguintes funções sejam configuradas:
accountadmin: função pronta para uso do Snowflake, que terá esses dois privilégios CREATE:
CREATE OPENFLOW DATA PLANE INTEGRATION
CREATE OPENFLOW RUNTIME INTEGRATION
deployment_manager: uma função que pode criar, gerenciar e excluir implementações
deployment1_runtime_manager_1: uma função que pode criar um tempo de execução somente na implementação 1. Ela pode modificar e excluir o tempo de execução na implementação 1 que criou, mas não o tempo de execução criado por deployment1_runtime_manager_2.
deployment1_runtime_manager_2: uma função que pode criar um tempo de execução somente dentro da implementação 1. Ela pode modificar e excluir um tempo de execução dentro da implementação 1 que criou, mas não o tempo de execução criado por deployment1_runtime_manager_1.
deployment1_runtime_viewer_1: função que pode visualizar a tela de tempo de execução na implementação 1, criada por deployment1_runtime_manager_1.
deployment1_runtime_viewer_2: função que pode visualizar a tela de tempo de execução dentro da implementação 1, criada por deployment1_runtime_manager_2.
deployment2_runtime_manager: uma função que pode criar um tempo de execução somente na implementação 2.
deployment2_runtime_viewer: uma função que pode visualizar uma tela de tempo de execução na implementação 2.
Para configurar o Openflow com essas funções, faça o seguinte:
Crie novas funções e atribua 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, since this privilege cannot be granted in openflow ui grant create openflow data plane integration on account to role deployment_manager; -- assign create runtime privilege to roles, since this privilege cannot be granted in cp ui grant create openflow runtime integration on account to role deployment1_runtime_manager_1; grant create openflow runtime integration on account to role deployment1_runtime_manager_2; grant create openflow runtime integration on account to role deployment2_runtime_manager; -- grant these roles to desired users grant role <role name> to user <username>; ........
Crie uma implementação.
Faça login como deployment_manager.
Crie a implementação 1 na UI do Openflow. Conceda o privilégio USAGE a deployment1_runtime_manager_1 e deployment1_runtime_manager_2.
Crie a implementação 2 na UI do Openflow. Conceda o privilégio USAGE à deployment2_runtime_manager.
Você precisa do privilégio CREATE OPENFLOW RUNTIME INTEGRATION e também do privilégio USAGE em uma implementação para poder criar um tempo de execução nessa implementação.
Crie tempos de execução na implementação 1 como deployment1_runtime_manager_1.
Faça login como deployment1_runtime_manager_1.
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 criados nessa implementação.
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.
Você tem um administrador AWS em sua organização que pode executar o script CloudFormation para configurar o EKS em uma nova VPC (criada por CloudFormation) ou em 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 suas próprias sub-redes privadas, certifique-se de ter o seguinte:
Uma VPC
Um gateway de Internet conectado à VPC
Duas sub-redes públicas em zonas de disponibilidade diferentes:
As sub-redes públicas devem ter pelo menos um intervalo CIDR /27 com 32 IPs para sub-redes públicas.
Ambas as sub-redes públicas devem ter rotas para o destino 0.0.0.0/0 e o gateway de Internet de destino.
As sub-redes públicas devem estar em zonas de disponibilidade diferentes porque o balanceador de carga de rede AWS exige alta disponibilidade.
As sub-redes públicas devem ser marcadas da seguinte forma para que o balanceador de carga de rede AWS seja criado:
Chave: kubernetes.io/role/elb
Valor: 1
Um gateway NAT com o tipo de conectividade “Público” conectado a uma sub-rede pública.
Duas sub-redes privadas em zonas de disponibilidade diferentes.
As sub-redes devem ter pelo menos um intervalo CIDR /24 com 256 IPs disponíveis para alocar. 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.
Cada sub-rede privada precisa de uma entrada na tabela de rotas para 0.0.0.0/0 apontando para o gateway NAT na sub-rede pública.
Essas sub-redes devem estar em zonas de disponibilidade diferentes, o que é um pré-requisito para o provisionamento de EKS.
Aqui estão alguns pontos que você deve ter em mente:
O agente de implementação do Openflow é executado na sub-rede privada 1, que precisa estar vinculada a um gateway de Internet. Caso contrário, ele não será inicializado ou configurado corretamente e nenhuma infraestrutura será provisionada.
Sem um gateway NAT público que possa ser roteado a partir das sub-redes privadas, recursos como o cluster EKS não terão acesso à Internet. Além disso, o agente de implementação não conseguirá instalar a implementação do Openflow.
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.
Navegue até Data » Openflow.
Aceite os termos de serviço do Openflow.
Crie uma implementação em sua nuvem¶
Importante
Os usuários não podem entrar no Openflow se a função padrão for ACCOUNTADMIN, ORGADMIN, GLOBALORGADMIN ou SECURITYADMIN. Você deve alterar a função padrão do usuário para uma função diferente de ACCOUNTADMIN, ORGADMIN, GLOBALORGADMIN ou SECURITYADMIN para fazer login no Openflow. Para obter mais informações, consulte Pré-requisitos.
Faça login no Snowflake com uma função que seu ACCOUNTADMIN atribuiu para usar o Openflow.
Navegue até Data » Openflow.
Selecione Launch Openflow.
Na UI do Openflow, selecione Create a deployment. A guia Deployments é aberta.
Selecione Create a deployment. O assistente de criação de uma implementação é aberto.
Na etapa Prerequisites, certifique-se de atender a todos os requisitos. Selecione Next.
Na etapa Deployment location, selecione Amazon Web Services como o local de implementação. Digite um nome para sua implementação. Selecione Next.
Na etapa Configuration, você pode selecionar uma das seguintes opções de configuração:
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.
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. Ativar esta opção requer configuração adicional na sua conta AWS. Para obter mais informações sobre a entrada personalizada, consulte Configuração de entrada personalizada na AWS.
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 e navegue até sua conta AWS. Observe que o Openflow não oferece suporte à modificação do modelo CloudFormation. Não modifique nenhum valor após baixar o modelo, exceto escolher as opções do menu suspenso.
Em sua conta AWS, crie uma nova pilha CloudFormation usando o modelo. Depois que a instância EC2 do agente de implementação do Openflow é criada, o restante do processo de instalação é concluído usando infraestrutura como scripts de código. Você pode acompanhar o andamento da instalação conforme descrito em Acompanhe o andamento 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.
Navegue até sua conta Snowflake.
Esta etapa é necessária somente se você está usando políticas de rede para controlar o acesso ao Snowflake. Crie uma regra de rede para o Openflow e adicione-a à política de redes existente para sua conta Snowflake. Uma política de redes é um conjunto de regras que controlam quais endereços IP podem acessar sua conta Snowflake. Substitua {$NAT_GATEWAY_PUBLIC_IP} no trecho de código a seguir pelo endereço IP público do gateway NAT que foi criado como parte da pilha do CloudFormation (pesquise por gateway NAT no console AWS ou verifique a saída da pilha CFN). O gateway NAT é responsável pela saída do Openflow para DPA e EKS. DPA e EKS são executados na sub-rede privada 1 da instalação.
USE ROLE ACCOUNTADMIN; USE DATABASE {REPLACE_WITH_YOUR_DB_NAME}; CREATE NETWORK RULE allow_openflow_deployment MODE = INGRESS TYPE = IPV4 VALUE_LIST = ('{$NAT_GATEWAY_PUBLIC_IP}/32'); -- Run this command to find your currently active network policy and copy the value column SHOW PARAMETERS LIKE 'NETWORK_POLICY' IN ACCOUNT; -- Now add the new network rule to this policy ALTER NETWORK POLICY {ENTER_YOUR_ACTIVE_NETWORK_POLICY_NAME} ADD ALLOWED_NETWORK_RULE_LIST = (allow_openflow_deployment);
Crie uma tabela de eventos. Uma tabela de eventos foi criada para armazenar e gerenciar dados de eventos, como ações do usuário, logs do sistema e transações. Você pode optar por usar uma tabela de eventos específica do Openflow ou uma tabela de eventos específica da conta.
Crie uma tabela de eventos específica do Openflow
USE ROLE accountadmin; GRANT create event table on schema OPENFLOW.OPENFLOW to role $ROLE_OF_DEPLOYMENT_OWNER; USE ROLE $ROLE_OF_DEPLOYMENT_OWNER; CREATE event table if not exists openflow.openflow.openflow_events; -- Find the Data Plane Integrations SHOW openflow data plane integrations; ALTER openflow data plane integration $OPENFLOW_deployment_UUID SET event_table = 'openflow.openflow.openflow_events';
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;
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.
A conectividade de rede geralmente é a seguinte: uma Instância do Openflow EC2 (agente ou EKS) é executada em uma sub-rede privada com uma entrada na tabela de rotas que envia tráfego para o gateway NAT. Este gateway NAT usa o gateway de Internet para acesso à Internet (tanto para o Snowflake quanto para outros serviços).
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_CONFIG
em sua conta Snowflake e identifique o valor paraopenflow-privatelink-url
. Este é o URL para acessar o Openflow pelo PrivateLink.Crie um registro
CNAME
em 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-id
openflow-privatelink-url
external-telemetry-privatelink-url
Crie um ponto de extremidade de VPC com os parâmetros:
Tipo: PrivateLink Ready partner services
Serviço: valor
privatelink-vpce-id
obtido 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.com
Tipo: Private hosted zone
Selecione a região e a VPC onde sua implantação do Openflow será executada.
Adicione dois registros
CNAME
para os URLs identificados na primeira etapa:Para
openflow-privatelink-url
Nome do registro: valor
openflow-privatelink-url
obtido na primeira etapaTipo de registro:
CNAME
Valor: nome DNS do ponto de extremidade da sua VPC
Para
external-telemetry-privatelink-url
Nome do registro: valor
external-telemetry-privatelink-url
obtido na primeira etapaTipo de registro:
CNAME
Valor: 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.
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>.s3
do tipoGateway
VPC: 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.
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 Configuração de entrada personalizada na AWS.
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
Configuração de entrada personalizada na AWS¶
O recurso de entrada personalizada no Openflow está disponível no assistente de implantação durante a criação de uma implantação do Openflow. Quando selecionado, você precisa fornecer um nome de domínio totalmente qualificado (FQDN), que o Openflow usará como nome do host para a implantação. Essa opção aciona ações específicas no processo de provisionamento do Openflow para criar um balanceador de carga privado que você pode integrar com seus próprios requisitos de entrada pública.
Quando o modelo do CloudFormation for criado, ele usará o FQDN fornecido no assistente de implantação, e esta versão do modelo do CloudFormation pressupõe que você seguirá as instruções aqui para gerenciar a entrada nos tempos de execução do Openflow conforme desejado.
Ao ativar a entrada personalizada, o Openflow não gerenciará mais automaticamente os registros DNS externos, não criará um balanceador de carga público automaticamente e não gerenciará mais os certificados para os tempos de execução do Openflow.
A configuração de entrada personalizada requer a conclusão das seguintes etapas:
Ative a entrada personalizada durante a criação da implantação.
Durante a criação da implantação, ative a opção Custom ingress e especifique seu nome de domínio totalmente qualificado (FQDN) preferido no campo Hostname.
Aplique o modelo do CloudFormation e aguarde a criação do balanceador de carga de rede interno.
Você pode encontrar o balanceador de carga de rede interno no console da AWS em EC2 » Load Balancers.
O balanceador de carga será nomeado
runtime-ingress-{deployment-key}
, em que{deployment-key}
é a chave da sua implantação do Openflow.
Provisione um certificado TLS.
Obtenha um certificado TLS para o balanceador de carga que manipulará o tráfego para as UIs de tempo de execução do Openflow. Você pode gerar um certificado usando o AWS Certificate Manager (ACM) ou importar um certificado existente.
Obtenha o endereço IP interno do seu balanceador de carga de rede interna.
Após a criação do balanceador de carga, navegue até a página de detalhes e copie o DNS name do balanceador de carga.
Efetue login na instância do seu agente EC2 (identificada como
openflow-agent-{deployment-key}
) e execute o comandonslookup {internal-load-balancer-dns-name}
.Copie os endereços IP do balanceador de carga. Eles serão usados como um grupo de destino para o balanceador de carga externo.
Crie o balanceador de carga.
Na sua conta AWS, crie um balanceador de carga de rede com a seguinte configuração:
Nome: recomendamos a convenção de nomenclatura
custom-ingress-external-{deployment-key}
, em que{deployment-key}
é a chave da sua implantação do Openflow.Tipo: Network Load Balancer
Esquema: Internet-facing
VPC: selecione a VPC da sua implantação
Zonas de disponibilidade: selecione as duas zonas de disponibilidade onde sua implantação do Openflow está em execução.
Sub-redes: selecione as sub-redes públicas da sua VPC
Grupos de segurança: selecione ou crie um grupo de segurança que permita tráfego na porta 443
Grupo de destino: crie um novo grupo de destino com as seguintes configurações:
Tipo de destino: IP addresses
Protocolo: TLS
Porta: 443
VPC: verifique se a VPC corresponde à sua implantação
Digite o endereço IP do seu balanceador de carga de rede interno (obtido na etapa anterior) como destino e clique em Include as pending below.
Certificado de servidor SSL/TLS padrão: importe seu certificado SSL/TLS
Após a criação do balanceador de carga, copie o nome DNS para ele. Esse nome DNS será usado para configurar seu DNS para acessar as UIs de tempo de execução do Openflow.
Para obter mais informações sobre como criar um balanceador de carga, consulte Criar um balanceador de carga de rede.
Criar registros DNS para o balanceador de carga.
Crie um registro CNAME na sua configuração do DNS mapeando seu FQDN para o nome DNS do balanceador de carga externo da AWS.
Para obter instruções detalhadas de configuração do DNS no Route 53, consulte Criar registros no Route 53.
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
Uma instância EC2 para o agente de implementação do Openflow, com um script UserData incluído para executar automaticamente o processo de inicialização. Esse script define as variáveis de ambiente a serem usadas pelo agente de implementação do Openflow, derivadas dos parâmetros de entrada CloudFormation.
Ponto de extremidade EC2 Instance Connect para o agente de implementação do Openflow para atualizar a implementação quando necessário.
Ao usar BYO-VPC, por padrão, a pilha CloudFormation criará um ponto de extremidade 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 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:
No painel de navegação à esquerda, vá em VPC » Endpoints.
Selecione Create Endpoint.
Escolha o tipo de ponto de extremidade como 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.
Selecione Create. Leva aproximadamente 5 minutos para que o ponto de extremidade seja criado.
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 VPC CNI
Complemento 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.
Clique em Connect. Uma nova guia ou janela do navegador será exibida com uma interface de linha de comando.
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": "*"
}
]
}