AWS Step Functions: Ejemplo llamado HTTP Request

JJOC007
10 min readDec 18, 2023

En el dinámico mundo de la computación en la nube, la integración y la automatización son las claves del éxito. AWS Step Functions se erige como un poderoso orquestador de microservicios, permitiendo a los desarrolladores tejer complejas secuencias de tareas con facilidad y eficiencia. Entre las joyas de su corona, las Tareas HTTP brillan con luz propia, ofreciendo una versatilidad y una capacidad de integración sin precedentes.

¿Qué son las Tareas HTTP? En esencia, son estados dentro de una máquina de estados de AWS Step Functions diseñados para interactuar con APIs de terceros. Piensa en ellas como puentes que conectan tu flujo de trabajo en AWS con el vasto universo de servicios web disponibles. Con las Tareas HTTP, puedes llamar a APIs externas como Salesforce, Stripe, o incluso servicios más personalizados, integrándose sin problemas en tus flujos de trabajo.

Características:

  • Flexibilidad en la Conexión: Ya sea que necesites obtener datos, enviar información o iniciar procesos en sistemas externos, las Tareas HTTP te permiten hacerlo con solo unos pocos clics.
  • Seguridad Robusta: La integración de AWS IAM y EventBridge asegura que tus llamadas a APIs sean seguras y gestionadas con las mejores prácticas de AWS en cuanto a autenticación y autorización.
  • Personalización Avanzada: Desde especificar métodos HTTP (GET, POST, y más) hasta ajustar encabezados y parámetros, tienes el control total sobre cómo interactúas con las APIs externas.
  • Monitoreo y Escalabilidad: Benefíciate del monitoreo integrado y de la capacidad de escalar automáticamente para manejar cargas de trabajo de cualquier tamaño.

Este artículo te guiará a través de un viaje fascinante por el mundo de las Tareas HTTP en AWS Step Functions. Exploramos casos de uso realistas, aspectos cruciales de la implementación, y culminamos con un ejemplo práctico: notificar a un webhook de Slack sobre el estado de un proceso. Prepárate para desbloquear nuevas posibilidades y llevar tus flujos de trabajo en la nube al siguiente nivel.

Casos de uso:

