Configurar uma função do Lambda para acessar recursos em uma VPC - AWS Lambda

Configurar uma função do Lambda para acessar 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.

Quando você conecta uma função a uma VPC, o Lambda cria uma interface de rede elástica para cada combinação de grupo de segurança e sub-rede na configuração da VPC da função. Esse processo pode levar cerca de um minuto.

Enquanto o Lambda cria uma interface de rede, 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 mais informações sobre estados de funções, consulte Monitorar o estado de uma função com a API do Lambda.

Várias funções conectadas às mesmas sub-redes compartilham interfaces de rede. Conectar funções adicionais a uma sub-rede que tenha uma interface de rede existente gerenciada pelo Lambda é muito mais rápido do que fazer com que o Lambda crie interfaces de rede adicionais. No entanto, se você tiver muitas funções ou funções com alto uso de rede, o Lambda ainda poderá criar interfaces de rede adicionais.

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.

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.

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

  • ec2:DeleteNetworkInterface

Essas permissões são incluídas na política gerenciada AWSLambdaVPCAccessExecutionRole da AWS.

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 do AWS Identity and Access Management (IAM) precisa das seguintes permissões:

Permissões de usuário

  • ec2:DescribeSecurityGroups

  • ec2:DescribeSubnets

  • ec2:DescribeVpcs

Configurar o acesso à VPC com o console do Lambda

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. Selecione Create function (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. Em Network (Rede), escolha uma VPC para a função acessar.

  6. Escolha sub-redes e grupos de segurança. Quando você escolhe um grupo de segurança, o console exibe as regras de entrada e saída dele.

    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.

  7. Selecione Create function (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. Em VPC, selecione Edit (Editar).

  4. Selecione uma VPC, as sub-redes e os grupos de segurança.

    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.

  5. Escolha Save (Salvar).

Configurar o acesso à VPC com a API do Lambda

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), é possível usar o comando create-function com a opção vpc-config. O exemplo a seguir cria uma função com uma conexão a uma VPC com duas sub-redes e um grupo de segurança.

$ aws lambda create-function --function-name my-function \ --runtime nodejs12.x --handler index.js --zip-file fileb://function.zip \ --role arn:aws:iam::123456789012:role/lambda-role \ --vpc-config 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 como usar chaves de condição em políticas do IAM, consulte Elementos de política JSON do IAM: condição no Guia do usuário do IAM.

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 do IAM 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 ao sg-1 e ao 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 suas funções em uma VPC segura com acesso aos serviços da AWS e à Internet. O Lambda possui essa VPC, que não está conectada à VPC padrão da sua conta. 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. 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, VPC endpoints, 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 Pilhas do console do AWS CloudFormation, selecione Create stack (Criar pilha) e siga as instruções no assistente Create stack (Criar pilha).