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 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

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. 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. Escolha Configuration (Configuração) e, em seguida, escolha VPC.

  4. Em VPC, selecione Edit (Editar).

  5. 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.

  6. Escolha Save (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), é 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).