Las Tareas HTTP en AWS Step Functions abren un abanico de posibilidades para la integración de servicios y la automatización de procesos. Esta sección explora varios casos de uso prácticos y potentes donde las Tareas HTTP pueden ser una herramienta transformadora.

  1. Integración con Sistemas de CRM y ERP
    Gestión de Clientes y Pedidos
    : Automatiza la sincronización de datos entre tu sistema AWS y plataformas de CRM como Salesforce. Por ejemplo, puedes actualizar automáticamente los registros de clientes en Salesforce cuando ocurren cambios en tu sistema AWS.
    Automatización de Procesos de Negocio: Conecta tus flujos de trabajo con sistemas ERP para gestionar inventarios, pedidos y logística, permitiendo una integración en tiempo real que optimiza las operaciones empresariales.
  2. Interacciones con Plataformas de Pago|
    Procesamiento de Pagos
    : Integra servicios como Stripe o PayPal para automatizar el procesamiento de pagos. Las tareas HTTP pueden enviar datos de transacciones y recibir confirmaciones de pago, agilizando el ciclo de ventas.
    Gestión de Suscripciones: Automatiza la creación y gestión de suscripciones, así como la actualización de los detalles del cliente en sistemas de pago en línea.
  3. Notificaciones y Alertas
    Envío de Notificaciones:
    Utiliza servicios como Twilio o SendGrid para enviar SMS o correos electrónicos como parte de un flujo de trabajo, por ejemplo, para alertas de transacciones o notificaciones de estado de pedidos.
    Integración con Slack: Envía mensajes automáticos a canales o usuarios de Slack para notificar sobre actualizaciones de proyectos, alertas de sistemas, o resúmenes de datos.
  4. Análisis de Datos y Reporting
    Integración con Herramientas de Análisis
    : Extrae datos de AWS para análisis en plataformas externas como Google Analytics o herramientas de BI, permitiendo una comprensión más profunda y acción basada en datos.
    Automatización de Reportes: Genera y distribuye informes automáticos utilizando datos procesados por tu flujo de trabajo AWS, enviándolos a herramientas de reporting o almacenados en sistemas de archivo como Google Drive.
  5. Servicios de Inteligencia Artificial y Machine Learning
    Interacción con Modelos de AI/ML
    : Integra servicios externos de AI como IBM Watson o Google AI para enriquecer tus datos con capacidades de aprendizaje automático, análisis de sentimientos o reconocimiento de imágenes.
    Automatización de Procesos de Machine Learning: Orquesta y gestiona flujos de trabajo de ML, desde la preparación de datos hasta el entrenamiento y la evaluación de modelos, utilizando diversas APIs de ML.
  6. Gestión de Recursos en la Nube
    Orquestación de Servicios en la Nube:
    Automatiza la creación, actualización y eliminación de recursos en la nube, interactuando con servicios como AWS EC2 o Google Cloud Platform.
    Monitoreo y Respuesta a Eventos: Responde automáticamente a eventos de sistemas en la nube, como lanzamiento de instancias EC2 o alertas de rendimiento, utilizando flujos de trabajo que incluyen llamadas a APIs relevantes.
  7. Integración de Redes Sociales y Marketing
    Publicaciones Automatizadas en Redes Sociales
    : Programa y publica contenido en plataformas de redes sociales como Twitter o Facebook, como parte de estrategias de marketing digital.
    Análisis de Engagement: Recopila y analiza datos de interacción de usuarios en redes sociales para mejorar las campañas de marketing y la participación del cliente.

Ejemplo básico:

Para ilustrar cómo se implementa una Tarea HTTP en AWS Step Functions, consideremos un ejemplo concreto. Imaginemos que necesitamos realizar una llamada GET a una API externa para obtener información. A continuación, se detalla el código de la Tarea HTTP y se explica cada propiedad involucrada.

Ejemplo de Definición de Tarea HTTP:

{
"Comment": "Ejemplo de Tarea HTTP en AWS Step Functions",
"StartAt": "CallExternalAPI",
"States": {
"CallExternalAPI": {
"Type": "Task",
"Resource": "arn:aws:states:::http:invoke",
"Parameters": {
"ApiEndpoint": "https://api.externalservice.com/data",
"Method": "GET",
"Headers": {
"Content-Type": "application/json"
},
"Authentication": {
"ConnectionArn": "arn:aws:events:region:account-id:event-bus/default"
}

},
"End": true
}
}
}

Propiedades

  • Comment: Una descripción o comentario sobre el propósito de la máquina de estados. Es útil para documentación y claridad.
  • StartAt: Indica el primer estado que se ejecutará en la máquina de estados. En este caso, es CallExternalAPI.
  • States: Define los diferentes estados de la máquina. Aquí solo tenemos un estado, CallExternalAPI.
  • CallExternalAPI: Es el nombre del estado que estamos definiendo.
  • Type: Define el tipo de estado. En este caso, es una Task, lo que significa que realiza una tarea específica.
  • Resource: Especifica el tipo de recurso que la tarea utilizará. Aquí se usa arn:aws:states:::http:invoke para indicar que es una Tarea HTTP.
  • Parameters: Define los parámetros necesarios para la tarea HTTP.
  • ApiEndpoint: La URL de la API externa a la que se hará la llamada.
  • Method: El método HTTP a utilizar. Aquí es GET.
  • Headers: Cabeceras HTTP necesarias para la solicitud. En este caso, se indica que el contenido es de tipo JSON.
  • Authentication: Este campo se utiliza para especificar detalles de autenticación para la llamada API.
  • ConnectionArn: Es el Amazon Resource Name (ARN) de la conexión de EventBridge que gestiona las credenciales de autenticación. Esta conexión debe estar configurada previamente en EventBridge y contener la información necesaria para autenticarse con la API (por ejemplo, un token API).
  • End: Indica si este es el último estado de la máquina de estados. Si es true, la máquina de estados finalizará después de ejecutar este estado.

