Al usar AWS re:Post, aceptas las AWS re:Post Términos de uso

¿Cómo puedo configurar una función de Lambda para que asuma un rol de IAM en otra cuenta de AWS?

4 minutos de lectura
0

Quiero que mi función de AWS Lambda asuma un rol de AWS Identity and Access Management (IAM) en otra cuenta de AWS.

Breve descripción

Para que la función de Lambda asuma un rol de IAM en otra cuenta, siga estos pasos:

  1. Configure el rol de ejecución de la función de Lambda para permitir que la función asuma un rol de IAM en otra cuenta de AWS.
  2. Modifique la política de confianza de su rol de IAM entre cuentas para permitir que la función de Lambda asuma el rol.
  3. Agregue la llamada a la API AssumeRole de AWS Security Token Service (AWS STS) al código de la función de Lambda.

Nota: Una función de Lambda puede asumir un rol de IAM en otra cuenta para acceder a recursos, como un bucket de Amazon Simple Storage Service (Amazon S3). La función de Lambda también puede asumir el rol para realizar tareas, como iniciar y detener instancias.

Solución

Nota: El procedimiento de ejemplo siguiente hace referencia a dos tipos de cuentas:

  • Una cuenta principal que aloja la función de Lambda, 111111111111
  • Una cuenta cruzada que incluye el rol de IAM que asume la función de Lambda, 222222222222

Requisito previo

Cree el rol de IAM que desee usar en la cuenta cruzada.

Configuración del rol de ejecución de la función de Lambda para permitir que la función asuma un rol de IAM en otra cuenta

Agregue la siguiente instrucción de política al rol de IAM de la función de Lambda en la cuenta 111111111111:

Nota: Sustituya 222222222222 por el ID de cuenta del rol entre cuentas que la función asume, y role-on-source-account por el nombre del rol asumido.

{
    "Version": "2012-10-17",
    "Statement": {
        "Effect": "Allow",
        "Action": "sts:AssumeRole",
        "Resource": "arn:aws:iam::222222222222:role/role-on-source-account"
    }
}

Modificación de la política de confianza del rol de IAM entre cuentas para permitir que su función de Lambda asuma el rol

Añada la siguiente instrucción de política a la política de confianza del rol de IAM entre cuentas en la cuenta 222222222222:

Nota: Sustituya 111111111111 por el ID de la cuenta en la que se encuentra la función de Lambda, y my-lambda-execution-role por el nombre del rol de IAM de la función.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::111111111111:role/my-lambda-execution-role"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}

Agregación de la llamada a la API AssumeRole de AWS STS al código de la función de Lambda

Para agregar la llamada a la API AssumeRole de AWS STS al código de la función, complete los pasos que se indican en Configuring Lambda function options.

Nota: La llamada a la API AssumeRole de AWS STS devuelve unas credenciales que se pueden utilizar para crear un cliente de servicio. Cuando usa el cliente de servicio, la función de Lambda tiene los permisos que otorgó el rol asumido. Para obtener más información, consulte assume_role en el sitio web de AWS Boto 3.

Ejemplo de código de función de Python que incluye la llamada a la API AssumeRole de AWS STS

Nota: Sustituya 222222222222 por el ID de cuenta de AWS del rol entre cuentas que asume su función, y role-on-source-account por el nombre del rol asumido.

import boto3
def lambda_handler(event, context):

    sts_connection = boto3.client('sts')
    acct_b = sts_connection.assume_role(
        RoleArn="arn:aws:iam::222222222222:role/role-on-source-account",
        RoleSessionName="cross_acct_lambda"
    )

    ACCESS_KEY = acct_b['Credentials']['AccessKeyId']
    SECRET_KEY = acct_b['Credentials']['SecretAccessKey']
    SESSION_TOKEN = acct_b['Credentials']['SessionToken']

    # create service client using the assumed role credentials, e.g. S3
    client = boto3.client(
        's3',
        aws_access_key_id=ACCESS_KEY,
        aws_secret_access_key=SECRET_KEY,
        aws_session_token=SESSION_TOKEN,
    )

    return "Hello from Lambda"

Información relacionada

Using resource-based policies for AWS Lambda

Lambda resource access permissions

Cambio a un rol de IAM (AWS CLI)

Solución de problemas de roles de IAM

Building Lambda functions with Python

OFICIAL DE AWS
OFICIAL DE AWSActualizada hace un año