Como conectar as redes de saída aos recursos em uma VPC - AWS Lambda

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

Como conectar as redes de saída aos recursos em uma VPC

É possível configurar uma função do Lambda para se conectar a sub-redes privadas em uma nuvem privada virtual (VPC) na sua conta da AWS. Use a Amazon Virtual Private Cloud (Amazon VPC) para criar uma rede privada para recursos, como bancos de dados, instâncias de cache ou serviços internos. Conecte a função à VPC para acessar recursos privados enquanto a função está em execução. Esta seção fornece um resumo das conexões de VPC do Lambda. Para obter detalhes sobre redes de com VPC no Lambda, consulte Redes privadas com a VPC.

dica

Para configurar a função do Lambda para acessar uma VPC e uma sub-rede, é possível usar o console ou a API do Lambda.

Consulte a seção VpcConfig em CreateFunction para configurar a função. Consulte Como configurar o acesso à VPC (console) e Como configurar o acesso à VPC (API) para obter etapas detalhadas.

Quando você conecta uma função a uma VPC, o Lambda atribui sua função a uma Elastic Network Interface (ENI – Interface de rede elástica) de hiperplano para cada sub-rede na configuração de VPC da sua função. O Lambda cria uma ENI de hiperplano na primeira vez que uma combinação exclusiva de sub-rede e grupo de segurança é definida para uma função habilitada por VPC em uma conta.

Enquanto o Lambda cria uma ENI de hiperplano, não é possível executar operações adicionais direcionadas à função, como criar versões ou atualizar o código da função. Para novas funções, não é possível invocar a função até que seu estado seja alterado de Pending para Active. Para funções existentes, ainda é possível invocar uma versão anterior enquanto a atualização está em andamento. Para obter detalhes sobre o ciclo de vida da ENI de hiperplano, consulte ENIs de hiperplano do Lambda.

As funções do Lambda não podem se conectar diretamente a uma VPC com a locação de instâncias dedicadas. Para se conectar a recursos em uma VPC dedicada, emparelhe-a com uma segunda VPC com locação padrão.

Como gerenciar conexões de VPC

Várias funções podem compartilhar uma interface de rede se as funções compartilharem a mesma sub-rede e grupo de segurança. É muito mais rápido estabelecer a conexão de funções adicionais com a mesma configuração de VPC (sub-rede e grupo de segurança) que tenha uma interface de rede existente gerenciada pelo Lambda do que criar uma nova interface de rede.

Se as funções permanecerem inativas por um longo período, o Lambda recuperará suas interfaces de rede e as funções se tornarão Idle. Para reativar uma função ociosa, invoque-a. Essa invocação falha e a função entra em um estado Pending novamente até que uma interface de rede esteja disponível.

Se você atualizar sua função para acessar outra VPC, ela encerrará a conectividade da ENI de hiperplano para a VPC anterior. O processo de atualização da conectividade para uma nova VPC pode levar vários minutos. Durante esse tempo, o Lambda conecta invocações de função à VPC anterior. Depois de concluída a atualização, as novas invocações começarão a usar a nova VPC e a função do Lambda não estará mais conectada à VPC antiga.

Para operações de curta duração, como consultas do DynamoDB, a sobrecarga de latência da configuração de uma conexão TCP pode ser maior do que a própria operação. A fim de garantir a reutilização da conexão para funções de curta duração/invocadas com baixa frequência, recomendamos que você use keep-alive de TCP para conexões que foram criadas durante a inicialização da função, visando evitar a criação de novas conexões para invocações subsequentes. Para mais informações sobre a reutilização de conexões usando o keep-alive, consulte a documentação do Lambda sobre reutilização de conexões.

Função de execução e permissões de usuário

O Lambda usa as permissões da sua função para criar e gerenciar interfaces de rede. Para se conectar a uma VPC, a função de execução da função precisa ter as seguintes permissões.

Permissões da função de execução
  • ec2:CreateNetworkInterface

  • ec2:DescribeNetworkInterfaces: essa ação só funciona se for permitida em todos os recursos ("Resource": "*").

  • ec2:DescribeSubnets

  • ec2:DeleteNetworkInterface: se você não especificar um ID de recurso para DeleteNetworkInterface no perfil de execução, sua função talvez não possa acessar a VPC. Especifique um ID de recurso exclusivo ou inclua todos os IDs de recursos, por exemplo, "Resource": "arn:aws:ec2:us-west-2:123456789012:*/*".

  • ec2:AssignPrivateIpAddresses

  • ec2:UnassignPrivateIpAddresses

