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:
Fully managed VPC: escolha esta opção se quiser que a VPC seja gerenciada pelo Snowflake
Bring your own VPC: escolha essa opção se quiser usar uma VPC existente.
Selecione Create Deployment.
Quando a implementação estiver configurada, será exibida uma caixa de diálogo que permite que você faça o download do modelo CloudFormation para concluir o processo de configuração em sua conta AWS. Faça o download deste modelo e acesse sua conta AWS.
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 estiver usando uma VPC existente, ao fazer o upload do modelo CloudFormation, selecione os respectivos valores nas listas suspensas para as duas sub-redes privadas e seu VPC.
Navegue até sua conta Snowflake.
[Opcional] Esta etapa é necessária apenas se você estiver 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 controla 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 criado como parte da pilha 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. Tanto DPA quanto 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 criados quando o tempo de execução é iniciado e o valor máximo especifica o número de nós para os quais o tempo de execução pode ser ampliado, no caso de um grande volume de dados ou da carga da 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¶
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 AWS, que é criado posteriormente. As sub-redes privadas hospedam o cluster EKS e todas as instâncias do EC2 que fazem backup dos 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.
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:
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": "*"
}
]
}