Ejemplo práctico: notificación simple a slack por medio de webhook:

En la era digital actual, la comunicación y la notificación instantánea son esenciales para la eficiencia y la colaboración en equipo. Slack, una de las plataformas líderes de comunicación empresarial, ofrece una funcionalidad robusta para integrar notificaciones personalizadas a través de webhooks. Combinar esto con AWS Step Functions nos permite automatizar notificaciones y mantener a los equipos informados sobre eventos y procesos clave en tiempo real.

En esta sección, abordaremos un ejemplo práctico y altamente relevante: enviar una notificación simple a un canal de Slack utilizando un webhook. Esta tarea, aparentemente sencilla, encapsula conceptos fundamentales de integración y automatización en la nube, demostrando cómo las herramientas modernas pueden trabajar juntas de manera eficiente.

arquitectura general del ejemplo

Pasos para la creación del webhook en slack:

  1. crear un canal donde vas a recibir las notificaciones en mi caso lo llame slack-notification-test:

2. En la parte de integraciones vamos a crear un workflow, en el ejemplo lo llamaremos bot-auto-not:

3. Ahora en la creacion del workflow vamos a elegir que inicie por medio de un webhook, luego de esto nos va a pedir que definamos las variables que llegaran cuando consumamos el webhook en el ejemplo estan las variables type y text:

4. Luego de esto creamos un paso adicional para se se envie un mensaje al canal con la información de las variables definidas:

5. En el paso del webhook vamos a encontrar la url que nos va a servir para enviar las notificaciones esta en este formato: https://hooks.slack.com/triggers/11111111/222222222/333333333

6. podemos probar el webhook haciendo una peticion tipo post y en el cuerpo enviando los parametros definidos en el workflow:

curl --location 'https://hooks.slack.com/triggers/1111/22222/33333 \
--header 'Content-type: application/json' \
--data '{
"text": "Example text",
"type": "ERROR"
}'

Teniendo todo esto definido ya podemos iniciar con la implementación de la step function

Pasos para la creación de la step function por medio de terraform:

  1. Lo primero que debemos hacer es crear un rol y politicas que van a ser asumidas por la step function y que le van a permitir hacer llamados http:

Recurso de rol:

resource "aws_iam_role" "step_functions_role" {
name = "step_functions_role"

assume_role_policy = jsonencode({
Version = "2012-10-17"
Statement = [
{
Action = "sts:AssumeRole"
Effect = "Allow"
Principal = {
Service = "states.amazonaws.com"
}
}
]
})
}

Recursos de políticas necesarias para el rol:

resource "aws_iam_policy" "sfn_logging_policy" {
name = "SFNLoggingPolicy"
description = "Allow Step Functions to log to CloudWatch Logs."

policy = jsonencode({
Version = "2012-10-17",
Statement = [
{
Effect = "Allow",
Action = [
"logs:*"
],
Resource = "*"
}
]
})
}

resource "aws_iam_policy" "sf_invoke_requests_policy" {
name = "SFSendInvokeRequestsPolicy"
description = "Allow Step Functions to invoke requests."

policy = jsonencode({
Version = "2012-10-17",
Statement = [
{
Effect = "Allow",
Action = [
"states:InvokeHTTPEndpoint"
],
Resource = "*"
},
{
Effect = "Allow",
Action = [
"events:RetrieveConnectionCredentials"
],
Resource = "*"
},
{
Effect = "Allow",
Action = [
"secretsmanager:GetSecretValue",
"secretsmanager:DescribeSecret"
],
Resource = "*"
}
]
})
}