Essas permissões são incluídas na política gerenciada AWSLambdaVPCAccessExecutionRole da AWS. Essas permissões são necessárias apenas para criar ENIs, não para invocar a função da VPC. Em outras palavras, ainda será possível invocar sua função da VPC com sucesso, mesmo que você remova essas permissões da função de execução. Para desassociar completamente sua função do Lambda da VPC, atualize as configurações da VPC da função usando o console ou a API UpdateFunctionConfiguration.

Quando você configura a conectividade da VPC, o Lambda usa suas permissões para verificar os recursos de rede. Para configurar uma função para se conectar a uma VPC, o usuário precisa das permissões a seguir:

Permissões de usuário
  • ec2:DescribeSecurityGroups

  • ec2:DescribeSubnets

  • ec2:DescribeVpcs

Como configurar o acesso à VPC (console)

Se as permissões do IAM permitirem que você crie apenas funções do Lambda que se conectam à VPC, será necessário configurar a VPC ao criar a função. Se as permissões do IAM permitirem que você crie funções que não estão conectadas à VPC, será possível adicionar a configuração da VPC após criar a função.

Como configurar uma VPC ao criar uma função
  1. Abra a página Funções do console do Lambda.

  2. Escolha a opção Criar função.

  3. Em Basic information (Informações básicas), para Function name (Nome da função), insira um nome para a função.

  4. Expanda Advanced settings (Configurações avançadas).

  5. Selecione Habilitar VPC e, em seguida, escolha a VPC que deseja que a função acesse.

  6. (Opcional) Para permitir tráfego IPv6 de saída, selecione Permitir tráfego IPv6 para sub-redes de pilha dupla.

  7. Escolha sub-redes e grupos de segurança. Se você selecionou Permitir tráfego IPv6 para sub-redes de pilha dupla, todas as sub-redes selecionadas deverão ter um bloco CIDR IPv4 e um bloco CIDR IPv6.

    nota

    Para acessar recursos privados, conecte a função às sub-redes privadas. Se a função precisar de acesso à Internet, use a conversão de endereços de rede (NAT). Conectar uma função a uma sub-rede pública não dá a ela acesso à Internet nem a um endereço IP público.

  8. Escolha a opção Criar função.

Como configurar uma VPC para uma função existente
  1. Abra a página Funções do console do Lambda.

  2. Escolha uma função.

  3. Escolha Configuration (Configuração) e, em seguida, escolha VPC.

  4. Em VPC, selecione Edit (Editar).

  5. Escolha a VPC que deseja que a função acesse.

  6. (Opcional) Para permitir tráfego IPv6 de saída, selecione Permitir tráfego IPv6 para sub-redes de pilha dupla.

  7. Escolha sub-redes e grupos de segurança. Se você selecionou Permitir tráfego IPv6 para sub-redes de pilha dupla, todas as sub-redes selecionadas deverão ter um bloco CIDR IPv4 e um bloco CIDR IPv6.

    nota

    Para acessar recursos privados, conecte a função às sub-redes privadas. Se a função precisar de acesso à Internet, use a conversão de endereços de rede (NAT). Conectar uma função a uma sub-rede pública não dá a ela acesso à Internet nem a um endereço IP público.

  8. Escolha Salvar.

Como configurar o acesso à VPC (API)

Para conectar uma função do Lambda a uma VPC, é possível usar as seguintes operações de API:

Para criar uma função e conectá-la a uma VPC usando a AWS Command Line Interface (AWS CLI), você pode usar o comando create-function com a opção VpcConfig. O exemplo a seguir cria uma função com uma conexão de VPC. A função tem acesso a duas sub-redes e a um grupo de segurança e permite tráfego IPv6 de saída.

aws lambda create-function --function-name my-function \ --runtime nodejs20.x --handler index.js --zip-file fileb://function.zip \ --role arn:aws:iam::123456789012:role/lambda-role \ --vpc-config Ipv6AllowedForDualStack=true,SubnetIds=subnet-071f712345678e7c8,subnet-07fd123456788a036,SecurityGroupIds=sg-085912345678492fb

