IAM: Cómo utilizar roles entre cuentas

IAM

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 🙂

Recent Post