Comment puis-je configurer une fonction Lambda afin qu'elle assume un rôle IAM dans un autre compte AWS ?

Dernière mise à jour : 17/02/2022

J'ai besoin que ma fonction AWS Lambda assume un rôle AWS Identity and Access Management (IAM) dans un autre compte AWS. Comment puis-je procéder ?

Brève description

Pour que votre fonction Lambda assume un rôle IAM dans un autre compte AWS, procédez comme suit :

  1. Configurer le rôle d'exécution de votre fonction Lambda afin de permettre à la fonction d'assumer un rôle IAM dans un autre compte AWS.
  2. Modifiez la politique de confiance de votre rôle IAM intercompte afin d'autoriser votre fonction Lambda à assumer ce rôle.
  3. Ajoutez l'appel d'API AWS Security Token Service (AWS STS) AssumeRole au code de votre fonction Lambda.

Remarque : une fonction Lambda peut assumer un rôle IAM dans un autre compte AWS pour effectuer l'une des opérations suivantes :

Solution

Remarque : l'exemple de procédure suivant référence deux types de comptes AWS différents :

  • Un compte personnel hébergeant la fonction Lambda ( 111111111111).
  • Un intercompte incluant le rôle IAM que la fonction Lambda assume (222222222222)

La procédure suppose :

  • Que vous avez créé le rôle IAM que vous souhaitez utiliser dans l'intercompte (222222222222)

Configurer le rôle d'exécution de votre fonction Lambda afin de permettre à la fonction d'assumer un rôle IAM dans un autre compte AWS

Ajoutez l'instruction de politique suivante au rôle d'exécution de votre fonction Lambda (dans le compte 111111111111) en suivant les instructions de la section Ajout et suppression d'autorisations basées sur l'identité IAM:

Important : remplacez 222222222222 par l'ID de compte AWS du rôle intercomptes que votre fonction joue. Remplacez role-on-source-account par le nom du rôle joué.

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

Modifiez la politique de confiance de votre rôle IAM intercomptes pour autoriser votre fonction Lambda à jouer ce rôle

Ajoutez l'instruction de politique suivante à la politique intercomptes d'approbation de votre rôle IAM (dans le compte 222222222222) en suivant les instructions de la section Modification d'une politique d'approbation de rôle (console):

Important : remplacez 111111111111 par l'ID de compte AWS dans lequel se trouve votre fonction Lambda. Remplacez my-lambda-execution-role par le nom du rôle d'exécution de votre fonction.

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

Ajoutez l'appel d'API AWS STS AssumeRole au code de votre fonction Lambda

Ajoutez l'appel d'API AWS STS AssumeRole au code de votre fonction en suivant les instructions de la section Configuration des options de la fonction Lambda.

Remarque : l'appel d'API AWS STS AssumeRole renvoie des informations d’identification que vous pouvez utiliser pour créer un client de service. En utilisant ce client de service, votre fonction Lambda dispose des autorisations qui lui sont accordées par le rôle joué. Pour plus d'informations, consultez assume_role dans la documentation du kit AWS SDK pour Python (Boto 3).

Exemple de code de fonction Python qui inclut l'appel d'API AWS STS AssumeRole

Important : remplacez 222222222222 par l'ID de compte AWS du rôle intercomptes que votre fonction joue. Remplacez role-on-source-account par le nom du rôle joué.

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"