Para conectar uma função existente a uma VPC, use o comando update-function-configuration com a opção vpc-config.

aws lambda update-function-configuration --function-name my-function \ --vpc-config SubnetIds=subnet-071f712345678e7c8,subnet-07fd123456788a036,SecurityGroupIds=sg-085912345678492fb

Para desconectar a função de uma VPC, atualize a configuração da função com uma lista vazia de sub-redes e grupos de segurança.

aws lambda update-function-configuration --function-name my-function \ --vpc-config SubnetIds=[],SecurityGroupIds=[]

Usar chaves de condição do IAM para configurações de VPC

É possível usar chaves de condição específicas do Lambda para configurações de VPC a fim de fornecer controles de permissão adicionais para as funções do Lambda. Por exemplo, você pode exigir que todas as funções em sua organização estejam conectadas a uma VPC. Você também pode especificar as sub-redes e os grupos de segurança que os usuários da função podem e não podem usar.

O Lambda oferece suporte às seguintes chaves de condição em políticas do IAM:

  • lambda:VpcIds: permitir ou negar uma ou mais VPCs.

  • lambda:SubnetIds: permitir ou negar uma ou mais sub-redes.

  • lambda:SecurityGroupIds: permitir ou negar um ou mais grupos de segurança.

As operações de API CreateFunction e UpdateFunctionConfiguration do Lambda oferecem suporte a essas chaves de condição. Para obter mais informações sobre o uso de chaves de condição em políticas do IAM, consulteElementos de política JSON do: condiçãonoIAM User Guide.

dica

Se a função já incluir uma configuração de VPC de uma solicitação de API anterior, você poderá enviar uma solicitação UpdateFunctionConfiguration sem a configuração da VPC.

Políticas de exemplo com chaves de condição para configurações de VPC

Os exemplos a seguir demonstram como usar chaves de condição para configurações de VPC. Depois de criar uma instrução de política com as restrições desejadas, acrescente a instrução de política para o usuário ou a função de destino.

Os usuários devem implantar somente funções conectadas à VPC

Para garantir que todos os usuários implantem somente funções conectadas à VPC, você pode negar operações de criação e de atualização de funções que não incluam um ID de VPC válido.

Observe que o ID da VPC não é um parâmetro de entrada para a solicitação CreateFunction ou UpdateFunctionConfiguration. O Lambda recupera o valor do ID da VPC com base nos parâmetros da sub-rede e do grupo de segurança.

{ "Version": "2012-10-17", "Statement": [ { "Sid": "EnforceVPCFunction", "Action": [ "lambda:CreateFunction", "lambda:UpdateFunctionConfiguration" ], "Effect": "Deny", "Resource": "*", "Condition": { "Null": { "lambda:VpcIds": "true" } } } ] }

Negar acesso de usuários a VPCs, sub-redes ou grupos de segurança específicos

Para negar acesso de usuários a VPCs específicas, use StringEquals para verificar o valor da condição lambda:VpcIds. O exemplo a seguir nega aos usuários acesso à vpc-1 e à vpc-2.

{ "Version": "2012-10-17", "Statement": [ { "Sid": "EnforceOutOfVPC", "Action": [ "lambda:CreateFunction", "lambda:UpdateFunctionConfiguration" ], "Effect": "Deny", "Resource": "*", "Condition": { "StringEquals": { "lambda:VpcIds": ["vpc-1", "vpc-2"] } } }

Para negar acesso de usuários a sub-redes específicas, use StringEquals para verificar o valor da condição lambda:SubnetIds. O exemplo a seguir nega aos usuários acesso à subnet-1 e à subnet-2.

{ "Sid": "EnforceOutOfSubnet", "Action": [ "lambda:CreateFunction", "lambda:UpdateFunctionConfiguration" ], "Effect": "Deny", "Resource": "*", "Condition": { "ForAnyValue:StringEquals": { "lambda:SubnetIds": ["subnet-1", "subnet-2"] } } }

Para negar acesso de usuários a grupos de segurança específicos, use StringEquals para verificar o valor da condição lambda:SecurityGroupIds. O exemplo a seguir nega aos usuários acesso à sg-1 e à sg-2.

{ "Sid": "EnforceOutOfSecurityGroups", "Action": [ "lambda:CreateFunction", "lambda:UpdateFunctionConfiguration" ], "Effect": "Deny", "Resource": "*", "Condition": { "ForAnyValue:StringEquals": { "lambda:SecurityGroupIds": ["sg-1", "sg-2"] } } } ] }

