Comment configurer une fonction Lambda pour qu'elle assure un rôle dans un autre compte AWS ?

Date de la dernière mise à jour : 22/10/2020

Ma fonction AWS Lambda doit assurer un rôle dans un autre compte AWS pour effectuer une tâche donnée. Comment configurer cela ?

Brève description

Vous pouvez autoriser les fonctions Lambda créées dans un compte (« compte A ») à assurer un rôle dans un autre compte (« compte B ») pour les raisons suivantes :

Pour plus d'informations, consultez Utilisation des stratégies basées sur les ressources pour AWS Lambda.

Résolution

Si ce n'est pas déjà fait, configurez les deux rôles AWS Identity and Access Management (IAM) suivants :

  • Rôle d'exécution : rôle principal dans le compte A qui autorise la fonction Lambda à effectuer son travail.
  • Rôle assuré : rôle dans le compte B assuré par la fonction Lambda dans le compte A pour accéder à des ressources entre comptes.

Suivez ensuite ces instructions :

1.    Associez la stratégie IAM suivante au rôle d'exécution afin que la fonction Lambda dans le compte A assure le rôle dans le compte B :

Remarque : remplacez 222222222222 par l'ID de compte AWS du compte B. Remplacez role-on-source-account par le nom du rôle assuré.

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

2.    Remplacez la stratégie d'approbation du rôle assuré dans le compte B par ce qui suit :

Remarque : remplacez 111111111111 par l'ID de compte AWS du compte A. Remplacez my-lambda-execution-role par le nom du rôle d'exécution.

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

3.    Mettez à jour le code de la fonction Lambda pour ajouter l'appel d'API AssumeRole d'AWS Security Token Service (AWS STS). Cet appel renvoie un ensemble d'informations d'identification que vous pouvez utiliser pour créer un client de service. Lorsque vous utilisez ce client, votre fonction dispose des autorisations que lui accorde le rôle assuré, et elle agit comme si elle appartenait au compte B. Pour plus d'informations, consultez la section assume_role dans la documentation du kit AWS SDK pour Python (Boto 3).

Vous pouvez utiliser le code de fonction Python suivant comme exemple pour votre propre cas d'utilisation. Ce code est fourni en l'état.

Remarque : remplacez 222222222222 par l'ID de compte AWS du compte B. Remplacez role-on-source-account par le nom du rôle assuré.

import boto3

def lambda_handler(context, event):

    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"

Cet article vous a-t-il été utile ?


Besoin d'aide pour une question technique ou de facturation ?