Uso de políticas basadas en recursos para Lambda - AWS Lambda

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

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.

Visualización de la política basada en recursos de una función
  1. Abra la página de Funciones en la consola de Lambda.

  2. Elija una función.

  3. Elija Configuración y, a continuación, seleccione Permisos.

  4. 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 denominado my-bucket en la cuenta 123456789012.

    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 dentro del ámbito de las acciones y de la AddPermissionAPI. AddLayerVersionPermission 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.

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

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 AddPermission de la AWS CLI otorga 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-a1b2c3d4e5fobtener 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: PrincipalOrg ID en la guía del AWS Identity and Access Management usuario.

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 \ --principal 111122223333 --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.

El siguiente ejemplo concede a la cuenta 111122223333 acceso a la versión 2 de la capa bash-runtime.

aws lambda add-layer-version-permission --layer-name bash-runtime --statement-id xaccount \ --action lambda:GetLayerVersion --principal 111122223333 --version-number 2 --output text

Debería ver una salida similar a esta:

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-1:123456789012:layer:bash-runtime:2"}

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