Permitir que os usuários criem e atualizem funções com configurações de VPC específicas

Para permitir que os usuários acessem VPCs específicas, use StringEquals para verificar o valor da condição lambda:VpcIds. O exemplo a seguir dá aos usuários permissão para acessar vpc-1 e vpc-2.

{ "Version": "2012-10-17", "Statement": [ { "Sid": "EnforceStayInSpecificVpc", "Action": [ "lambda:CreateFunction", "lambda:UpdateFunctionConfiguration" ], "Effect": "Allow", "Resource": "*", "Condition": { "StringEquals": { "lambda:VpcIds": ["vpc-1", "vpc-2"] } } }

Para permitir que os usuários acessem sub-redes específicas, use StringEquals para verificar o valor da condição lambda:SubnetIds. O exemplo a seguir dá aos usuários permissão para acessar subnet-1 e subnet-2.

{ "Sid": "EnforceStayInSpecificSubnets", "Action": [ "lambda:CreateFunction", "lambda:UpdateFunctionConfiguration" ], "Effect": "Allow", "Resource": "*", "Condition": { "ForAllValues:StringEquals": { "lambda:SubnetIds": ["subnet-1", "subnet-2"] } } }

Para permitir que os usuários acessem grupos de segurança específicos, use StringEquals para verificar o valor da condição lambda:SecurityGroupIds. O exemplo a seguir dá aos usuários permissão para acessar sg-1 e sg-2.

{ "Sid": "EnforceStayInSpecificSecurityGroup", "Action": [ "lambda:CreateFunction", "lambda:UpdateFunctionConfiguration" ], "Effect": "Allow", "Resource": "*", "Condition": { "ForAllValues:StringEquals": { "lambda:SecurityGroupIds": ["sg-1", "sg-2"] } } } ] }

Acesso aos serviços e à Internet para funções conectadas à VPC

Por padrão, o Lambda executa as funções em uma VPC segura com acesso aos serviços da AWS e à Internet. O Lambda possui esta VPC, que não está conectada àVPC padrão. Quando você conecta uma função a uma VPC em sua conta, a função não consegue acessar a Internet, a menos que a VPC conceda acesso.

nota

Vários serviços da AWS oferecem VPC endpoints. É possível usar VPC endpoints para se conectar aos serviços da AWS de dentro de uma VPC sem acesso à Internet.

O acesso à Internet em uma sub-rede privada requer a conversão de endereços de rede (NAT). Para conceder acesso à Internet para a função, roteie o tráfego de saída para um gateway NAT em uma sub-rede pública. O gateway NAT tem um endereço IP público e pode se conectar à Internet pelo gateway da Internet da VPC. Uma conexão de gateway NAT ociosa atingirá o tempo limite após 350 segundos. Para obter mais informações, consulte Como faço para conceder acesso à Internet a uma função do Lambda em uma VPC?

Tutoriais de VPC

Nos tutoriais a seguir, você conecta uma função do Lambda a recursos na VPC.

Configurações de VPC de exemplo

É possível usar os modelos do AWS CloudFormation de exemplo a seguir a fim de criar configurações de VPC para usar com funções do Lambda. Há dois modelos disponíveis no repositório GitHub deste guia:

  • vpc-private.yaml— uma VPC com duas sub-redes privadas e VPC endpoints para o Amazon Simple Storage Service (Amazon S3) e o Amazon DynamoDB. Use esse modelo para criar uma VPC para funções que não precisam de acesso à Internet. Essa configuração oferece suporte ao uso do Amazon S3 e do DynamoDB com os AWS SDK, e acesso a recursos do banco de dados na mesma VPC por meio de uma conexão de rede local.

  • vpc-privatepublic.yaml: uma VPC com duas sub-redes privadas, endpoints da VPC, uma sub-rede pública com um gateway NAT e um gateway da Internet. O tráfego direcionado à Internet de funções nas sub-redes privadas é roteado para o gateway NAT usando uma tabela de rotas.

Para criar uma VPC usando um modelo, na página Stacks (Pilhas) do console do AWS CloudFormation, escolha Create stack (Criar pilha) e siga as instruções no assistente Create stack (Criar pilha).