

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

# Usar o Terraform para implantar máquinas de estado no Step Functions
<a name="terraform-sfn"></a>

[O Terraform](https://www.terraform.io/intro/) by HashiCorp é uma estrutura para criar aplicativos usando infraestrutura como código (IaC). Com o Terraform, você pode criar máquinas de estado e usar recursos, como visualizar implantações de infraestrutura e criar modelos reutilizáveis. Os modelos do Terraform ajudam você a manter e reutilizar o código dividindo-o em partes menores.

Se você estiver familiarizado com o Terraform, poderá seguir o ciclo de vida de desenvolvimento descrito neste tópico como um modelo para criar e implantar suas máquinas de estado no Terraform. Se não estiver familiarizado com o Terraform, recomendamos que primeiro conclua o workshop [Introdução ao Terraform em AWS](https://catalog.workshops.aws/terraform101/en-US) para se familiarizar com o Terraform.

**dica**  
Para implantar um exemplo de uma máquina de estado criada usando o Terraform, consulte [Implantar com o Terraform](https://catalog.workshops.aws/stepfunctions/iac/deploy-with-terraform) no *The AWS Step Functions * Workshop.

**Topics**
+ [Pré-requisitos](#terraform-sfn-prerequisites)
+ [Ciclo de vida de desenvolvimento com o Terraform](#terraform-sfn-dev-lifecycle)
+ [Perfis e políticas do IAM para sua máquina de estado](#terraform-sfn-iam-policy)

## Pré-requisitos
<a name="terraform-sfn-prerequisites"></a>

Antes de começar, conclua os seguintes pré-requisitos:
+ Instale o Terraform na máquina. Para obter informações sobre a instalação do Terraform, consulte [Instalar o Terraform](https://developer.hashicorp.com/terraform/tutorials/aws-get-started/install-cli).
+ Instale o Step Functions Local em sua máquina. Recomendamos que você instale a imagem do Docker do Step Functions Local para poder usar o Step Functions Local. Para obter mais informações, consulte [Testar máquinas de estado com Step Functions Local (sem suporte)](sfn-local.md).
+ Instale a AWS SAM CLI. Para obter informações sobre a instalação, consulte [Instalação da AWS SAM CLI](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/install-sam-cli.html) no Guia do *AWS Serverless Application Model desenvolvedor*.
+ Instale o AWS Toolkit for Visual Studio Code para visualizar o diagrama do fluxo de trabalho de suas máquinas de estado. Para informações sobre instalação, consulte [Instalação do AWS Toolkit for Visual Studio Code](https://docs.aws.amazon.com/toolkit-for-vscode/latest/userguide/setup-toolkit.html) no *Guia do usuário da AWS Toolkit for Visual Studio Code *.

## Ciclo de vida de desenvolvimento de máquinas de estado com o Terraform
<a name="terraform-sfn-dev-lifecycle"></a>

O procedimento a seguir explica como você pode usar um protótipo de máquina de estado criado usando o [Workflow Studio](workflow-studio.md) no console Step Functions como ponto de partida para o desenvolvimento local com o Terraform e o [AWS Toolkit for Visual Studio Code](https://docs.aws.amazon.com/toolkit-for-vscode/latest/userguide/welcome.html).

Para ver o exemplo completo que discute o desenvolvimento da máquina de estado com o Terraform e apresenta as melhores práticas em detalhes, consulte [Melhores práticas para criar projetos Terraform do Step Functions](https://aws.amazon.com/blogs/devops/best-practices-for-writing-step-functions-terraform-projects/).

**Para iniciar o ciclo de vida de desenvolvimento de uma máquina de estado com o Terraform**

1. Faça bootstrap de um novo projeto do Terraform com o seguinte comando.

   ```
   terraform init
   ```

1. Abra o [console Step Functions](https://console.aws.amazon.com/states/home?region=us-east-1#/) para criar um protótipo para sua máquina de estado.

1. No Workflow Studio, faça o seguinte:

   1. Crie seu protótipo de fluxo de trabalho.

   1. Exporte a definição [Amazon States Language (ASL)](concepts-amazon-states-language.md) de seu fluxo de trabalho. Para fazer isso, escolha a lista suspensa **Importar/Exportar** e selecione **Exportar definição JSON**.

1. Salve a definição de ASL exportada no diretório do seu projeto.

   Você passa a definição de ASL exportada como um parâmetro de entrada para o recurso do [https://registry.terraform.io/modules/terraform-aws-modules/step-functions/aws/latest](https://registry.terraform.io/modules/terraform-aws-modules/step-functions/aws/latest) Terraform que usa a função [https://developer.hashicorp.com/terraform/language/functions/templatefile](https://developer.hashicorp.com/terraform/language/functions/templatefile). Essa função é usada dentro do campo de definição que passa a definição de ASL exportada e quaisquer substituições de variáveis.
**dica**  
Como o arquivo de definição ASL pode conter blocos de texto longos, recomendamos que você evite o método EOF em linha. Isso facilita a substituição de parâmetros na definição da máquina de estado.

1. (Opcional) Atualize a definição de ASL em seu IDE e visualize suas alterações usando o AWS Toolkit for Visual Studio Code.  
![Captura de tela da definição ASL de um fluxo de trabalho no Visual Studio Code e sua representação visual.](http://docs.aws.amazon.com/pt_br/step-functions/latest/dg/images/visualize-sm-terraform-iac.png)

   Para evitar exportar continuamente sua definição e refatorá-la em seu projeto, recomendamos que você faça atualizações localmente em seu IDE e acompanhe essas atualizações com o [Git](https://git-scm.com/). 

1. Teste seu fluxo de trabalho usando o [Step Functions Local](sfn-local.md).
**dica**  
Você também pode testar localmente integrações de serviços com funções Lambda e API APIs Gateway em sua máquina de estado usando a [AWS SAM CLI](sfn-local-lambda.md) Local.

1. Visualize sua máquina de estado e outros AWS recursos antes de implantá-la. Para fazer isso, execute o comando a seguir.

   ```
   terraform plan
   ```

1. Implante sua máquina de estado a partir do seu ambiente local ou por meio de [pipelines de CI/CD](https://aws.amazon.com/blogs/developer/build-infrastructure-ci-for-terraform-code-leveraging-aws-developer-tools-and-terratest/) usando o comando a seguir.

   ```
   terraform apply
   ```

1. (Opcional) Limpe seus recursos e exclua a máquina de estado usando o comando a seguir.

   ```
   terraform destroy
   ```

## Perfis e políticas do IAM para sua máquina de estado
<a name="terraform-sfn-iam-policy"></a>

Use as [políticas de integração de serviços do Terraform](https://registry.terraform.io/modules/terraform-aws-modules/step-functions/aws/latest#service-integration-policies) para adicionar as permissões necessárias do IAM à sua máquina de estado, por exemplo, permissão para invocar funções do Lambda. Você também pode definir perfis e políticas explícitas e associá-las à sua máquina de estado.

O exemplo de política do IAM a seguir concede à sua máquina de estado acesso para invocar uma função do Lambda chamada `{{myFunction}}`.

****  

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

Também recomendamos usar a fonte de dados [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) ao definir políticas do IAM para suas máquinas de estado no Terraform. Isso ajuda a verificar se sua política está malformada e a substituir quaisquer recursos por variáveis.

O exemplo de política do IAM a seguir usa a fonte de dados `aws_iam_policy_document` e concede à sua máquina de estado acesso para invocar uma função do Lambda chamada `{{myFunction}}`.

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

    actions = [
      "lambda:InvokeFunction"
    ]

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

**dica**  
Para ver padrões AWS arquitetônicos mais avançados implantados com o Terraform, consulte [exemplos do Terraform na Serverless](https://serverlessland.com/workflows?framework=Terraform) Land Workflows Collection.