AWS Lambda
Guia do desenvolvedor

Uso de políticas baseadas em recursos para o AWS Lambda

O AWS Lambda oferece suporte a políticas de permissões baseadas em recursos para funções e camadas do Lambda. As políticas baseadas em recursos permitem conceder permissão de uso a outras contas por recurso. Você também pode usar uma política baseada em recursos para permitir que um serviço da AWS invoque a função.

Para funções do Lambda, conceda uma permissão à conta para invocar ou gerenciar uma função. Adicione várias instruções para conceder acesso a várias contas ou permitir que qualquer conta invoque a função. Para funções invocadas por outro serviço da AWS em resposta à atividade na conta, use a política para conceder permissão de invocação ao serviço.

Para camadas do Lambda, use uma política baseada em recursos em uma versão da camada para permitir que outras contas a usem. Além de políticas que concedem permissão a uma única conta ou a todas as contas, para camadas, também é possível conceder permissão a todas as contas em uma organização.

nota

Só é possível atualizar políticas baseadas em recursos para recursos do Lambda dentro do escopo das ações de API AddPermission e AddLayerVersionPermission. Não é possível criar políticas para os recursos do Lambda em JSON ou usar condições não mapeadas para parâmetros dessas ações.

As políticas baseadas em recursos se aplicam a uma única função, versão, alias ou versão da camada. Elas concedem permissão para um ou mais serviços e contas. Para contas confiáveis que você deseja que tenham acesso a vários recursos, ou para usar ações de API não compatíveis com políticas baseadas em recursos, use funções entre contas.

Concessão do acesso de função aos serviços da AWS

Ao usar um serviço da AWS para invocar a função, você concede permissão em uma instrução em uma política baseada em recursos. Aplique a instrução à função ou a limite a uma única versão ou alias.

nota

Quando você adiciona um trigger à função com o console do Lambda, este atualiza a política baseada em recursos da função para permitir que o serviço a invoque. Para conceder permissões a outras contas ou serviços que não estejam disponíveis no console do Lambda, use a CLI da AWS.

Adicione uma instrução com o comando add-permission. A instrução de política baseada em recursos mais simples permite que um serviço invoque uma função. O comando a seguir concede permissão ao Amazon SNS para invocar uma função chamada my-function.

$ aws lambda add-permission --function-name my-function --action lambda:InvokeFunction --statement-id sns \ --principal sns.amazonaws.com --output text {"Sid":"sns","Effect":"Allow","Principal":{"Service":"sns.amazonaws.com"},"Action":"lambda:InvokeFunction","Resource":"arn:aws:lambda:us-east-2:123456789012:function:my-function"}

Isso permite ao Amazon SNS invocar a função, mas não restringir o tópico do Amazon SNS que dispara a invocação. Para garantir que a função só seja invocada por um recurso específico, especifique o Amazon Resource Name (ARN – Nome de recurso da Amazon) do recurso com a opção source-arn. O comando a seguir só permite que o Amazon SNS invoque a função para assinaturas de um tópico chamado my-topic.

$ aws lambda add-permission --function-name my-function --action lambda:InvokeFunction --statement-id sns-my-topic \ --principal sns.amazonaws.com --source-arn arn:aws:sns:us-east-2:123456789012:my-topic

Alguns serviços podem invocar funções em outras contas. Se você especificar um ARN de origem que tenha o ID da conta, isso não será um problema. No entanto, para o Amazon S3 a origem é um bucket cujo ARN não tem um ID da conta. É possível que você consiga excluir o bucket e outra conta consiga criar um bucket com o mesmo nome. Use a opção account-id para garantir que apenas os recursos na conta possam invocar a função.

$ aws lambda add-permission --function-name my-function --action lambda:InvokeFunction --statement-id s3-account \ --principal s3.amazonaws.com --source-arn arn:aws:s3:::my-bucket-123456 --source-account 123456789012

Concessão do acesso de função a outras contas

Para conceder permissões a outra conta da AWS, especifique o ID da conta como o principal. O exemplo a seguir concede permissão à conta 210987654321 para invocar my-function com o alias prod.

$ aws lambda add-permission --function-name my-function:prod --statement-id xaccount --action lambda:InvokeFunction \ --principal 210987654321 --output text {"Sid":"xaccount","Effect":"Allow","Principal":{"AWS":"arn:aws:iam::210987654321:root"},"Action":"lambda:InvokeFunction","Resource":"arn:aws:lambda:us-east-2:123456789012:function:my-function"}