Hay 2 políticas una para la administración de logs y la otra le otorga a la step function invocar servicios http y leer secrets dado el caso de que las peticiones necesite autenticación

2. Creación de la Conexión de EventBridge: AWS EventBridge es un servicio de bus de eventos sin servidor que facilita la conexión de aplicaciones con datos de diferentes fuentes. Una de sus características clave es la capacidad de establecer “conexiones” que permiten a AWS Step Functions comunicarse de manera segura con APIs de terceros, como Slack, Salesforce, Stripe, entre otros. Estas conexiones se utilizan, por ejemplo, en Tareas HTTP para gestionar autenticaciones y autorizaciones de forma segura y eficiente. Cómo funciona:

  • Creación de una Conexión: En EventBridge, defines una “conexión” que encapsula los detalles de autenticación necesarios para comunicarse con una API externa. Esta conexión puede incluir información como tokens de acceso, claves API, o credenciales de autenticación básica.
  • Almacenamiento Seguro de Credenciales: EventBridge almacena las credenciales de forma segura, utilizando AWS Secrets Manager. Esto significa que las credenciales están cifradas y protegidas, y no se exponen en las definiciones de las tareas o en el código.
  • Integración con Step Functions: Al definir una Tarea HTTP en AWS Step Functions, especificas el ARN (Amazon Resource Name) de la conexión de EventBridge. Step Functions utiliza esta conexión para autenticarse con la API externa durante la ejecución de la tarea.
  • Gestión de Autorización: La conexión maneja el proceso de autorización con la API externa. Esto libera a los desarrolladores de la carga de implementar y mantener código personalizado para la gestión de tokens o claves API.

Recurso de conexión de event bridge:

resource "aws_cloudwatch_event_connection" "slack_test_webhook" {
name = "test-slack-notification-connection"
description = "test-slack-notification-connection"
authorization_type = "API_KEY"

auth_parameters {
api_key {
key = "not-key"
value = "None"
}
}
}

Esta conexión es necesaria a pesar de que el webhook no maneja autenticación, por esta razón colocamos una api key random

3. Definicion de la step function:

{
"Comment": "Send a slack notification via sf",
"StartAt": "FirstStep",
"States": {
"FirstStep": {
"Type": "Pass",
"Result": {
"type": "INFO",
"text": "Message from Step Functions"
},
"ResultPath": "$.notificationData",
"Next": "SendNotification"
},
"SendNotification": {
"Type": "Task",
"Resource": "arn:aws:states:::http:invoke",
"Parameters": {
"Authentication": {
"ConnectionArn": "${aws_cloudwatch_event_connection.slack_test_webhook.arn}"
},
"RequestBody": {
"text.$": "$.notificationData.text",
"type.$": "$.notificationData.type"
},
"ApiEndpoint": "https://hooks.slack.com/triggers/11111111/2222222222/33333333333",
"Method": "POST"
},
"Next": "LastStep"
},
"LastStep": {
"Type": "Succeed"
}
}
}
EOF
}

Aca tenemos 3 states:

  • FirstStep: este estado es quien genera los datos que van a ser enviados a la notificacion, se envian por medio del objeto notificationData
  • SendNotification: este estado se encarga de la notificacion notaras que aca esta la definicion de la url, metodo, cuerpo y la refecencia a la conexion de event bridge
  • LastStep: esté estado representa un paso final

Funcionamiento de la step function:

Tras haber recorrido el proceso de configurar una notificación simple a Slack mediante un webhook utilizando AWS Step Functions, es evidente que estamos ante una poderosa combinación de herramientas que pueden revolucionar la manera en que interactuamos con los flujos de trabajo y la comunicación en equipo.

Si quieres ver el ejemplo completo para poderlo ejecutar en terraform aca te muestro el repositorio

Si te ha gustado este artículo no dudes en darle 👏 y ⭐ al repositorio.

Gracias!!

--

--