Skip to content
English
On this page

Ejercicio: Implementación de Lambda con Secrets Manager y Systems Manager

Escenario

Crearemos una función Lambda que accederá a credenciales almacenadas en Secrets Manager y parámetros de configuración en Systems Manager Parameter Store.

Acceder a la Consola AWS:

  1. Abre https://console.aws.amazon.com
  2. Inicia sesión con tus credenciales
  3. Verifica la región (esquina superior derecha)

Parte 1: Configurar Secrets Manager

Crear un Secreto:

  1. Ve a Secrets Manager:

    • Escribe "Secrets" en la barra de búsqueda, o
    • En el menú Servicios > Security, Identity, & Compliance > Secrets Manager
  2. En la página principal de Secrets Manager:

    • Clic en "Store a new secret" (botón naranja)
  3. En "Choose secret type":

    Secret type: Other type of secret
    Key/value pairs:
    - Key: DB_USER
      Value: admin
    - Key: DB_PASSWORD
      Value: tu-password-seguro
    • Clic en "Next"
  4. En "Configure secret":

    Secret name: prod/database/credentials
    Description: Credenciales de base de datos producción
    • Clic en "Next"
  5. En "Configure rotation":

    • Mantén "Disable automatic rotation"
    • Clic en "Next"
  6. Revisa y clic en "Store"

Parte 2: Configurar Systems Manager Parameter Store

Crear Parámetros:

  1. Ve a AWS Systems Manager:

    • Escribe "Systems Manager" en la barra de búsqueda, o
    • En el menú Servicios > Management & Governance > Systems Manager
  2. En el panel izquierdo:

    • Expande "Application Management"
    • Clic en "Parameter Store"
  3. Clic en "Create parameter":

    Para el primer parámetro:
    Name: /prod/app/database/host
    Description: Host de base de datos
    Tier: Standard
    Type: String
    Data type: text
    Value: tu-endpoint-db.region.rds.amazonaws.com
    
    Para el segundo parámetro:
    Name: /prod/app/database/port
    Description: Puerto de base de datos
    Tier: Standard
    Type: String
    Data type: text
    Value: 3306

Parte 3: Configurar IAM Role para Lambda

Crear Rol IAM:

  1. Ve a IAM:

    • Escribe "IAM" en la barra de búsqueda
  2. En el panel izquierdo:

    • Clic en "Roles"
    • Clic en "Create role"
  3. En "Select trusted entity":

    Trusted entity type: AWS service
    Use case: Lambda
    • Clic en "Next"
  4. En "Add permissions":

    • Busca y selecciona:
      • AWSLambdaBasicExecutionRole
      • CloudWatchLogsFullAccess
    • Clic en "Create policy" para añadir políticas personalizadas
  5. En la nueva ventana de crear política:

    json
    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Action": [
                    "secretsmanager:GetSecretValue"
                ],
                "Resource": "arn:aws:secretsmanager:region:account:secret:prod/database/*"
            },
            {
                "Effect": "Allow",
                "Action": [
                    "ssm:GetParameter",
                    "ssm:GetParameters"
                ],
                "Resource": "arn:aws:ssm:region:account:parameter/prod/app/database/*"
            }
        ]
    }
    • Name: "LambdaSecretsSSMAccess"
    • Clic en "Create policy"
  6. Vuelve a la pestaña de creación de rol:

    • Actualiza la lista de políticas
    • Busca y selecciona "LambdaSecretsSSMAccess"
    • Clic en "Next"
  7. En "Name, review, and create":

    Role name: LambdaSecretsSSMRole
    Description: Acceso a Secrets Manager y Parameter Store para Lambda
    • Clic en "Create role"

Parte 4: Crear Función Lambda

Crear Lambda:

  1. Ve a Lambda:

    • Escribe "Lambda" en la barra de búsqueda
  2. Clic en "Create function"

  3. En la página de creación:

    Author from scratch
    Function name: DatabaseConfigReader
    Runtime: Python 3.9
    Architecture: x86_64
    Permissions: Use an existing role
    Existing role: LambdaSecretsSSMRole
    • Clic en "Create function"
  4. En el editor de código, reemplaza el código con:

python
import json
import boto3
import base64
from botocore.exceptions import ClientError

def get_secret():
    secret_name = "prod/database/credentials"
    region_name = "tu-region"
    
    session = boto3.session.Session()
    client = session.client(
        service_name='secretsmanager',
        region_name=region_name
    )
    
    try:
        get_secret_value_response = client.get_secret_value(
            SecretId=secret_name
        )
    except ClientError as e:
        raise e
    else:
        if 'SecretString' in get_secret_value_response:
            secret = json.loads(get_secret_value_response['SecretString'])
            return secret
        else:
            return base64.b64decode(get_secret_value_response['SecretBinary'])

def get_parameters():
    ssm = boto3.client('ssm')
    parameters = ssm.get_parameters(
        Names=[
            '/prod/app/database/host',
            '/prod/app/database/port'
        ],
        WithDecryption=True
    )
    
    params_dict = {}
    for param in parameters['Parameters']:
        params_dict[param['Name']] = param['Value']
    return params_dict

def lambda_handler(event, context):
    try:
        # Obtener secretos
        secrets = get_secret()
        
        # Obtener parámetros
        parameters = get_parameters()
        
        # Combinar configuración
        config = {
            "database": {
                "host": parameters['/prod/app/database/host'],
                "port": parameters['/prod/app/database/port'],
                "user": secrets['DB_USER'],
                "password": "********"  # No mostrar password real
            }
        }
        
        return {
            'statusCode': 200,
            'body': json.dumps(config)
        }
    except Exception as e:
        return {
            'statusCode': 500,
            'body': json.dumps(str(e))
        }
  1. Clic en "Deploy"

Parte 5: Probar la Función

Crear Evento de Prueba:

  1. En la página de la función Lambda:

    • Clic en "Test"
    • Clic en "Create new event"
  2. Configurar evento:

    Template: hello-world
    Name: TestEvent
    • Deja el JSON por defecto
    • Clic en "Save"

Ejecutar Prueba:

  1. Clic en "Test"
  2. Revisa los resultados en el panel "Execution results"

Verificación

Verificar Logs:

  1. Ve a CloudWatch Logs:

    • En la función Lambda, clic en la pestaña "Monitor"
    • Clic en "View logs in CloudWatch"
  2. Revisa los logs más recientes para:

    • Éxito en obtener secretos
    • Éxito en obtener parámetros
    • Cualquier error que pueda haber ocurrido

Verificar Permisos:

  1. En la función Lambda:
    • Ve a la pestaña "Configuration"
    • Clic en "Permissions"
    • Verifica que el rol tiene las políticas correctas

Solución de Problemas Comunes

Error de Permisos:

Si ves "AccessDeniedException":

  1. Ve al rol IAM
  2. Verifica las políticas
  3. Asegúrate que los ARN son correctos

Error de Región:

Si no encuentra los secretos:

  1. Verifica que la región en el código coincide con tu región
  2. Verifica que los nombres de los secretos son correctos

Error de Timeout:

Si la función excede el timeout:

  1. Ve a "Configuration"
  2. Clic en "General configuration"
  3. Aumenta el timeout (por defecto 3 segundos)

Limpieza

  1. Eliminar función Lambda
  2. Eliminar secretos
  3. Eliminar parámetros
  4. Eliminar rol IAM y políticas personalizadas

Conceptos Clave para el Examen

  • Integración entre servicios AWS
  • Manejo seguro de credenciales
  • Configuración de permisos IAM
  • Uso de Parameter Store vs Secrets Manager