Para limitar o acesso a um usuário, grupo ou função em outra conta, especifique o ARN completo da identidade como o principal. Por exemplo, arn:aws:iam::123456789012:user/developer.

O alias limita qual versão a outra conta pode invocar. Ele exige que a outra conta inclua o alias no ARN da função.

$ aws lambda invoke --function-name arn:aws:lambda:us-west-2:123456789012:function:my-function:prod out { "StatusCode": 200, "ExecutedVersion": "1" }

A seguir, atualize o alias a fim de apontar para novas versões conforme necessário. Quando você atualiza o alias, a outra conta não precisa alterar o código para usar a nova versão, e ela só tem permissão para invocar a versão escolhida por você.

Conceda acesso entre contas para qualquer ação de API realizada por em uma função existente. Por exemplo, é possível conceder acesso a lambda:ListAliases para obter uma lista de aliases ou a lambda:GetFunction para permitir que eles façam download do código da função. Adicione cada permissão separadamente ou use lambda:* para conceder acesso a todas as ações da função especificada.

Para conceder permissão a outras contas para várias funções ou para ações que não operem em uma função, use funções.

Concessão do acesso de camada a outras contas

Para conceder permissão de uso de camadas a outra conta, adicione uma instrução à política de permissões da versão da camada com o comando add-layer-version-permission. Em cada instrução, você pode conceder permissão a uma única conta, a todas as contas ou a uma organização.

$ aws lambda add-layer-version-permission --layer-name xray-sdk-nodejs --statement-id xaccount \ --action lambda:GetLayerVersion --principal 210987654321 --version-number 1 --output text e210ffdc-e901-43b0-824b-5fcd0dd26d16 {"Sid":"xaccount","Effect":"Allow","Principal":{"AWS":"arn:aws:iam::210987654321:root"},"Action":"lambda:GetLayerVersion","Resource":"arn:aws:lambda:us-east-2:123456789012:layer:xray-sdk-nodejs:1"}

As permissões só se aplicam a uma única versão de uma camada. Repita o procedimento cada vez que você criar uma versão da camada.

Para conceder permissão a todas as contas em uma organização, use a opção organization-id. O exemplo a seguir concede a todas as contas em uma organização permissão para usar a versão 3 de uma camada.

$ aws lambda add-layer-version-permission --layer-name my-layer \ --statement-id engineering-org --version-number 3 --principal '*' \ --action lambda:GetLayerVersion --organization-id o-t194hfs8cz --output text b0cd9796-d4eb-4564-939f-de7fe0b42236 {"Sid":"engineering-org","Effect":"Allow","Principal":"*","Action":"lambda:GetLayerVersion","Resource":"arn:aws:lambda:us-east-2:123456789012:layer:my-layer:3","Condition":{"StringEquals":{"aws:PrincipalOrgID":"o-t194hfs8cz"}}}"

Para conceder permissão a todas as contas da AWS, use * para a entidade principal e omita o ID da organização. Para várias contas ou organizações, adicione várias instruções.

Limpeza de políticas baseadas em recursos

Para exibir a política baseada em recursos de uma função, use o comando get-policy.

$ aws lambda get-policy --function-name my-function --output text {"Version":"2012-10-17","Id":"default","Statement":[{"Sid":"sns","Effect":"Allow","Principal":{"Service":"s3.amazonaws.com"},"Action":"lambda:InvokeFunction","Resource":"arn:aws:lambda:us-east-2:123456789012:function:my-function","Condition":{"ArnLike":{"AWS:SourceArn":"arn:aws:sns:us-east-2:123456789012:lambda*"}}}]} 7c681fc9-b791-4e91-acdf-eb847fdaa0f0

Para versões e aliases, acrescente o número da versão ou o alias ao nome da função.

$ aws lambda get-policy --function-name my-function:PROD

Para remover permissões da função, use remove-permission.

$ aws lambda remove-permission --function-name example --statement-id sns

Use o comando get-layer-version-policy para visualizar as permissões em uma camada, e remove-layer-version-permission para remover instruções da política.

$ aws lambda get-layer-version-policy --layer-name my-layer --version-number 3 --output text b0cd9796-d4eb-4564-939f-de7fe0b42236 {"Sid":"engineering-org","Effect":"Allow","Principal":"*","Action":"lambda:GetLayerVersion","Resource":"arn:aws:lambda:us-west-2:123456789012:layer:my-layer:3","Condition":{"StringEquals":{"aws:PrincipalOrgID":"o-t194hfs8cz"}}}" $ aws lambda remove-layer-version-permission --layer-name my-layer --version-number 3 --statement-id engineering-org