Je souhaite que ma fonction AWS Lambda endosse un rôle AWS Identity and Access Management (AWS IAM) dans un autre compte AWS.
Brève description
Pour que votre fonction Lambda endosse un rôle IAM dans un autre compte, procédez comme suit :
- Configurez le rôle d’exécution de votre fonction Lambda pour lui permettre d’endosser un rôle IAM dans un autre compte AWS.
- Modifiez la politique de confiance de votre rôle IAM intercompte pour permettre à votre fonction Lambda d’endosser le rôle.
- Ajoutez l’appel Service de jetons de sécurité AWS (AWS STS) AssumeRole au code de votre fonction Lambda.
Remarque : une fonction Lambda peut endosser un rôle IAM dans un autre compte pour accéder à des ressources, comme un compartiment Amazon Simple Storage Service (Amazon S3). La fonction Lambda peut également endosser le rôle requis pour effectuer des tâches, telles que le démarrage et l’arrêt d’instances.
Résolution
Remarque : l’exemple de procédure suivant fait référence à deux types de comptes :
- Un compte de base qui héberge la fonction Lambda, 111111111111
- Un compte croisé qui inclut le rôle IAM endossé par la fonction Lambda, 222222222222
Prérequis
Créez le rôle IAM que vous souhaitez utiliser dans le compte croisé.
Configurer le rôle d’exécution de votre fonction Lambda pour lui permettre d’endosser un rôle IAM dans un autre compte
Ajoutez la déclaration de politique suivante au rôle IAM de votre fonction Lambda dans le compte 111111111111 :
Remarque : remplacez 222222222222 par le numéro d’identification de compte du rôle intercompte endossé par votre fonction et role-on-source-account par le nom du rôle endossé.
{
"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 intercompte pour permettre à votre fonction Lambda d’endosser le rôle
Ajoutez la déclaration de politique suivante à la politique de confiance de votre rôle IAM intercompte dans le compte 222222222222 :
Remarque : remplacez 111111111111 par le numéro d’identification du compte dans lequel se trouve votre fonction Lambda et my-lambda-execution-role par le nom du rôle IAM 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
Pour ajouter l’appel d’API AWS STS AssumeRole au code de votre fonction, procédez comme indiqué sur la page 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. Lorsque vous utilisez le client de service, votre fonction Lambda dispose des autorisations accordées par le rôle endossé. Pour en savoir plus, consultez la page assume_role du site Web AWS Boto 3.
Exemple de code de fonction Python incluant l’appel d’API AWS STS AssumeRole
Remarque : remplacez 222222222222 par le numéro d’identification de compte AWS du rôle intercompte endossé par votre fonction et role-on-source-account par le nom du rôle endossé.
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"
Informations connexes
Utilisation de politiques basées sur les ressources pour AWS Lambda
Autorisations d’accès aux ressources Lambda
Basculer vers un rôle IAM (AWS API)
Résolution des problèmes liés aux rôles IAM
Création de fonctions Lambda avec Python