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

Uso de políticas basadas en recursos para AWS Lambda

AWS Lambda admite políticas de permisos basadas en recursos para las funciones y las capas de Lambda. Las políticas basadas en recursos le permiten conceder a otras cuentas de AWS permisos de uso sobre 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. Puede agregar diferentes instrucciones para conceder acceso a varias cuentas o permitir que cualquier cuenta invoque la función. También puede utilizar la política 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

  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 directivas basadas en recursos para recursos de Lambda en el ámbito de las acciones API AddPermission y 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.

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 CLI de AWS.

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, el origen 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 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 210987654321 para invocar my-function con el alias prod.

aws lambda add-permission --function-name my-function:prod --statement-id xaccount --action lambda:InvokeFunction \ --principal 210987654321 --output text

Debería ver los siguientes datos de salida:

{"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"}

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 usar 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.

API entre cuentas

Actualmente, Lambda no admite acciones entre cuentas en ninguna de sus API a través de políticas basadas en recursos. Las API que se admiten son las siguientes:

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 el permiso de uso de capa 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 210987654321 --version-number 1 --output text

Debería ver los siguientes datos de salida:

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"}

Los permisos se aplican solo a una única versión de una capa. Repita el proceso cada vez que cree una nueva versión de 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