Concessão de acesso da função do Lambda a 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. É possível aplicar a instrução à função toda ou limitar a instrução a uma única versão ou alias.
nota
Quando você adiciona um acionador à 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, é possível usar a AWS CLI.
Recomendamos usar put-resource-policy para definir uma política JSON completa. Com put-resource-policy, você pode adicionar instruções de negação, usar toda a gama de chaves de condição do IAM e gerenciar todas as permissões em um único documento. Você também pode usar add-permission para adicionar instruções individuais para casos de uso simples.
Importante
O uso de put-resource-policy substitui qualquer política existente baseada em recursos no recurso. Se o recurso já tiver as permissões definidas com add-permission, put-resource-policy as substituirá. Use get-resource-policy para recuperar a política existente antes de fazer alterações.
Uso de uma política JSON completa (recomendado)
O exemplo de política a seguir concede ao Amazon Simple Notification Service permissão para invocar uma função denominada my-function, mas somente para um tópico específico. Ela também nega invocações a partir de um tópico específico.
{ "Version": "2012-10-17", "Statement": [ { "Sid": "allow-sns-my-topic", "Effect": "Allow", "Principal": { "Service": "sns.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:my-topic" } } }, { "Sid": "deny-sns-other-topic", "Effect": "Deny", "Principal": { "Service": "sns.amazonaws.com" }, "Action": "lambda:InvokeFunction", "Resource": [ "arn:aws:lambda:us-east-2:123456789012:function:my-function", "arn:aws:lambda:us-east-2:123456789012:function:my-function:*" ], "Condition": { "ArnLike": { "aws:SourceArn": "arn:aws:sns:us-east-2:123456789012:restricted-topic" } } } ] }
Salve a política em um arquivo chamado policy.json e aplique-a com put-resource-policy:
aws lambda put-resource-policy \ --resource-arn arn:aws:lambda:us-east-2:123456789012:function:my-function\ --policy file://policy.json
Para o Amazon S3, a fonte é um bucket cujo ARN não tem um ID da conta. É possível que você consiga excluir um bucket e outra conta consiga criar um bucket com o mesmo nome. Use a chave de condição aws:SourceAccount para garantir que apenas os recursos na sua conta possam invocar a função:
{ "Version": "2012-10-17", "Statement": [ { "Sid": "allow-s3", "Effect": "Allow", "Principal": { "Service": "s3.amazonaws.com" }, "Action": "lambda:InvokeFunction", "Resource": "arn:aws:lambda:us-east-2:123456789012:function:my-function", "Condition": { "StringEquals": { "aws:SourceAccount": "123456789012" }, "ArnLike": { "aws:SourceArn": "arn:aws:s3:::my-bucket" } } } ] }
Uso de add-permission
Para casos de uso simples, você pode usar add-permission para adicionar instruções individuais. O comando a seguir concede ao Amazon Simple Notification Service permissão para invocar uma função denominada my-function:
aws lambda add-permission \ --function-name my-function \ --action lambda:InvokeFunction \ --statement-id sns \ --principal sns.amazonaws.com \ --output text
A seguinte saída deverá ser mostrada:
{"Sid":"sns","Effect":"Allow","Principal":{"Service":"sns.amazonaws.com"},"Action":"lambda:InvokeFunction","Resource":"arn:aws:lambda:us-east-2:123456789012:function:my-function"}
nota
Se você chamar add-permission depois de put-resource-policy, a nova instrução será vinculada à política JSON existente.
Para restringir as invocações a um recurso específico, use a opção source-arn:
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
Para o Amazon S3, use a opção source-account com o ID da sua conta:
aws lambda add-permission \ --function-name my-function \ --action lambda:InvokeFunction \ --statement-id s3-account \ --principal s3.amazonaws.com \ --source-arn arn:aws:s3:::amzn-s3-demo-bucket\ --source-account123456789012