

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

# Uso de Terraform para implementar máquinas de estado en Step Functions
<a name="terraform-sfn"></a>

[Terraform](https://www.terraform.io/intro/) by HashiCorp es un marco para crear aplicaciones que utilizan la infraestructura como código (IaC). Con Terraform, puede crear máquinas de estado y utilizar características, como obtener una vista previa de las implementaciones de infraestructura y crear plantillas reutilizables. Las plantillas de Terraform le ayudan a mantener y reutilizar el código al dividirlo en partes más pequeñas.

Si está familiarizado con Terraform puede seguir el ciclo de vida de desarrollo descrito en este tema como modelo para crear e implementar máquinas de estado en Terraform. Si no está familiarizado con Terraform le recomendamos que antes de comenzar realice el taller [Introducción a Terraform en AWS](https://catalog.workshops.aws/terraform101/en-US) para familiarizarse con Terraform.

**sugerencia**  
*Para implementar un ejemplo de una máquina de estados creada con Terraform, consulte [Implementación con Terraform](https://catalog.workshops.aws/stepfunctions/iac/deploy-with-terraform) en The Workshop. AWS Step Functions *

**Topics**
+ [Requisitos previos](#terraform-sfn-prerequisites)
+ [Ciclo de vida del desarrollo con Terraform](#terraform-sfn-dev-lifecycle)
+ [Políticas y roles de IAM para la máquina de estado](#terraform-sfn-iam-policy)

## Requisitos previos
<a name="terraform-sfn-prerequisites"></a>

Antes de comenzar debe cumplir los siguientes requisitos previos:
+ Instale Terraform en su máquina. Para obtener información sobre la instalación de Terraform, consulte [Instalar Terraform](https://developer.hashicorp.com/terraform/tutorials/aws-get-started/install-cli).
+ Instale Step Functions Local en su máquina. Se recomienda instalar la imagen de Docker de Step Functions Local para utilizar Step Functions Local. Para obtener más información, consulte [Prueba de máquinas de estado con Step Functions Local (no compatible)](sfn-local.md).
+ Instale AWS SAM CLI. Para obtener información sobre la instalación, consulte [Instalación de la AWS SAM CLI](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/install-sam-cli.html) en la *Guía para AWS Serverless Application Model desarrolladores*.
+ Instálelo AWS Toolkit for Visual Studio Code para ver el diagrama de flujo de trabajo de sus máquinas de estado. Para obtener información sobre la instalación, consulte [Instalación del AWS Toolkit for Visual Studio Code](https://docs.aws.amazon.com/toolkit-for-vscode/latest/userguide/setup-toolkit.html) en la *Guía del usuario de AWS Toolkit for Visual Studio Code *.

## Ciclo de vida del desarrollo de máquinas de estado con Terraform
<a name="terraform-sfn-dev-lifecycle"></a>

El siguiente procedimiento explica cómo puede utilizar un prototipo de máquina de estado que se crea con [Workflow Studio](workflow-studio.md) en la consola de Step Functions como punto de partida para desarrollo local con Terraform y el [AWS Toolkit for Visual Studio Code](https://docs.aws.amazon.com/toolkit-for-vscode/latest/userguide/welcome.html).

Para ver el ejemplo completo que analiza el desarrollo de máquinas de estado con Terraform y presenta las mejores prácticas en detalle, consulte [Best practices for writing Step Functions Terraform projects](https://aws.amazon.com/blogs/devops/best-practices-for-writing-step-functions-terraform-projects/).

**Para iniciar el ciclo de vida de desarrollo de una máquina de estado con Terraform**

1. Inicie un nuevo proyecto de Terraform con el siguiente comando.

   ```
   terraform init
   ```

1. Abra la [consola de Step Functions](https://console.aws.amazon.com/states/home?region=us-east-1#/) para crear un prototipo para la máquina de estado.

1. En Workflow Studio, haga lo siguiente:

   1. Cree el prototipo del flujo de trabajo.

   1. Exporte la definición de [Amazon States Language (ASL)](concepts-amazon-states-language.md) del flujo de trabajo. Para ello, seleccione la lista desplegable **Importar/Exportar** y, a continuación, seleccione **Exportar definición de JSON**.

1. Guarde la definición de ASL exportada en el directorio del proyecto.

   La definición de ASL exportada se transfiere como parámetro de entrada al recurso de Terraform de [https://registry.terraform.io/modules/terraform-aws-modules/step-functions/aws/latest](https://registry.terraform.io/modules/terraform-aws-modules/step-functions/aws/latest) que utiliza la función [https://developer.hashicorp.com/terraform/language/functions/templatefile](https://developer.hashicorp.com/terraform/language/functions/templatefile). Esta función se utiliza en el campo de definición que transmite la definición de ASL exportada y cualquier sustitución de variables.
**sugerencia**  
Como el archivo de definición de ASL puede contener bloques de texto largos, le recomendamos que evite el método EOF insertado. De este modo resulta más sencillo sustituir los parámetros en la definición de la máquina de estado.

1. (Opcional) Actualice la definición de ASL en su IDE y visualice los cambios mediante AWS Toolkit for Visual Studio Code.  
![\[Captura de pantalla de la definición de ASL de un flujo de trabajo en Visual Studio Code y su representación visual.\]](http://docs.aws.amazon.com/es_es/step-functions/latest/dg/images/visualize-sm-terraform-iac.png)

   Para evitar exportar continuamente la definición y refactorizarla en el proyecto, le recomendamos que realice las actualizaciones localmente en su IDE y que haga un seguimiento de estas actualizaciones con [Git](https://git-scm.com/). 

1. Pruebe el flujo de trabajo utilizando [Step Functions Local](sfn-local.md).
**sugerencia**  
También puede probar localmente las integraciones de servicios con las funciones de Lambda y API APIs Gateway en su máquina de estado mediante [AWS SAM CLI](sfn-local-lambda.md) Local.

1. Obtenga una vista previa de la máquina de estados y otros AWS recursos antes de implementar la máquina de estados. Para ello, ejecute el siguiente comando.

   ```
   terraform plan
   ```

1. Implemente la máquina de estado desde su entorno local o mediante [canalizaciones de CI/CD](https://aws.amazon.com/blogs/developer/build-infrastructure-ci-for-terraform-code-leveraging-aws-developer-tools-and-terratest/) utilizando el siguiente comando.

   ```
   terraform apply
   ```

1. (Opcional) Limpie los recursos y elimine la máquina de estado con el siguiente comando.

   ```
   terraform destroy
   ```

## Políticas y roles de IAM para la máquina de estado
<a name="terraform-sfn-iam-policy"></a>

Utilice las [políticas de integración de servicios de Terraform](https://registry.terraform.io/modules/terraform-aws-modules/step-functions/aws/latest#service-integration-policies) para añadir los permisos de IAM necesarios a la máquina de estado, por ejemplo, permiso para invocar funciones de Lambda. También puede definir roles y políticas explícitos y asociarlos a la máquina de estado.

El siguiente ejemplo de política de IAM concede acceso a la máquina de estado para invocar una función de Lambda llamada `myFunction`.

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "lambda:InvokeFunction"
      ],
      "Resource": "arn:aws:lambda:us-east-1:123456789012:function:myFunction"
    }
  ]
}
```

También recomendamos utilizar el origen de datos [https://registry.terraform.io/providers/hashicorp/aws/latest/docs/data-sources/iam_policy_document](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/data-sources/iam_policy_document) al definir las políticas de IAM para máquinas de estado en Terraform. Le ayudará a comprobar si su política está mal estructurada y a sustituir los recursos por variables.

El siguiente ejemplo de política de IAM utiliza el origen de datos `aws_iam_policy_document` y concede acceso a la máquina de estado para invocar una función de Lambda llamada `myFunction`.

```
data "aws_iam_policy_document" "state_machine_role_policy" {
  
  statement {
    effect = "Allow"

    actions = [
      "lambda:InvokeFunction"
    ]

    resources = ["${aws_lambda_function.function-1.arn}:*"]
  }
  
}
```

**sugerencia**  
Para ver patrones AWS arquitectónicos más avanzados implementados con Terraform, consulte los [ejemplos de Terraform en Serverless Land](https://serverlessland.com/workflows?framework=Terraform) Workflows Collection.