

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# Terraform을 사용하여 Step Functions에 상태 시스템 배포
<a name="terraform-sfn"></a>

HashiCorp의 [Terraform](https://www.terraform.io/intro/)은 코드형 인프라(IaC)를 사용하여 애플리케이션을 빌드하기 위한 프레임워크입니다. Terraform을 사용하면 상태 머신을 만들고 인프라 배포 미리 보기 및 재사용 가능한 템플릿 만들기와 같은 기능을 사용할 수 있습니다. Terraform 템플릿을 사용하면 코드를 더 작은 청크로 나눠 유지하고 재사용할 수 있습니다.

Terraform에 익숙하면 Terraform에서 상태 머신을 만들고 배포하기 위한 모델로 이 주제에 설명된 개발 수명 주기를 따를 수 있습니다. Terraform에 익숙하지 않으면 Terraform에 익숙해질 수 있도록 먼저 [AWS용 Terraform 소개](https://catalog.workshops.aws/terraform101/en-US) 워크숍을 완료하는 것이 좋습니다.

**작은 정보**  
Terraform을 사용하여 빌드된 상태 시스템의 예를 배포하려면 * AWS Step Functions 워크숍*의 [Terraform으로 배포](https://catalog.workshops.aws/stepfunctions/iac/deploy-with-terraform)를 참조하세요.

**Topics**
+ [사전 조건](#terraform-sfn-prerequisites)
+ [Terraform을 사용한 개발 수명 주기](#terraform-sfn-dev-lifecycle)
+ [상태 머신에 대한 IAM 역할 및 정책](#terraform-sfn-iam-policy)

## 사전 조건
<a name="terraform-sfn-prerequisites"></a>

시작하기 전에 다음 사전 조건을 완료해야 합니다.
+ 시스템에 Terraform을 설치합니다. Terraform 설치 방법은 [Terraform 설치](https://developer.hashicorp.com/terraform/tutorials/aws-get-started/install-cli)를 참조하세요.
+ 시스템에 Step Functions Local을 설치합니다. Step Functions Local을 사용하려면 Step Functions Local 도커 이미지를 설치하는 것이 좋습니다. 자세한 내용은 [Step Functions Local을 사용하여 상태 머신 테스트(지원되지 않음)](sfn-local.md) 단원을 참조하십시오.
+  AWS SAM CLI를 설치합니다. 설치 정보는 *AWS Serverless Application Model 개발자 안내서*[의 AWS SAM CLI 설치를](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/install-sam-cli.html) 참조하세요.
+ 상태 시스템의 워크플로 다이어그램 AWS Toolkit for Visual Studio Code 을 보려면를 설치합니다. 설치 정보는 *AWS Toolkit for Visual Studio Code 사용 설명서*의 [AWS Toolkit for Visual Studio Code설치](https://docs.aws.amazon.com/toolkit-for-vscode/latest/userguide/setup-toolkit.html)를 참조하세요.

## Terraform을 사용한 상태 머신 개발 수명 주기
<a name="terraform-sfn-dev-lifecycle"></a>

다음 절차에서는 Step Functions 콘솔의 [Workflow Studio](workflow-studio.md)를 사용하여 빌드한 상태 머신 프로토타입을 Terraform 및 [AWS Toolkit for Visual Studio Code](https://docs.aws.amazon.com/toolkit-for-vscode/latest/userguide/welcome.html)를 사용한 로컬 개발의 시작점으로 사용하는 방법을 설명합니다.

Terraform을 사용한 상태 머신 개발을 설명하고 모범 사례를 자세히 보여주는 전체 예제를 보려면 [Step Functions Terraform 프로젝트 작성 모범 사례](https://aws.amazon.com/blogs/devops/best-practices-for-writing-step-functions-terraform-projects/)를 참조하세요.

**Terraform을 사용하여 상태 머신 개발 수명 주기 시작하기**

1. 다음 명령을 사용하여 새 Terraform 프로젝트를 부트스트랩합니다.

   ```
   terraform init
   ```

1. [Step Functions 콘솔](https://console.aws.amazon.com/states/home?region=us-east-1#/)을 열어 상태 머신의 프로토타입을 만듭니다.

1. Workflow Studio에서 다음을 수행합니다.

   1. 워크플로 프로토타입을 만듭니다.

   1. 워크플로의 [Amazon States Language(ASL)](concepts-amazon-states-language.md) 정의를 내보냅니다. 이렇게 하려면 **Import/Export** 드롭다운 목록을 선택한 다음 **JSON 정의 내보내기**를 선택합니다.

1. 내보낸 ASL 정의를 프로젝트 디렉토리에 저장합니다.

   내보낸 ASL 정의를 입력 파라미터로 [https://developer.hashicorp.com/terraform/language/functions/templatefile](https://developer.hashicorp.com/terraform/language/functions/templatefile) 함수를 사용하는 [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 리소스에 전달합니다. 이 함수는 내보낸 ASL 정의와 모든 변수 대체를 전달하는 정의 필드 내에서 사용됩니다.
**작은 정보**  
ASL 정의 파일에는 긴 텍스트 블록이 포함될 수 있으므로 인라인 EOF 메서드를 사용하지 않는 것이 좋습니다. 이렇게 하면 파라미터를 쉽게 상태 머신 정의로 대체할 수 있습니다.

1. (선택 사항) IDE 내에서 ASL 정의를 업데이트하고 AWS Toolkit for Visual Studio Code를 사용하여 변경 사항을 시각화합니다.  
![\[Visual Studio Code의 워크플로에 대한 ASL 정의 및 시각적 표현의 스크린샷입니다.\]](http://docs.aws.amazon.com/ko_kr/step-functions/latest/dg/images/visualize-sm-terraform-iac.png)

   정의를 계속 내보내고 프로젝트로 리팩터링하지 않으려면 IDE에서 로컬로 업데이트하고 [Git](https://git-scm.com/)을 사용하여 업데이트를 추적하는 것이 좋습니다.

1. [Step Functions Local](sfn-local.md)을 사용하여 워크플로를 테스트합니다.
**작은 정보**  
또한 [AWS SAM CLI Local](sfn-local-lambda.md)을 사용하여 상태 머신의 Lambda 함수 및 API Gateway API와의 서비스 통합을 로컬에서 테스트할 수 있습니다.

1. 상태 시스템을 배포하기 전에 상태 시스템 및 기타 AWS 리소스를 미리 봅니다. 다음 명령으로 실행하세요.

   ```
   terraform plan
   ```

1. 다음 명령어를 사용하여 로컬 환경에서 또는 [CI/CD 파이프라인](https://aws.amazon.com/blogs/developer/build-infrastructure-ci-for-terraform-code-leveraging-aws-developer-tools-and-terratest/)을 통해 상태 머신을 배포합니다.

   ```
   terraform apply
   ```

1. (선택 사항) 다음 명령을 사용하여 리소스를 정리하고 상태 머신을 삭제합니다.

   ```
   terraform destroy
   ```

## 상태 머신에 대한 IAM 역할 및 정책
<a name="terraform-sfn-iam-policy"></a>

[Terraform 서비스 통합 정책](https://registry.terraform.io/modules/terraform-aws-modules/step-functions/aws/latest#service-integration-policies)을 사용하여 상태 머신에 필요한 IAM 권한(예: Lambda 함수를 간접적으로 호출할 수 있는 권한)을 추가할 수 있습니다. 또한 명시적 역할과 정책을 정의하고 상태 머신에 연결할 수 있습니다.

다음 IAM 정책 예제에서는 `myFunction` Lambda 함수를 간접적으로 호출할 수 있는 액세스 권한을 상태 머신에 부여합니다.

****  

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

또한 Terraform에서 상태 머신에 대한 IAM 정책을 정의할 때 [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) 데이터 소스를 사용하는 것이 좋습니다. 이렇게 하면 정책이 잘못되었는지 확인하고 리소스를 변수로 대체할 수 있습니다.

다음 IAM 정책 예제에서는 `aws_iam_policy_document` 데이터 소스를 사용하고 상태 머신에 이라는 `myFunction` Lambda 함수를 간접적으로 호출할 수 있는 액세스 권한을 부여합니다.

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

    actions = [
      "lambda:InvokeFunction"
    ]

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

**작은 정보**  
Terraform과 함께 배포된 고급 AWS 아키텍처 패턴을 보려면 [Serverless Land Workflows Collection의 Terraform 예제를 참조하세요](https://serverlessland.com/workflows?framework=Terraform).