Uso de políticas basadas en recursos para Lambda
Lambda admite políticas de permisos basadas en recursos para las funciones y capas de Lambda. Las políticas basadas en recursos le permiten conceder a otras cuentas de AWS permisos de uso para cada recurso. También puede utilizar una política basada en recursos para permitir que un servicio de AWS invoque una función en su nombre.
Para las funciones de Lambda, puede conceder a una cuenta permiso para invocar o administrar una función. También puede utilizar una política basada en recursos para concesión de permisos a toda una organización en AWS Organizations. También puede utilizar la política basasda en recursos para conceder permiso de invocación a un servicio de AWS que invoque una función en respuesta a la actividad de su cuenta.
Para ver la política basada en recursos de una función
Abra la página de Functions
(Funciones) en la consola de Lambda. -
Elija una función.
-
Elija Configuración y, a continuación, seleccione Permisos.
-
Desplácese hacia abajo hasta Directiva basada en recursos y, a continuación, elija Ver documento de directiva. La política basada en recursos muestra los permisos que se aplican cuando otra cuenta o servicio de AWS intenta acceder a la función. En el ejemplo siguiente se muestra una instrucción que permite a Amazon S3 invocar una función denominada
my-function
para un bucket denominadomy-bucket
en la cuenta123456789012
.ejemplo Política basada en recursos
{ "Version": "2012-10-17", "Id": "default", "Statement": [ { "Sid": "lambda-allow-s3-my-function", "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" } } } ] }
En el caso de las capas de Lambda, solo se puede utilizar una política basada en recursos en una versión de capa específica, y no en toda la capa. Además de las políticas que conceden permisos a una cuenta específica o a todas las cuentas, en el caso de las capas, también se puede conceder permiso a todas las cuentas de una organización.
nota
Solo puede actualizar las políticas basadas en recursos para los recursos de Lambda en el ámbito de las acciones AddPermission y AddLayerVersionPermission de la API. En la actualidad, no se pueden crear políticas para los recursos de Lambda en JSON ni utilizar condiciones que no se correspondan con los parámetros de estas acciones.
Las políticas basadas en recursos se aplican a una sola función, versión, alias o versión de capa. Conceden permiso para uno o varios servicios y cuentas. Para las cuentas de confianza que desea que tengan acceso a varios recursos, o para utilizar las acciones de la API que las políticas basadas en recursos no admiten, puede utilizar roles entre cuentas.
Temas
Acciones de la API admitidas
Las siguientes acciones de la API de Lambda admiten las políticas basadas en recursos:
Concesión de acceso a las funciones a los servicios de AWS
Cuando se utiliza un servicio de AWS para invocar una función, se debe conceder permiso en una instrucción de una política basada en recursos. Puede aplicar la instrucción a toda la función que se va a invocar o administrar, o bien puede limitar la instrucción a una sola versión o alias.
nota
Cuando se añade un desencadenador a la función con la consola de Lambda, esta actualiza la política basada en recursos de la función para permitir al servicio que la invoque. Para conceder permisos a otras cuentas o servicios que no están disponibles en la consola de Lambda, puede utilizar la AWS CLI.
Añada una instrucción con el comando add-permission
. La instrucción más sencilla de una política basada en recursos permite un servicio invocar una función. El comando siguiente concede permiso a Amazon SNS para invocar una función denominada my-function
.
aws lambda add-permission --function-name my-function --action lambda:InvokeFunction --statement-id sns \ --principal sns.amazonaws.com --output text
Debería ver los siguientes datos de salida:
{"Sid":"sns","Effect":"Allow","Principal":{"Service":"sns.amazonaws.com"},"Action":"lambda:InvokeFunction","Resource":"arn:aws:lambda:us-east-2:123456789012:function:my-function"}
De este modo, Amazon SNS podrá llamar a la API lambda:Invoke
de la función, pero no se restringirá el tema de Amazon SNS que activa la invocación. Para asegurarse de que la función solo la invocada un recurso determinado, especifique el nombre de recurso de Amazon (ARN) del recurso con la opción source-arn
. El siguiente comando solo permite a Amazon SNS invocar la función para las suscripciones a un tema denominado 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
Algunos servicios pueden invocar funciones de otras cuentas. Esto no es un problema cuando se especifica un ARN de origen que incluye el ID de la cuenta. Sin embargo, para Amazon S3, la fuente es un bucket cuyo ARN no incluye el ID de la cuenta. Es posible que usted elimine el bucket y que otra cuenta cree un bucket con el mismo nombre. Utilice la opción source-account
con el ID de la cuenta para garantizar que solo los recursos de la cuenta pueden invocar la función.
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-account123456789012
Concesión de acceso a las funciones a una organización
Para conceder permisos a una organización definida en AWS Organizations, especifique el ID de la organización como el principal-org-id
. Los siguientes ejemplos del comando AWS CLI de AddPermission concede acceso de invocación a todos los usuarios de la organización o-a1b2c3d4e5f
.
aws lambda add-permission --function-name example \ --statement-id PrincipalOrgIDExample --action lambda:InvokeFunction \ --principal * --principal-org-id o-a1b2c3d4e5f
nota
En este comando, Principal
es *
. Esto significa que todos los usuarios de la organización o-a1b2c3d4e5f
obtener permisos de invocación de funciones. Si especifica una cuenta o rol de AWS como Principal
, entonces solo ese principal obtiene permisos de invocación de funciones, pero solo si también forman parte de la organización o-a1b2c3d4e5f
.
Este comando crea una política basada en recursos que tiene el siguiente aspecto:
{ "Version": "2012-10-17", "Statement": [ { "Sid": "PrincipalOrgIDExample", "Effect": "Allow", "Principal": "*", "Action": "lambda:InvokeFunction", "Resource": "arn:aws:lambda:us-west-2:123456789012:function:example",
"Condition": { "StringEquals": { "aws:PrincipalOrgID": "o-a1b2c3d4e5f" } }
} ] }
Para obtener más información, consulte aws:PrincipalOrgID en la guía del usuario de AWS Identity and Access Management.
Concesión de acceso a las funciones a otras cuentas
Para conceder permisos a otra cuenta de AWS, especifique el ID de la cuenta como principal
. En el siguiente ejemplo, se concede permiso a la cuenta 111122223333
para invocar my-function
con el alias prod
.
aws lambda add-permission --function-name my-function:
prod
--statement-id xaccount --action lambda:InvokeFunction \ --principal111122223333
--output text
Debería ver los siguientes datos de salida:
{"Sid":"xaccount","Effect":"Allow","Principal":{"AWS":"arn:aws:iam::111122223333:root"},"Action":"lambda:InvokeFunction","Resource":"arn:aws:lambda:us-east-2:123456789012:function:my-function"}
La política basada en recursos concede permiso a la otra cuenta para obtener acceso a la función, pero no permite a los usuarios de esa cuenta superar sus permisos. Los usuarios de la otra cuenta deben tener los permisos de usuario correspondientes para utilizar la API de Lambda.
Para limitar el acceso a un usuario o función de otra cuenta, especifique el ARN completo de la identidad como el principal. Por ejemplo, arn:aws:iam::123456789012:user/developer
.
El alias limita la versión que puede invocar la otra cuenta. Requiere que la otra cuenta incluya el alias en el ARN de la función.
aws lambda invoke --function-name arn:aws:lambda:us-west-2:123456789012:function:my-function:prod out
Debería ver los siguientes datos de salida:
{ "StatusCode": 200, "ExecutedVersion": "1" }
El propietario de la función puede actualizar el alias para que apunte a una nueva versión sin que el autor de la llamada tenga que cambiar la forma en que invoca la función. De este modo, no es necesario que la otra cuenta cambie su código para utilizar la nueva versión y se garantiza que solo tiene permiso para invocar la versión de la función asociada al alias.
Puede conceder acceso entre cuentas para la mayoría de acciones de la API que operen con una función existente. Por ejemplo, puede conceder acceso a lambda:ListAliases
para permitir que una cuenta obtenga una lista de alias o a lambda:GetFunction
para permitirles que descarguen el código de la función. Añada cada permiso por separado o utilice lambda:*
para conceder acceso a todas las acciones para la función especificada.
Si desea conceder a otras cuentas permiso sobre varias funciones o sobre acciones que no pueden utilizarse con una función, le recomendamos que utilice los roles de IAM.
Concesión de acceso a las capas a otras cuentas
Para conceder permiso para utilizar capas a otra cuenta, añada una instrucción a la política de permisos de la versión de la capa con el comando add-layer-version-permission. En cada instrucción, puede conceder permiso a una única cuenta, a todas las cuentas o a una organización.
aws lambda add-layer-version-permission --layer-name xray-sdk-nodejs --statement-id xaccount \ --action lambda:GetLayerVersion --principal 111122223333 --version-number 1 --output text
Debería ver un resultado similar a este:
e210ffdc-e901-43b0-824b-5fcd0dd26d16 {"Sid":"xaccount","Effect":"Allow","Principal":{"AWS":"arn:aws:iam::111122223333:root"},"Action":"lambda:GetLayerVersion","Resource":"arn:aws:lambda:us-east-2:123456789012:layer:xray-sdk-nodejs:1"}
Los permisos solo se aplican a una única versión de una capa. Repita el proceso cada vez que cree una nueva versión de la capa.
Para conceder permiso a todas las cuentas de una organización, utilice la opción organization-id
. En el siguiente ejemplo, se concede permiso a todas las cuentas de una organización para utilizar la versión 3 de una capa.
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
Debería ver los siguientes datos de salida:
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 permiso a todas las cuentas de AWS, utilice *
para la entidad principal y omita el ID de la organización. En caso de que haya diferentes cuentas u organizaciones, tendrá que agregar varias instrucciones.
Limpieza de políticas basadas en recursos
Para ver la política basada en recursos de una función, utilice el comando get-policy
.
aws lambda get-policy --function-name my-function --output text
Debería ver los siguientes datos de salida:
{"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 las versiones y los alias, añada el número de versión o el alias al nombre de la función.
aws lambda get-policy --function-name my-function:PROD
Para eliminar permisos de una función, utilice remove-permission
.
aws lambda remove-permission --function-name example --statement-id sns
Utilice el comando get-layer-version-policy
para ver los permisos de una capa.
aws lambda get-layer-version-policy --layer-name my-layer --version-number 3 --output text
Debería ver los siguientes datos de salida:
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"}}}"
Se utiliza remove-layer-version-permission
para quitar instrucciones de la política.
aws lambda remove-layer-version-permission --layer-name my-layer --version-number 3 --statement-id engineering-org