AWS: Cómo utilizar roles de IAM entre cuentas con funciones Lambda: la forma más sencilla
Exploremos el uso de roles de IAM entre cuentas en AWS e implementémoslo en la función Lambda. Usaremos Python como lenguaje de código para nuestro Lambda.
Si es un desarrollador de AWS, tarde o temprano se le pedirá que implemente roles de IAM entre cuentas para que las aplicaciones o servicios en otras cuentas de AWS puedan acceder a recursos específicos en la cuenta de destino. No te preocupes, sería una tarea fácil de resolver y te muestro cómo.
Comencemos con una definición de tarea de ejemplo:
La función Lambda en la cuenta A necesita escribir algunos valores en claves específicas en el almacén de parámetros de AWS en la cuenta B.
En primer lugar, vayamos a la Cuenta A e implementemos un rol de IAM para la función de Lambda. Para hacerlo simple, usaré la siguiente plantilla de CloudFormation:
LambdaIAMRole:
Type: AWS::IAM::Role
Properties:
RoleName: LambdaIAMRole
AssumeRolePolicyDocument:
Version: "2012-10-17"
Statement:
- Effect: Allow
Principal:
Service:
- lambda.amazonaws.com
Action:
- 'sts:AssumeRole'
ManagedPolicyArns:
- arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole
Ahora necesitamos crear el rol de IAM entre cuentas en la cuenta B, que proporciona permisos para escribir en el almacén de parámetros. Y el rol de IAM creado debe tener permisos para ser asumido por el rol de IAM de Lambda de la cuenta A.
Utilice la plantilla de CloudFormation a continuación y reemplace ACCOUNT_A_ID
con el ID de cuenta de su función Lambda.
ParameterStoreRole:
Type: AWS::IAM::Role
Properties:
RoleName: ParameterStoreRole
AssumeRolePolicyDocument:
Version: 2012-10-17
Statement:
- Effect: Allow
Principal:
AWS:
- arn:aws:iam::ACCOUNT_A_ID:root
Action: sts:AssumeRole
Condition:
StringLike:
aws:PrincipalArn:
- arn:aws:iam::ACCOUNT_A_ID:role/LambdaIAMRole
Policies:
- PolicyName: ParameterStore
PolicyDocument:
Version: 2012-10-17
Statement:
- Effect: Allow
Sid: ParameterStoreActions
Action:
- ssm:PutParameter
Resource: arn:aws:ssm:*:*:parameter/external/*
Una vez que se crean los roles de IAM, podemos pasar a escribir una función Lambda usando Python. Aquí está la plantilla de código que puede usar en su proyecto.
import boto3
import traceback
# Parameters
cross_account_iam_role_name = 'ParameterStoreRole'
account_b_id = '123456789'
parameter_store_key_prefix = '/external'
parameter_store_value = 'Hello from Account A'
session_name = 'LambdaParameterStoreWrite'
def lambda_handler(event, context):
try:
#Establish STS connection to the Account B
sts_connection = boto3.client('sts')
acct_a = sts_connection.assume_role(
RoleArn=cross_account_iam_role_name,
RoleSessionName=session_name
)
# Identify Access Keys to the Account B IAM role
ACCESS_KEY = acct_a['Credentials']['AccessKeyId']
SECRET_KEY = acct_a['Credentials']['SecretAccessKey']
SESSION_TOKEN = acct_a['Credentials']['SessionToken']
# Create connection to Session Manager service on Account B
ssm = boto3.client('ssm', aws_access_key_id=ACCESS_KEY,
aws_secret_access_key=SECRET_KEY,
aws_session_token=SESSION_TOKEN,
)
# Write Value to the parameter store key
write_to_parameterstore = ssm.put_parameter(
Name=parameter_store_key_prefix,
Value=parameter_store_value, Type='String',
Overwrite=True)
except:
# Print error message
traceback.print_exc()
return True
¡Y eso es casi todo! 🙂
Una vez que haya implementado las plantillas de Cloudformation para roles de IAM y también el código Lambda (no olvide adjuntar LambdaIAMRole
a su función de Lambda), tendrá una solución funcional para asumir un rol de IAM desde una cuenta de AWS externa y ejecutar una tarea específica en la cuenta de destino mediante Lambda.
Siéntase libre de modificar el código a sus necesidades 🙂