Conceder acesso a funções do Lambda para recursos em uma Amazon VPC
Com a Amazon Virtual Private Cloud (Amazon VPC), você pode criar redes privadas em sua Conta da AWS para hospedar recursos como instâncias do Amazon Elastic Compute Cloud (Amazon EC2), do Amazon Relational Database Service (Amazon RDS) e do Amazon ElastiCache. Você pode dar à sua função do Lambda acesso a recursos hospedados em uma Amazon VPC ao anexar sua função à VPC por meio das sub-redes privadas que contêm os recursos. Siga as instruções nas seções a seguir para anexar uma função do Lambda a uma Amazon VPC usando o console Lambda, a AWS Command Line Interface (AWS CLI) ou AWS SAM.
nota
Cada função do Lambda é executada dentro de uma VPC de propriedade e gerenciada pelo serviço do Lambda. Essas VPCs recebem manutenção automática do Lambda e não são visíveis para os clientes. Configurar sua função para acessar outros recursos da AWS em uma Amazon VPC não tem efeito na VPC gerenciada pelo Lambda na qual sua função é executada.
Seções
- Permissões obrigatórias do IAM
- Como anexar funções do Lambda a uma Amazon VPC em sua Conta da AWS
- Acesso à Internet quando anexado a uma VPC
- Suporte a IPv6
- Práticas recomendadas para usar o Lambda com Amazon VPCs
- Noções básicas de interfaces de rede elástica (ENIs) de hiperplano
- Usar chaves de condição do IAM para configurações de VPC
- Tutoriais de VPC
Permissões obrigatórias do IAM
Para anexar uma função do Lambda a uma Amazon VPC em sua Conta da AWS, o Lambda precisa de permissões para criar e gerenciar as interfaces de rede que usa para dar à sua função acesso aos recursos na VPC.
As interfaces de rede que o Lambda cria são conhecidas como Hyperplane Elastic Network Interfaces, ou Hyperplane ENIs. Para saber mais sobre essas interfaces de rede, consulte Noções básicas de interfaces de rede elástica (ENIs) de hiperplano.
Você pode dar à sua função as permissões necessárias anexando a política gerenciada da AWS AWSLambdaVPCAccessExecutionRole ao perfil de execução da função. Quando você cria uma nova função no console do Lambda e a anexa a uma VPC, o Lambda adiciona automaticamente essa política de permissões para você.
Se você preferir criar sua própria política de permissões do IAM, adicione todas as permissões a seguir:
-
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
Observe que o perfil da sua função só precisa dessas permissões para criar as interfaces de rede, não para invocar sua função. Você ainda poderá invocar a função com sucesso quando ela estiver anexada a uma Amazon VPC, mesmo que você remova essas permissões do perfil de execução da função.
Para anexar sua função a uma VPC, o Lambda também precisa verificar os recursos de rede usando seu perfil de usuário do IAM. Seu perfil de usuário deve ter as seguintes permissões do IAM:
-
ec2:DescribeSecurityGroups
-
ec2:DescribeSubnets
-
ec2:DescribeVpcs
nota
As permissões do Amazon EC2 que você concede ao perfil de execução da função são usadas pelo serviço Lambda para anexar sua função a uma VPC. No entanto, essas permissões também são concedidas implicitamente ao código da sua função. Isso significa que seu código de função pode fazer essas chamadas de API do Amazon EC2. Para obter conselhos sobre como seguir as práticas recomendadas de segurança, consulte Melhores práticas de segurança.
Como anexar funções do Lambda a uma Amazon VPC em sua Conta da AWS
Anexe sua função a uma Amazon VPC em sua Conta da AWS usando o console do Lambda, a AWS CLI ou o AWS SAM. Se você estiver usando a AWS CLI ou o AWS SAM, ou anexando uma função existente a uma VPC usando o console do Lambda, o perfil de execução da função deve ter as permissões necessárias listadas na seção anterior.
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
Acesso à Internet quando anexado a uma VPC
Por padrão, as funções do Lambda têm acesso à Internet pública. Quando você anexar sua função a uma VPC, ela só poderá acessar os recursos disponíveis nessa VPC. Para conceder acesso à Internet para a função, também é necessário configurar a VPC para ter acesso à Internet. Para saber mais, consulte Habilitar o acesso à Internet para funções do Lambda conectadas à VPC.
Suporte a IPv6
Sua função pode se conectar a recursos em sub-redes de VPC de pilha dupla via IPv6. Esta opção é desativada por padrão. Para permitir o tráfego IPv6 de saída, use o console ou a opção --vpc-config Ipv6AllowedForDualStack=true
com o comando create-function
nota
Para permitir o tráfego IPv6 de saída em uma VPC, todas as sub-redes conectadas à função devem ser sub-redes de pilha dupla. O Lambda não oferece suporte a conexões IPv6 de saída para sub-redes somente IPv6 em uma VPC, conexões IPv6 de saída para funções que não estão conectadas a uma VPC ou conexões IPv6 de entrada usando endpoints da VPC (AWS PrivateLink).
Você pode atualizar seu código de função para se conectar explicitamente a recursos da sub-rede via IPv6. O exemplo em Python a seguir abre um soquete e se conecta a um servidor IPv6.
exemplo — Conectar ao servidor IPv6
def connect_to_server(event, context): server_address = event['host'] server_port = event['port'] message = event['message'] run_connect_to_server(server_address, server_port, message) def run_connect_to_server(server_address, server_port, message): sock = socket.socket(socket.AF_INET6, socket.SOCK_STREAM, 0) try: # Send data sock.connect((server_address, int(server_port), 0, 0)) sock.sendall(message.encode()) BUFF_SIZE = 4096 data = b'' while True: segment = sock.recv(BUFF_SIZE) data += segment # Either 0 or end of data if len(segment) < BUFF_SIZE: break return data finally: sock.close()
Práticas recomendadas para usar o Lambda com Amazon VPCs
Para garantir que sua configuração de VPC da Lambda atenda às diretrizes de práticas recomendadas, siga os conselhos nas seções a seguir.
Melhores práticas de segurança
Para anexar sua função do Lambda a uma VPC, você precisa conceder ao perfil de execução da função várias permissões do Amazon EC2. Essas permissões são necessárias para criar as interfaces de rede que sua função usa para acessar os recursos na VPC. No entanto, essas permissões também são concedidas implicitamente ao código da sua função. Isso significa que seu código de função tem permissão para fazer essas chamadas de API do Amazon EC2.
Para seguir o princípio do acesso com privilégios mínimos, adicione uma política de negação, como o exemplo a seguir, ao perfil de execução da sua função. Essa política impede que sua função faça chamadas para as APIs do Amazon EC2 que o serviço do Lambda usa para anexar sua função a uma VPC.
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Deny", "Action": [ "ec2:CreateNetworkInterface", "ec2:DeleteNetworkInterface", "ec2:DescribeNetworkInterfaces", "ec2:DescribeSubnets", "ec2:DetachNetworkInterface", "ec2:AssignPrivateIpAddresses", "ec2:UnassignPrivateIpAddresses" ], "Resource": [ "*" ], "Condition": { "ArnEquals": { "lambda:SourceFunctionArn": [ "arn:aws:lambda:us-west-2:123456789012:function:my_function" ] } } } ] }
A AWS fornece grupos de segurança e listas de controle de acesso (ACL) de rede para aumentar a segurança em sua VPC. Os grupos de segurança controlam o tráfego de entrada e de saída para seus recursos e as Network ACLs controlam o tráfego de entrada e de saída de suas sub-redes. Os grupos de segurança fornecem controle de acesso suficiente para a maioria das sub-redes. Você pode usar as ACLs de rede se desejar uma camada adicional de segurança para a VPC. Para obter diretrizes gerais sobre as práticas recomendadas de segurança ao usar Amazon VPCs, consulte Melhores práticas de segurança para a sua VPC no Guia do usuário do Amazon Virtual Private Cloud.
Práticas recomendadas de desempenho
Quando você anexa sua função a uma VPC, o Lambda verifica se há um recurso de rede disponível (ENI de hiperplano) que ela possa usar para se conectar. Os ENIs de hiperplano estão associados a uma combinação específica de grupos de segurança e sub-redes da VPC. Se você já anexou uma função a uma VPC, especificar as mesmas sub-redes e grupos de segurança ao anexar outra função significa que o Lambda pode compartilhar os recursos de rede e evitar a necessidade de criar um novo ENI de hiperplano. Para obter mais informações sobre ENIs de hiperplano e seu ciclo de vida, consulte Noções básicas de interfaces de rede elástica (ENIs) de hiperplano.
Noções básicas de interfaces de rede elástica (ENIs) de hiperplano
Uma ENI de hiperplano é um recurso gerenciado que atua como uma interface de rede entre sua função do Lambda e os recursos aos quais você deseja que sua função se conecte. O serviço do Lambda cria e gerencia essas ENIs automaticamente quando você anexa sua função a uma VPC.
As ENIs de hiperplano não são diretamente visíveis para você e você não precisa configurar ou gerenciá-las. No entanto, saber como elas funcionam pode ajudar você a entender o comportamento da sua função ao anexá-la a uma VPC.
Na primeira vez que você associa uma função a uma VPC usando uma combinação específica de sub-rede e grupo de segurança, o Lambda cria uma ENI de hiperplano. Outras funções da sua conta que usam a mesma combinação de sub-rede e grupo de segurança também podem usar essa ENI. Sempre que possível, o Lambda reutiliza ENIs existentes para otimizar a utilização de recursos e minimizar a criação de novas ENIs. Porém, cada ENI de hiperplano comporta até 65.000 conexões/portas. Se o número de conexões exceder esse limite, o Lambda escalará o número de ENIs automaticamente com base no tráfego de rede e nos requisitos de simultaneidade.
Para novas funções, enquanto o Lambda está criando uma ENI de hiperplano, sua função permanece no estado Pendente e você não pode invocá-la. Sua função fará a transição para o estado ativo somente quando a ENI de hiperplano estiver pronta, o que pode levar vários minutos. Para funções existentes, não é possível executar operações adicionais direcionadas à função, como criar versões ou atualizar o código da função, mas é possível continuar invocando versões anteriores da função.
nota
Se uma função do Lambda permanecer ociosa por 30 dias, o Lambda recuperará as ENIs de hiperplano não utilizadas e definirá o estado da função como ocioso. A próxima tentativa de invocação falha e a função entra novamente no estado pendente até que o Lambda conclua a criação ou alocação de uma ENI de hiperplano. Para obter mais informações sobre estados de funções do Lambda, consulte Estados da função do Lambda.
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"] } } } ] }
Tutoriais de VPC
Nos tutoriais a seguir, você conecta uma função do Lambda a recursos na VPC.