

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

# Step Functions를 사용한 워크플로 개발
<a name="developing-workflows"></a>

Step Functions 콘솔 및 Workflow Studio 시각적 편집기에서 워크플로 빌드를 시작하는 것이 좋습니다. 빈 캔버스에서 시작하거나 일반적인 시나리오에 대해 스타터 템플릿을 선택할 수 있습니다.

워크플로를 빌드하려면 다음 작업이 필요합니다.
+ 워크플로 정의
+ 워크플로 실행 및 디버깅
+ 워크플로 배포

Amazon States Language에서 상태 머신을 정의할 수 있습니다. Amazon States Language 정의를 수동으로 생성할 수 있지만 Workflow Studio는 자습서에 소개됩니다. Workflow Studio를 사용하면 Step Functions 콘솔 내에서 시스템 정의, 단계 시각화 및 편집, 워크플로 실행 및 디버깅, 결과 확인을 모두 수행할 수 있습니다.

**Visual Studio Code에서 Workflow Studio 작업**  
 AWS 도구 키트를 사용하면 VS Code 내에서 Workflow Studio를 사용하여 상태 시스템의 개별 상태를 시각화, 빌드 및 테스트할 수 있습니다. 상태 입력을 제공하고 변수를 설정하고 테스트를 시작하면 데이터가 어떻게 트랜스포밍되는지 확인할 수 있습니다. 워크플로를 조정하고 다시 테스트할 수 있습니다. 완료되면 변경 사항을 적용하여 상태 머신을 업데이트할 수 있습니다. 자세한 내용을 알아보려면 AWS Toolkit for Visual Studio Code에서 [Workflow Studio 작업](https://docs.aws.amazon.com/toolkit-for-vscode/latest/userguide/stepfunctions-workflowstudio.html)을 참조하세요.

 AWS Command Line Interface ()에서 많은 Step Functions 기능을 사용할 수도 있습니다AWS CLI. 예를 들어 상태 머신을 만든 후 기존 상태 머신을 나열할 수 있습니다. 에서 Step Functions 명령을 사용하여 실행 AWS CLI 을 시작 및 관리하고, 활동을 폴링하고, 작업 하트비트를 기록하는 등의 작업을 수행할 수 있습니다. 전체 Step Functions 명령 목록, 사용 가능한 인수 설명 및 사용법을 보여주는 예제는 *AWS CLI 명령 참조*를 확인하세요. [AWS CLI 명령 참조](https://docs.aws.amazon.com/cli/latest/reference/)

AWS CLI 명령은 Amazon States Language를 면밀히 따르므로 AWS CLI 를 사용하여 Step Functions API 작업에 대해 알아볼 수 있습니다. 기존 API 지식을 사용하여 코드 프로토타입을 제작하거나 명령줄에서 Step Functions 작업을 수행할 수도 있습니다.

**상태 머신 정의 검증**  
API를 사용하여 상태 머신을 **검증**하고 워크플로를 생성하기 전에 잠재적 문제를 찾을 수 있습니다.  
워크플로 검증에 대한 자세한 내용은 Step Functions API 참조의 [ValidateStateMachineDefinition](https://docs.aws.amazon.com/step-functions/latest/apireference/API_ValidateStateMachineDefinition.html)을 참조하세요.

최소한의 설정을 시작하려면 Lambda 함수를 직접 호출하는 단일 단계로 워크플로를 정의한 다음 워크플로를 실행하고 결과를 확인하는 방법을 보여주는 [Lambda 상태 머신 만들기](tutorial-creating-lambda-state-machine.md) 자습서를 따르세요.

## 워크플로 정의
<a name="development-define"></a>

워크플로 개발의 첫 번째 단계는 Amazon States Language에서 단계를 정의하는 것입니다. 기본 설정 및 도구에 따라 Step Functions 상태 머신을 JSON, YAML 또는 문자열화된 Amazon States Language(ASL) 정의로 정의할 수 있습니다.

다음 표에서는 도구에서 지원되는 ASL 기반 정의 형식을 보여줍니다.


| AWS 도구 | 지원되는 형식 | 
| --- | --- | 
| Step Functions 콘솔 | JSON | 
| HTTPS 서비스 API | 문자열화된 ASL | 
| AWS CLI | 문자열화된 ASL | 
| Step Functions Local | 문자열화된 ASL | 
| AWS Toolkit for Visual Studio Code | JSON, YAML | 
| AWS SAM | JSON, YAML | 
| CloudFormation | JSON, YAML, 문자열화된 ASL | 

템플릿의 상태 머신 정의에서 YAML 한 줄 주석은 생성된 리소스 정의로 전달되지 않습니다. 주석을 유지해야 하는 경우 상태 머신 정의 내에서 `Comment` 속성을 사용해야 합니다. 자세한 내용은 [상태 머신 구조](statemachine-structure.md) 단원을 참조하세요.

 CloudFormation 및 AWS SAM를 사용하면 상태 시스템 정의를 Amazon S3(JSON 또는 YAML 형식)에 업로드하고 템플릿에 정의의 Amazon S3 위치를 제공할 수 있습니다. 자세한 내용은 [AWS::StepFunctions::StateMachine S3Location](https://docs.aws.amazon.com//AWSCloudFormation/latest/UserGuide/aws-properties-stepfunctions-statemachine-s3location.html) 페이지를 참조하세요.

다음 예제 CloudFormation 템플릿은 다양한 입력 형식을 사용하여 동일한 상태 시스템 정의를 제공하는 방법을 보여줍니다.

------
#### [ JSON with Definition ]

```
{
  "AWSTemplateFormatVersion": "2010-09-09",
  "Description": "AWS Step Functions sample template.",
  "Resources": {
    "MyStateMachine": {
      "Type": "AWS::StepFunctions::StateMachine",
      "Properties": {
        "RoleArn": {
          "Fn::GetAtt": [ "StateMachineRole", "Arn" ]
        },
        "TracingConfiguration": {
          "Enabled": true
        },
        "Definition": {
          "StartAt": "HelloWorld",
          "States": {
            "HelloWorld": {
              "Type": "Pass",
              "End": true
            }
          }
        }
      }
    },
    "StateMachineRole": {
      "Type": "AWS::IAM::Role",
      "Properties": {
        "AssumeRolePolicyDocument": {
          "Version": "2012-10-17",		 	 	 
          "Statement": [
            {
              "Action": [
                "sts:AssumeRole"
              ],
              "Effect": "Allow",
              "Principal": {
                "Service": [
                  "states.amazonaws.com"
                ]
              }
            }
          ]
        },
        "ManagedPolicyArns": [],
        "Policies": [
          {
            "PolicyName": "StateMachineRolePolicy",
            "PolicyDocument": {
              "Statement": [
                {
                  "Action": [
                    "lambda:InvokeFunction"
                  ],
                  "Resource": "*",
                  "Effect": "Allow"
                }
              ]
            }
          }
        ]
      }
    }
  },
  "Outputs": {
    "StateMachineArn": {
      "Value": {
        "Ref": "MyStateMachine"
      }
    }
  }
}
```

------
#### [ JSON with DefinitionString ]

```
{
  "AWSTemplateFormatVersion": "2010-09-09",
  "Description": "AWS Step Functions sample template.",
  "Resources": {
    "MyStateMachine": {
      "Type": "AWS::StepFunctions::StateMachine",
      "Properties": {
        "RoleArn": {
          "Fn::GetAtt": [ "StateMachineRole", "Arn" ]
        },
        "TracingConfiguration": {
          "Enabled": true
        },
        "DefinitionString": "{\n  \"StartAt\": \"HelloWorld\",\n  \"States\": {\n    \"HelloWorld\": {\n      \"Type\": \"Pass\",\n      \"End\": true\n    }\n  }\n}"
      }
    },
    "StateMachineRole": {
      "Type": "AWS::IAM::Role",
      "Properties": {
        "AssumeRolePolicyDocument": {
          "Version": "2012-10-17",		 	 	 
          "Statement": [
            {
              "Action": [
                "sts:AssumeRole"
              ],
              "Effect": "Allow",
              "Principal": {
                "Service": [
                  "states.amazonaws.com"
                ]
              }
            }
          ]
        },
        "ManagedPolicyArns": [],
        "Policies": [
          {
            "PolicyName": "StateMachineRolePolicy",
            "PolicyDocument": {
              "Statement": [
                {
                  "Action": [
                    "lambda:InvokeFunction"
                  ],
                  "Resource": "*",
                  "Effect": "Allow"
                }
              ]
            }
          }
        ]
      }
    }
  },
  "Outputs": {
    "StateMachineArn": {
      "Value": {
        "Ref": "MyStateMachine"
      }
    }
  }
}
```

------
#### [ YAML with Definition ]

```
AWSTemplateFormatVersion: 2010-09-09
Description: AWS Step Functions sample template.
Resources:
  MyStateMachine:
    Type: 'AWS::StepFunctions::StateMachine'
    Properties:
      RoleArn: !GetAtt
        - StateMachineRole
        - Arn
      TracingConfiguration:
        Enabled: true
      Definition:
        # This is a YAML comment. This will not be preserved in the state machine resource's definition.
        Comment: This is an ASL comment. This will be preserved in the state machine resource's definition.
        StartAt: HelloWorld
        States:
          HelloWorld:
            Type: Pass
            End: true
  StateMachineRole:
    Type: 'AWS::IAM::Role'
    Properties:
      AssumeRolePolicyDocument:
        Version: 2012-10-17
        Statement:
          - Action:
              - 'sts:AssumeRole'
            Effect: Allow
            Principal:
              Service:
                - states.amazonaws.com
      ManagedPolicyArns: []
      Policies:
        - PolicyName: StateMachineRolePolicy
          PolicyDocument:
            Statement:
              - Action:
                  - 'lambda:InvokeFunction'
                Resource: "*"
                Effect: Allow

Outputs:
  StateMachineArn:
    Value:
      Ref: MyStateMachine
```

------
#### [ YAML with DefinitionString ]

```
AWSTemplateFormatVersion: 2010-09-09
Description: AWS Step Functions sample template.
Resources:
  MyStateMachine:
    Type: 'AWS::StepFunctions::StateMachine'
    Properties:
      RoleArn: !GetAtt
        - StateMachineRole
        - Arn
      TracingConfiguration:
        Enabled: true
      DefinitionString: |
        {
            "StartAt": "HelloWorld",
            "States": {
                "HelloWorld": {
                    "Type": "Pass",
                    "End": true
                }
            }
        }
  StateMachineRole:
    Type: 'AWS::IAM::Role'
    Properties:
      AssumeRolePolicyDocument:
        Version: 2012-10-17
        Statement:
          - Action:
              - 'sts:AssumeRole'
            Effect: Allow
            Principal:
              Service:
                - states.amazonaws.com
      ManagedPolicyArns: []
      Policies:
        - PolicyName: StateMachineRolePolicy
          PolicyDocument:
            Statement:
              - Action:
                  - 'lambda:InvokeFunction'
                Resource: "*"
                Effect: Allow

Outputs:
  StateMachineArn:
    Value:
      Ref: MyStateMachinele
```

------

**AWS SDKs 사용하여 워크플로 개발**  
Step Functions는 Java, .NET, Ruby, PHP, Python(Boto 3), JavaScript, Go 및 C\$1\$1용 AWS SDKs에서 지원됩니다. 이러한 SDK는 여러 프로그래밍 언어에서 Step Functions HTTPS API 작업을 사용할 수 있는 편리한 방법을 제공합니다. 이러한 SDK 라이브러리에 제공된 API 작업을 사용하여 상태 머신, 활동 또는 상태 머신 시작자를 개발할 수 있습니다. 이러한 라이브러리를 사용하여 가시성 작업에 액세스하여 고유한 Step Functions 모니터링 및 보고 도구를 개발할 수도 있습니다. 현재 AWS SDK용 참조 문서 및 [Amazon Web Services용 도구](https://aws.amazon.com/tools/)를 참조하세요.

**HTTPS 요청을 통한 워크플로 개발**  
Step Functions는 HTTPS 요청을 통해 액세스할 수 있는 서비스 작업을 제공합니다. 이러한 작업을 사용하여 자체 라이브러리에서 Step Functions와 직접 통신할 수 있습니다. 서비스 API 작업을 사용하여 상태 머신, 작업자 또는 상태 머신 시작자를 개발할 수 있습니다. API 작업을 통해 가시성 작업에 액세스함으로써 사용자 고유의 모니터링 및 보고 도구를 개발할 수도 있습니다. 자세한 내용은 [AWS Step Functions API 참조](https://docs.aws.amazon.com/step-functions/latest/apireference/)를 참조하세요.

**AWS Step Functions Data Science SDK를 사용하여 워크플로 개발**  
데이터 과학자들은 SageMaker AI 및 Step Functions를 사용하여 기계 학습 모델을 처리하고 게시하는 워크플로를 만들 수 있습니다. AWS 인프라를 대규모로 오케스트레이션하는 다단계 기계 학습 워크플로를 Python에서 만들 수도 있습니다. AWS Step Functions Data Science SDK는 Step Functions 워크플로를 생성하고 호출할 수 있는 Python API를 제공합니다. Python과 Jupyter Notebook에서 이러한 워크플로를 직접 관리하고 실행할 수 있습니다. 자세한 내용은 [Github의AWS Step Functions 데이터 과학 프로젝트](https://github.com/aws/aws-step-functions-data-science-sdk-python), [데이터 과학 SDK 설명서](https://aws-step-functions-data-science-sdk.readthedocs.io/), [Jupyter Notebook 예제](https://docs.aws.amazon.com/sagemaker/latest/dg/howitworks-nbexamples.html) 및 [GitHub의 SageMaker AI 예제](https://github.com/awslabs/amazon-sagemaker-examples/tree/master/step-functions-data-science-sdk)를 참조하세요.

## 워크플로 실행 및 디버깅
<a name="development-run-debug"></a>

콘솔, API 직접 호출(예: Lambda 함수), Amazon EventBridge 및 EventBridge Scheduler, 다른 Step Functions 상태 머신에서 워크플로를 여러 가지 방법으로 시작할 수 있습니다. 워크플로를 실행하면 타사 서비스에 연결하고, AWS SDKs 사용하고, 실행 중에 데이터를 조작할 수 있습니다. 실행 단계와 상태 머신을 통해 흐르는 데이터를 실행하고 디버깅할 수 있는 다양한 도구가 있습니다. 다음 섹션에서는 워크플로를 실행하고 디버깅하기 위한 추가 리소스를 제공합니다.

상태 머신 실행을 시작하는 방법에 대한 자세한 내용은 [Step Functions에서 상태 머신 실행 시작](statemachine-starting.md) 섹션을 참조하세요.

**워크플로를 실행할 엔드포인트 선택**  
지연 시간을 줄이고 요구 사항을 충족하는 위치에 데이터를 저장하기 위해 Step Functions는 다양한 AWS 리전의 엔드포인트를 제공합니다. Step Functions의 각 엔드포인트는 완전히 독립적입니다. 즉, 상태 머신이나 활동이 생성된 리전 내에서만 존재합니다. 한 리전에서 생성한 상태 머신 및 활동은 다른 리전에서 생성한 상태 머신 및 활동과 데이터나 속성을 공유하지 않습니다. 예를 들어 서로 다른 두 리전에 `STATES-Flows-1` 상태 머신을 등록할 수 있습니다. 한 리전의 `STATES-Flows-1` 상태 머신은 데이터나 속성을 다른 리전의 `STATES-Flow-1` 상태 머신과 공유하지 않습니다. Step Functions 엔드포인트 목록은 *AWS 일반 참조*의 [AWS Step Functions 리전 및 엔드포인트](https://docs.aws.amazon.com/general/latest/gr/step-functions.html)를 참조하세요.

**VS Code를 사용한 개발**  
 AWS 도구 키트를 사용하면 VS Code 내에서 Workflow Studio를 사용하여 상태 시스템의 개별 상태를 시각화, 빌드 및 테스트할 수 있습니다. SAM 및 CloudFormation 정의 대체를 사용할 수도 있습니다. 상태 입력을 제공하고 변수를 설정하고 테스트를 시작하면 데이터가 어떻게 트랜스포밍되는지 확인할 수 있습니다. 상태 정의 탭에서 워크플로를 조정하고 다시 테스트할 수 있습니다. 완료되면 변경 사항을 적용하여 상태 머신을 업데이트할 수 있습니다. 자세한 내용은 AWS Toolkit for Visual Studio Code의 [Step Functions 작업](https://docs.aws.amazon.com/toolkit-for-vscode/latest/userguide/bulding-stepfunctions.html) 및 [Workflow Studio 작업](https://docs.aws.amazon.com/toolkit-for-vscode/latest/userguide/stepfunctions-workflowstudio.html)을 참조하세요.

## 워크플로 배포
<a name="development-deploy"></a>

워크플로를 정의하고 디버깅한 후에는 인프라를 코드 프레임워크로 사용하여 배포해야 할 수 있습니다. AWS Serverless Application Model, CloudFormation AWS CDK및 Terraform을 비롯한 다양한 IaC 옵션을 사용하여 상태 시스템을 배포하도록 선택할 수 있습니다.

**AWS Serverless Application Model**  
Step Functions와 AWS Serverless Application Model 함께를 사용하여 워크플로를 구축하고 Lambda 함수, APIs 및 이벤트를 포함하여 필요한 인프라를 배포하여 서버리스 애플리케이션을 생성할 수 있습니다. 통합 경험의 AWS Toolkit for Visual Studio Code 일부로 AWS SAM CLI를와 함께 사용할 수도 있습니다.  
자세한 내용은 [AWS SAM 를 사용하여 Step Functions 워크플로 빌드](concepts-sam-sfn.md) 단원을 참조하십시오.

**CloudFormation**  
 CloudFormation 템플릿에서 직접 상태 시스템 정의를 사용할 수 있습니다.  
자세한 내용은 [CloudFormation 를 사용하여 Step Functions에서 워크플로 생성](tutorial-lambda-state-machine-cloudformation.md) 단원을 참조하십시오.

**AWS CDK**  
를 사용하여 Standard 및 Express 상태 시스템을 빌드할 수 있습니다 AWS CDK.  
표준 워크플로를 빌드하려면 [CDK를 사용하여 표준 워크플로 생성](tutorial-lambda-state-machine-cdk.md) 섹션을 참조하세요.  
Express 워크플로를 빌드하려면 [CDK를 사용하여 Express 워크플로 생성](tutorial-step-functions-rest-api-integration-cdk.md) 섹션을 참조하세요.

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

# Step Functions Workflow Studio에서 워크플로 개발
<a name="workflow-studio"></a>

 AWS Step Functions 콘솔에서 워크플로를 편집할 때 Workflow Studio라는 시각적 도구를 사용합니다. 에 Workflow Studio를 사용하면 상태를 캔버스로 끌어서 놓아 워크플로를 구축할 수 있습니다. 상태를 시각적으로 추가 및 편집하고, 상태를 구성하고, 입력 및 출력 필터를 설정하고, 결과를 트랜스포밍하고, 오류 처리를 설정할 수 있습니다.

워크플로의 상태를 수정하면 Workflow Studio가 상태 머신 정의를 검증하고 자동 생성합니다. 기본 제공 코드 편집기를 사용하여 생성된 코드를 검토하고, 구성을 편집하고, 텍스트 정의를 수정할 수도 있습니다. 작업을 마치면 워크플로를 저장하고 실행한 다음 결과를 검사할 수 있습니다.

워크플로를 만들거나 편집할 때 Step Functions 콘솔에서 Workflow Studio에 액세스할 수 있습니다.

시각적 디자이너인 AWS Infrastructure Composer **내에서** Workflow Studio를 사용하여 AWS Serverless Application Model 및 AWS CloudFormation를 사용하여 인프라를 코드로 생성할 수도 있습니다. 이 접근 방식의 이점을 알아보려면 [Infrastructure Composer에서 Workflow Studio 사용](use-wfs-in-app-composer.md) 섹션을 참조하세요.

Workflow Studio에는 **설계**, **코드**, **구성**이라는 세 가지 모드가 있습니다. *디자인 모드*에서는 상태를 캔버스로 끌어서 놓을 수 있습니다. *코드 모드*는 콘솔 내에서 워크플로 정의를 편집할 수 있는 기본 제공 코드 편집기를 제공합니다. *구성 모드*에서는 워크플로 구성을 관리할 수 있습니다.

**Visual Studio Code에서 Workflow Studio 작업**  
 AWS 도구 키트를 사용하면 VS Code 내에서 Workflow Studio를 사용하여 상태 시스템의 개별 상태를 시각화, 빌드 및 테스트할 수 있습니다. 상태 입력을 제공하고 변수를 설정하고 테스트를 시작하면 데이터가 어떻게 트랜스포밍되는지 확인할 수 있습니다. 워크플로를 조정하고 다시 테스트할 수 있습니다. 완료되면 변경 사항을 적용하여 상태 머신을 업데이트할 수 있습니다. 자세한 내용을 알아보려면 AWS Toolkit for Visual Studio Code에서 [Workflow Studio 작업](https://docs.aws.amazon.com/toolkit-for-vscode/latest/userguide/stepfunctions-workflowstudio.html)을 참조하세요.

## 디자인 모드
<a name="wfs-interface-design-mode"></a>

디자인 모드는 프로토타입을 빌드할 때 워크플로를 시각화하는 그래픽 인터페이스를 제공합니다. 다음 이미지는 Workflow Studio의 **디자인** 모드에 있는 상태 브라우저, 워크플로 캔버스, 검사기 및 컨텍스트 도움말 패널을 보여줍니다.

![\[상태 브라우저, 워크플로 캔버스, 검사기 및 도움말 패널을 보여주는 디자인 모드 스크린샷.\]](http://docs.aws.amazon.com/ko_kr/step-functions/latest/dg/images/wfs_main_01.png)


1. 모드 버튼은 세 가지 모드 간에 전환됩니다. ASL 워크플로 정의가 유효하지 않으면 모드를 전환할 수 없습니다.

1. [상태 브라우저](#workflow-studio-components-states)에는 다음과 같은 탭 3개가 포함됩니다.
   + **작업** 탭은 캔버스의 워크플로 그래프로 끌어서 놓을 수 있는 AWS APIs 목록을 제공합니다. 각 작업은 [Task 워크플로 상태](state-task.md) 상태를 나타냅니다.
   + **흐름** 탭은 캔버스의 워크플로 그래프로 끌어서 놓을 수 있는 흐름 상태 목록을 제공합니다.
   + **패턴** 탭은 다양한 사용 사례에 사용할 수 있는 즉시 사용 가능하고 재사용 가능한 구성 요소 여러 개를 제공합니다. 예를 들어 이러한 패턴을 사용하여 Amazon S3 버킷의 데이터를 반복 처리할 수 있습니다.

1. [캔버스 및 워크플로 그래프](#workflow-studio-components-grapheditor)에서 상태를 끌어 워크플로 그래프에 놓고 상태 순서를 변경하고 구성하거나 볼 상태를 선택할 수 있습니다.

1. 이 [Inspector 패널](#workflow-studio-components-formdefinition) 패널에서 캔버스에서 선택한 모든 상태의 속성을 보고 편집할 수 있습니다. **정의** 토글을 켜면 현재 선택한 상태가 강조 표시된 상태로 워크플로의 Amazon States Language 코드가 표시됩니다.

1. 도움이 필요할 때 **정보** 링크를 클릭하면 컨텍스트 정보가 포함된 패널이 열립니다. 이 패널에는 Step Functions 설명서의 관련 주제로 연결되는 링크도 포함되어 있습니다.

1. 디자인 도구 모음 - 실행 취소, 삭제 및 확대와 같은 일반적인 작업을 수행할 수 있는 일련의 버튼이 포함됩니다.

1. 유틸리티 버튼 - 워크플로 저장 또는 해당 ASL 정의를 JSON 또는 YAML 파일로 내보내기와 같은 작업을 수행하는 데 일련의 버튼입니다.

### 상태 브라우저
<a name="workflow-studio-components-states"></a>

상태 브라우저에서 상태를 선택하여 워크플로 그래프로 끌어서 놓을 수 있습니다. **작업** 탭은 타사 HTTP 엔드포인트 및 AWS APIs에 연결하는 작업 상태 목록을 제공합니다. **흐름** 탭은 워크플로를 지시하고 제어할 수 있는 상태 목록을 제공합니다. 흐름 상태에는 선택, 병렬, 맵, 통과, 대기, 성공 및 실패가 포함되어 있습니다. **패턴** 탭은 바로 사용할 수 있고 재사용 가능한 사전 정의된 빌딩 블록을 제공합니다. 패널 상단의 검색 상자를 사용하여 모든 상태 유형 중에서 검색할 수 있습니다.

![\[작업, 흐름, 패턴 및 검색을 보여주는 예시 스크린샷 모음입니다.\]](http://docs.aws.amazon.com/ko_kr/step-functions/latest/dg/images/wfe-states-browser-01.png)


### 캔버스 및 워크플로 그래프
<a name="workflow-studio-components-grapheditor"></a>

워크플로에 추가할 상태를 선택한 후 캔버스로 끌어 워크플로 그래프에 놓습니다. 상태를 끌어서 놓아 워크플로 내에서 이동할 수도 있습니다. 워크플로가 큰 경우 캔버스에서 워크플로 그래프의 다른 부분을 확대 또는 축소하여 볼 수 있습니다.

### Inspector 패널
<a name="workflow-studio-components-formdefinition"></a>

오른쪽의 **Inspector** 패널에서 워크플로에 추가하는 모든 상태를 구성할 수 있습니다. 구성하려는 상태를 선택합니다. 그러면 **Inspector** 패널에 해당 구성 옵션이 표시됩니다. 워크플로 코드에 자동으로 생성된 [ASL 정의](concepts-amazon-states-language.md)를 확인하려면 **정의** 토글을 켭니다. 선택한 상태와 관련된 ASL 정의가 강조 표시됩니다.

![\[구성 패널을 보여주는 Workflow Studio 검사기의 예시 스크린샷\]](http://docs.aws.amazon.com/ko_kr/step-functions/latest/dg/images/wfe-forms-definitions-01.png)


![\[코드 정의를 보여주는 Workflow Studio 검사기 패널의 예시 스크린샷\]](http://docs.aws.amazon.com/ko_kr/step-functions/latest/dg/images/wfe-forms-definitions-02.png)


## 코드 모드
<a name="wfs-interface-code-mode"></a>

Workflow Studio의 **코드** 모드에서는 Step Functions 콘솔 내에서 워크플로의 [Amazon States Language를 사용하여 Step Functions 워크플로 정의](concepts-amazon-states-language.md)(ASL) 정의를 보고, 쓰고, 편집할 수 있는 통합 코드 편집기를 사용할 수 있습니다. 다음 스크린샷은 **코드** 모드의 구성 요소를 보여줍니다.

![\[코드 모드에서 워크플로 정의를 편집하는 예시 스크린샷입니다.\]](http://docs.aws.amazon.com/ko_kr/step-functions/latest/dg/images/wfs-code-mode.png)


1. 모드 버튼은 세 가지 모드 간에 전환됩니다. ASL 워크플로 정의가 유효하지 않으면 모드를 전환할 수 없습니다.

1. [코드 편집기](#wfs-interface-code-editor)에서 Workflow Studio 내에서 워크플로의 [ASL 정의](concepts-amazon-states-language.md) 작성하고 편집할 수 있습니다. 코드 편집기는 구문 강조 및 자동 완성과 같은 기능도 제공합니다.

1. [그래프 시각화](#wfs-interface-code-graph-viz) - 워크플로의 실시간 그래픽 시각화를 보여줍니다.

1. 유틸리티 버튼 - 워크플로 저장 또는 해당 ASL 정의를 JSON 또는 YAML 파일로 내보내기와 같은 작업을 수행하는 데 일련의 버튼입니다.

1. 코드 도구 모음 - 작업 실행 취소나 코드 서식 지정과 같은 일반적인 작업을 수행할 수 있는 일련의 버튼을 포함합니다.

1. 그래프 도구 모음 - 워크플로 그래프 확대 및 축소와 같은 일반적인 작업을 수행할 수 있는 일련의 버튼을 포함합니다.

### 코드 편집기
<a name="wfs-interface-code-editor"></a>

코드 편집기는 Workflow Studio 내에서 JSON을 사용하여 워크플로 정의를 작성하고 편집할 수 있는 IDE와 유사한 환경을 제공합니다. 코드 편집기에는 구문 강조, 자동 완성 제안, [ASL 정의](concepts-amazon-states-language.md) 검증 및 상황에 맞는 도움말 표시와 같은 여러 가지 기능이 포함되어 있습니다. 워크플로 정의를 업데이트하면 [그래프 시각화](#wfs-interface-code-graph-viz)에서 워크플로 실시간 그래프를 렌더링합니다. [디자인 모드](#wfs-interface-design-mode)에서도 업데이트된 워크플로 그래프를 확인할 수 있습니다.

[디자인 모드](#wfs-interface-design-mode) 또는 그래프 시각화 창에서 상태를 선택하면 해당 상태의 ASL 정의가 코드 편집기에 강조 표시되어 나타납니다. **디자인** 모드나 그래프 시각화 창에서 상태를 재정렬, 삭제 또는 추가하면 워크플로의 ASL 정의가 자동으로 업데이트됩니다.

코드 편집기는 필드 및 상태를 자동으로 작성하도록 제안할 수 있습니다.
+ 특정 상태에 포함할 수 있는 필드 목록을 보려면 **Ctrl\$1Space**를 누릅니다.
+ 워크플로의 새 상태에 대한 코드 스니펫을 생성하려면 현재 상태 정의 뒤에서 **Ctrl\$1Space**를 누릅니다.
+ 사용 가능한 모든 명령 및 **키보드 바로 가기** 목록을 표시하려면 **F1**을 누릅니다.

### 그래프 시각화
<a name="wfs-interface-code-graph-viz"></a>

그래프 시각화 패널에는 워크플로가 그래픽 형식으로 표시됩니다. Workflow Studio의 [코드 편집기](#wfs-interface-code-editor)에서 워크플로 정의를 작성하면 그래프 시각화 창에서 워크플로의 실시간 그래프를 렌더링합니다.

그래프 시각화 창에서 상태를 재정렬, 삭제 또는 복제하면 코드 편집기에서 워크플로 정의가 자동으로 업데이트됩니다. 마찬가지로 코드 편집기에서 워크플로 정의를 업데이트하거나 상태를 재정렬, 삭제 또는 추가하면 시각화가 자동으로 업데이트됩니다.

워크플로의 ASL 정의에 있는 JSON이 유효하지 않으면 그래프 시각화 패널에서 렌더링을 일시 중지하고 창 하단에 상태 메시지가 표시됩니다.

## 구성 모드
<a name="wfs-interface-config-mode"></a>

Workflow Studio의 **구성** 모드에서는 상태 머신의 일반 구성을 관리할 수 있습니다. 이 모드에서는 다음과 같은 설정을 지정할 수 있습니다.
+ **세부 정보**: 워크플로 **이름**과 **유형**을 설정합니다. 상태 머신을 생성한 후에는 둘 다 변경할 수 **없습니다**.
+ **권한**: 새 역할(권장)을 생성하거나, 기존 역할을 선택하거나, 특정 역할에 대한 ARN을 입력할 수 있습니다. 새 역할을 생성하는 옵션을 선택하면 Step Functions는 최소 권한을 사용하여 상태 머신에 대한 실행 역할을 생성합니다. 생성된 IAM 역할은 상태 머신을 만드는 AWS 리전 에 유효합니다. 생성하기 전에 Step Functions가 상태 머신에 대해 자동으로 생성하는 권한을 검토할 수 있습니다.
+ **로깅**: 상태 머신에 대한 로그 수준을 활성화하고 설정할 수 있습니다. Step Functions는 선택 사항에 따라 실행 내역 이벤트를 로깅합니다. 로그를 암호화하도록 선택적으로 고객 관리형 키를 사용할 수 있습니다. 로그 수준에 대한 자세한 내용은 [Step Functions 실행 이벤트에 대한 로그 수준](cw-logs.md#cloudwatch-log-level) 섹션을 참조하세요.

**추가 구성**에서 다음 **선택적** 구성 옵션을 하나 이상 설정할 수 있습니다.
+ **X-Ray 트레이싱 활성화**: 업스트림 서비스에서 추적 ID를 전달하지 않은 경우에도 추적을 상태 머신 실행의 X-Ray에 보낼 수 있습니다. 자세한 내용은 [에서 Step Functions 요청 데이터 추적 AWS X-Ray](concepts-xray-tracing.md) 단원을 참조하십시오.
+ **생성 시 버전 게시**: *버전*은 실행할 수 있는 상태 머신의 번호가 매겨져 있고 변경할 수 없는 스냅샷입니다. 상태 머신을 만드는 동안 상태 머신 버전을 게시하려면 이 옵션을 선택합니다. Step Functions는 버전 1을 상태 머신의 첫 번째 버전으로 게시합니다. 버전에 대한 자세한 내용은 [Step Functions 워크플로의 상태 시스템 버전](concepts-state-machine-version.md)을 참조하십시오.
+ **고객 관리형 키로 암호화**: 데이터를 암호화하기 위해 직접 관리하는 키를 제공할 수 있습니다. 자세한 정보는 [저장 데이터 암호화](encryption-at-rest.md) 섹션을 참조하세요.
+ **태그**: 리소스와 관련된 비용을 추적 및 관리하고 IAM 정책에서 보안을 개선하는 데 도움이 되도록 태그를 추가하려면 이 상자를 선택합니다. 태그에 대한 자세한 내용은 [Step Functions에서 상태 머신 및 활동에 태그 지정](sfn-best-practices.md#concepts-tagging) 섹션을 참조하세요.

# Step Functions의 Workflow Studio를 사용하여 워크플로 생성
<a name="workflow-studio-create"></a>

Step Functions Workflow Studio를 사용하여 워크플로를 생성, 편집 및 실행하는 방법을 알아봅니다. 워크플로가 준비되면 저장하고 실행하고 내보낼 수 있습니다.

**Topics**
+ [상태 머신 생성](#workflow-studio-components-create)
+ [워크플로 설계](#workflow-studio-build)
+ [워크로드 실행](#workflow-studio-components-create-run)
+ [워크플로 편집](#workflow-studio-components-create-edit)
+ [워크플로 내보내기](#workflow-studio-components-create-export)
+ [자리 표시자를 사용하여 워크플로 프로토타입 생성](#workflow-studio-components-create-prototype)

## 상태 머신 생성
<a name="workflow-studio-components-create"></a>

Workflow Studio에서는 스타터 템플릿이나 빈 템플릿을 선택하여 워크플로를 만들 수 있습니다.

스타터 템플릿은 워크플로 프로토타입과 정의를 자동으로 생성하고 프로젝트에 필요한 모든 관련 AWS 리소스를에 배포하는 ready-to-run 가능한 샘플 프로젝트입니다 AWS 계정. 이러한 스타터 템플릿을 사용하여 그대로 배포 및 실행하거나 워크플로 프로토타입을 사용하여 이를 기반으로 빌드할 수 있습니다. 스타터 템플릿에 대한 자세한 내용은 [Step Functions용 스타터 템플릿을 사용하여 상태 시스템 배포](starter-templates.md) 섹션을 참조하세요.

빈 템플릿의 경우 [디자인](workflow-studio.md#wfs-interface-design-mode) 또는 [코드](workflow-studio.md#wfs-interface-code-mode) 모드를 사용하여 사용자 지정 워크플로를 만들 수 있습니다.

### 스타터 템플릿을 사용하여 상태 머신 생성
<a name="wfs-create-workflow-templates"></a>

1. [Step Functions 콘솔](https://console.aws.amazon.com/states/home?region=us-east-1#/)을 열고 **상태 시스템 생성**을 선택합니다.

1. **템플릿 선택** 대화 상자에서 다음 중 하나를 수행하여 샘플 프로젝트를 선택합니다.
   + 키워드로 검색 상자에 **Task Timer**를 입력한 다음 검색 결과에서 **태스크 타이머**를 선택합니다.
   + 오른쪽 창의 **전체** 아래에 나열된 샘플 프로젝트를 탐색한 다음 **태스크 타이머**를 선택합니다.

1. **다음**을 선택하여 계속 진행합니다.

1. 사용할 템플릿을 선택합니다.

1. **템플릿 사용**을 선택하여 계속 선택합니다.

1. **데모 실행** - 읽기 전용 상태 머신을 생성합니다. 검토 후 워크플로와 모든 관련 리소스를 생성할 수 있습니다.

1. **이를 기반으로 구축** - 자체 리소스를 사용하여 검토, 사용자 지정 및 배포할 수 있는 편집 가능한 워크플로 정의를 제공합니다. (함수 또는 대기열과 같은 관련 리소스는 자동으로 생성되지 **않습니다**.)

### 빈 템플릿을 사용하여 워크플로 만들기
<a name="wfs-create-workflow-blank"></a>

깨끗한 캔버스에서 시작하려면 빈 템플릿에서 워크플로를 생성합니다.

1. [Step Functions 콘솔](https://console.aws.amazon.com/states/home?region=us-east-1#/)을 엽니다.

1. **상태 머신 생성**을 선택합니다.

1. **새로 생성**을 선택합니다.

1. 상태 머신의 이름을 지정한 다음 **계속**을 선택하여 Workflow Studio에서 상태 머신을 편집합니다.

   이제 [디자인 모드](workflow-studio.md#wfs-interface-design-mode)에서 워크플로를 디자인하거나 [코드 모드](workflow-studio.md#wfs-interface-code-mode)에서 워크플로 정의를 작성할 수 있습니다.

1. **구성**을 선택하여 [구성 모드](workflow-studio.md#wfs-interface-config-mode)에서 워크플로 구성을 관리합니다. 예를 들어 워크플로 이름을 입력하고 해당 유형을 선택합니다.

## 워크플로 설계
<a name="workflow-studio-build"></a>

추가하려는 상태의 이름을 알고 있는 경우 [상태 브라우저](workflow-studio.md#workflow-studio-components-states)의 상단에 있는 검색 상자를 사용하여 찾을 수 있습니다. 그렇지 않으면 브라우저에서 필요한 상태를 찾아 캔버스에 추가합니다.

워크플로의 다른 위치로 상태를 끌어 워크플로의 상태를 재정렬할 수 있습니다. 상태를 캔버스로 드래그하면 다음 스크린샷과 같이 워크플로에 상태가 삽입될 위치를 보여주는 줄이 나타납니다.

![\[상태의 대상을 나타내는 파란색 선을 보여주는 예시 스크린샷입니다.\]](http://docs.aws.amazon.com/ko_kr/step-functions/latest/dg/images/wfe-design-02.png)


상태를 캔버스에 놓으면 해당 코드가 자동으로 생성되고 워크플로 정의에 추가됩니다. 정의를 보려면 [Inspector 패널](workflow-studio.md#workflow-studio-components-formdefinition)에서 **정의** 토글을 켭니다. 기본 제공 코드 편집기를 사용하여 정의를 편집하도록 [코드 모드](workflow-studio.md#wfs-interface-code-mode)를 선택할 수 있습니다.

상태를 캔버스에 놓으면 오른쪽의 [Inspector 패널](workflow-studio.md#workflow-studio-components-formdefinition) 패널에서 상태를 구성할 수 있습니다. 이 패널에는 캔버스에 배치하는 각 상태 또는 API 작업에 대한 **구성**, **입력**, **출력** 및 **오류 처리** 탭이 있습니다. **구성** 탭에서 워크플로에 포함할 상태를 구성합니다.

예를 들어 Lambda Invoke API 작업의 **구성** 탭에는 다음 옵션이 제공됩니다.
+ **상태 이름**: 사용자 지정 이름으로 상태를 식별하거나 기본 생성 이름을 수락할 수 있습니다.
+ **API**에서는 상태에서 사용하는 API 작업을 보여줍니다.
+ **통합 유형**: 다른 서비스의 API 작업을 직접 호출하는 데 사용되는 서비스 통합 유형을 선택할 수 있습니다.
+ **함수 이름**은 다음과 같은 옵션을 제공합니다.
  +  **함수 이름 입력**: 함수 이름이나 해당 ARN을 입력할 수 있습니다.
  +  **런타임 시 상태 입력에서 함수 이름 가져오기**: 이 옵션을 사용하면 지정한 경로를 기반으로 상태 입력에서 함수 이름을 동적으로 가져올 수 있습니다.
  +  **함수 이름 선택**: 계정 및 리전에서 사용할 수 있는 함수 중에서 직접 선택할 수 있습니다.
+ **페이로드**: 상태 입력, JSON 객체를 사용하거나 페이로드를 사용하지 않도록 선택하여 Lambda 함수에 페이로드로 전달할 수 있습니다. JSON을 선택하면 정적 값과 상태 입력에서 선택한 값을 모두 포함할 수 있습니다.
+ (선택 사항) 일부 상태에는 **태스크 완료 대기** 또는 **콜백 대기**를 선택할 수 있는 옵션이 있습니다. 가능한 경우 이러한 옵션에서 다음 [서비스 통합 패턴](connect-to-resource.md) 중 하나를 선택할 수 있습니다.
  + **선택한 옵션 없음**: Step Functions에서 [요청 및 응답](connect-to-resource.md#connect-default) 통합 패턴을 사용합니다. Step Functions는 HTTP 응답을 기다린 후 다음 상태로 진행합니다. Step Functions는 작업이 완료될 때까지 기다리지 않습니다. 사용할 수 있는 옵션이 없으면 상태에서 이 패턴을 사용합니다.
  + **태스크 완료 대기**: Step Functions에서 [작업 실행(.sync)](connect-to-resource.md#connect-sync) 통합 패턴을 사용합니다.
  + **콜백 대기**: Step Functions에서 [작업 토큰을 사용하여 콜백 대기](connect-to-resource.md#connect-wait-token) 통합 패턴을 사용합니다.
+ (선택 사항) 워크플로 AWS 계정 내에서 서로 다른에 구성된 리소스에 액세스하기 위해 Step Functions는 [교차 계정 액세스를](concepts-access-cross-acct-resources.md) 제공합니다. **크로스 계정 액세스를 위한 IAM 역할**은 다음과 같은 옵션을 제공합니다.
  + **IAM 역할 ARN 제공**: 적절한 리소스 액세스 권한이 있는 IAM 역할을 지정합니다. 이러한 리소스는 교차 계정 호출을 수행하는 대상 계정에서 사용할 AWS 계정 수 있습니다.
  + **상태 입력에서 런타임 시 IAM 역할 ARN 가져오기**: IAM 역할이 있는 상태의 JSON 입력에 있는 기존 키-값 페어에 대한 참조 경로를 지정합니다.
+ **다음 상태**를 사용하면 다음에 전환할 상태를 선택할 수 있습니다.
+ (선택 사항) **설명** 필드는 워크플로에 영향을 주지 않지만 워크플로에 주석을 다는 데 사용할 수 있습니다.

일부 상태에는 추가 일반적인 구성 옵션이 있습니다. 예를 들어 Amazon ECS `RunTask` 상태 구성에는 자리 표시자 값으로 채워진 `API Parameters` 필드가 있습니다. 이러한 상태에서는 자리 표시자 값을 필요에 맞는 구성으로 바꿀 수 있습니다.

**스테이지를 삭제하는 방법**

백스페이스를 누르고 마우스 오른쪽 버튼을 클릭하여 **상태 삭제**를 선택하거나, [디자인 도구 모음](workflow-studio.md#wfs-interface-design-mode)에서 **삭제**를 선택하면 됩니다.

## 워크로드 실행
<a name="workflow-studio-components-create-run"></a>

워크플로를 실행할 준비가 되면 [Step Functions 콘솔](https://console.aws.amazon.com/states/home)에서 실행하고 실행을 볼 수 있습니다.

**Workflow Studio에서 워크플로 실행하기**

1. **설계**, **코드** 또는 **구성** 모드에서 **실행**을 선택합니다.

   새 탭에 **실행 시작** 대화 상자가 열립니다.

1. **실행 시작** 대화 상자에서 다음을 수행합니다.

   1. (선택 사항) 생성된 기본값을 재정의하려면 사용자 지정 실행 이름을 입력합니다.
**비 ASCII 이름 및 로깅**  
Step Functions는 비 ASCII 문자가 포함된 상태 머신, 실행, 활동 및 레이블 이름을 허용합니다. 이러한 문자는 Amazon CloudWatch에서 데이터 로깅을 방지하므로 Step Functions 지표를 추적할 수 있도록 ASCII 문자만 사용하는 것이 좋습니다.

   1. (선택 사항) **입력** 상자에 입력 값을 JSON 형식으로 입력하여 워크플로를 실행합니다.

   1. **실행 시작**을 선택합니다.

   1. Step Functions 콘솔은 실행 ID가 제목인 페이지로 이동합니다. 이는 *실행 세부 정보* 페이지로 알려져 있습니다. 워크플로가 진행되고 완료된 후 실행 결과를 검토할 수 있습니다.

      실행 결과를 검토하려면 **그래프 보기**에서 개별 상태를 선택한 다음 [단계 세부 정보](concepts-view-execution-details.md#exec-details-intf-step-details) 창에서 개별 탭을 선택하여 입력, 출력 및 정의가 포함된 각 상태의 세부 정보를 각각 봅니다. *실행 세부 정보* 페이지에서 볼 수 있는 실행 정보에 대한 자세한 내용은 [실행 세부 정보 개요](concepts-view-execution-details.md#exec-details-interface-overview) 섹션을 참조하세요.

## 워크플로 편집
<a name="workflow-studio-components-create-edit"></a>

Workflow Studio의 [디자인 모드](workflow-studio.md#wfs-interface-design-mode)에서 기존 워크플로를 시각적으로 편집할 수 있습니다.

[Step Functions 콘솔](https://console.aws.amazon.com/states/home)의 **상태 머신** 페이지에서 편집하려는 워크플로를 선택합니다. Workflow Studio의 **디자인** 모드에서 워크플로가 열립니다.

[코드 모드](workflow-studio.md#wfs-interface-code-mode)에서 워크플로 정의도 편집할 수 있습니다. Workflow Studio에서 워크플로 정의를 보거나 편집하려면 **코드** 버튼을 선택합니다.

**참고**  
워크플로에 오류가 있으면 **디자인** 모드에서 오류를 수정해야 합니다. 워크플로에 오류가 있으면 **코드** 또는 **구성** 모드로 전환할 수 없습니다.

워크플로에 대한 변경 사항을 저장할 때 새 **버전 **도 게시할 수 있습니다. 버전을 사용하면 워크플로의 원본 또는 대체 버전을 실행하도록 선택할 수 있습니다. 버전으로 워크플로를 관리하는 방법에 대한 자세한 내용은 [Step Functions 워크플로의 상태 시스템 버전](concepts-state-machine-version.md) 섹션을 참조하세요.

## 워크플로 내보내기
<a name="workflow-studio-components-create-export"></a>

워크플로 [Amazon States Language](concepts-amazon-states-language.md)(ASL) 정의와 워크플로 그래프를 내보낼 수 있습니다.

1. [Step Functions 콘솔](https://console.aws.amazon.com/states/home)에서 워크플로를 선택합니다.

1. *상태 머신 세부 정보* 페이지에서 **편집**을 선택합니다.

1. **작업** 드롭다운 버튼을 선택한 후 다음 중 하나 또는 둘 다 모두 수행합니다.
   + 워크플로 그래프를 SVG 또는 PNG 파일로 내보내려면 **그래프 내보내기**에서 원하는 형식을 선택합니다.
   + 워크플로 정의를 JSON 또는 YAML 파일로 내보내려면 **내보내기 정의**에서 원하는 형식을 선택합니다.

## 자리 표시자를 사용하여 워크플로 프로토타입 생성
<a name="workflow-studio-components-create-prototype"></a>

Workflow Studio 또는 [Infrastructure Composer의 Workflow Studio](use-wfs-in-app-composer.md)를 사용하여 아직 존재하지 않는 명명된 리소스인 *자리 표시자 리소스*가 포함된 새 워크플로의 프로토타입을 생성할 수 있습니다.

워크플로 프로토타입을 생성하려면

1. [Step Functions 콘솔](https://console.aws.amazon.com/states/home?region=us-east-1#/)에 로그인합니다.

1. **상태 머신 생성**을 선택합니다.

1. **새로 생성**을 선택합니다.

1. 상태 머신의 이름을 지정한 다음 **계속**을 선택하여 Workflow Studio에서 상태 머신을 편집합니다.

1. Workflow Studio의 [디자인 모드](workflow-studio.md#wfs-interface-design-mode)가 열립니다. Workflow Studio에서 워크플로를 설계합니다. 자리 표시자 리소스 포함하기

   1. 자리 표시자 리소스를 포함하려는 상태를 선택한 다음 **구성**에서 다음을 선택합니다.
      + Lambda Invoke 상태의 경우 **함수 이름**을 선택한 다음 **함수 이름 입력**을 선택합니다. 함수 이름에 사용자 지정 이름을 입력할 수도 있습니다.
      + Amazon SQS Send Message 상태의 경우 **대기열 URL**을 선택한 다음 **대기열 URL 입력**을 선택합니다. 자리 표시자 대기열 URL을 입력합니다.
      + Amazon SNS Publish 상태의 경우 **주제**에서 주제 ARN을 선택합니다.
      + **작업**에 나열된 다른 모든 상태의 경우 기본 구성을 사용할 수 있습니다.
**참고**  
워크플로에 오류가 있으면 **디자인** 모드에서 오류를 수정해야 합니다. 워크플로에 오류가 있으면 **코드** 또는 **구성** 모드로 전환할 수 없습니다.

   1. (선택 사항) 자동으로 생성된 워크플로의 ASL 정의를 보려면 **정의**를 선택합니다.

   1. (선택 사항) Workflow Studio에서 워크플로 정의를 업데이트하려면 **코드** 버튼을 선택합니다.
**참고**  
워크플로 정의에 오류가 있으면 **코드** 모드에서 오류를 수정해야 합니다. 워크플로 정의에 오류가 있으면 **디자인** 또는 **구성** 모드로 전환할 수 없습니다.

1. (선택 사항) 상태 머신 이름을 편집하려면 **MyStateMachine**의 기본 상태 머신 이름 옆에 있는 편집 아이콘을 선택하고 **상태 머신 이름** 상자에 이름을 지정합니다.

   [구성 모드](workflow-studio.md#wfs-interface-config-mode)로 전환하여 기본 상태 머신 이름을 편집할 수도 있습니다.

1. 상태 머신 유형 및 실행 역할과 같은 워크플로 설정을 지정합니다.

1. **생성(Create)**을 선택합니다.

이제 프로토타입을 만드는 데 사용할 수 있는 자리 표시자 리소스가 포함된 새 워크플로를 만들었습니다. 워크플로 정의와 워크플로 그래프를 [내보낼](#workflow-studio-components-create-export) 수 있습니다.
+ 워크플로 정의를 JSON 또는 YAML 파일로 내보내려면 **디자인** 또는 **코드** 모드에서 **작업** 드롭다운 버튼을 선택합니다. 그런 다음 **내보내기 정의**의에서 내보내려는 형식을 선택합니다. 이 내보낸 정의를 [AWS Toolkit for Visual Studio Code](https://docs.aws.amazon.com/toolkit-for-vscode/latest/userguide/building-stepfunctions.html)을 사용한 로컬 개발의 시작점으로 사용할 수 있습니다.
+ 워크플로 그래프를 SVG 또는 PNG 파일로 내보내려면 **디자인** 또는 **코드** 모드에서 **작업** 드롭다운 버튼을 선택합니다. 그런 다음 **내보내기 정의**에서 원하는 형식을 선택합니다.

# Step Functions의 Workflow Studio를 사용하여 상태 입력 및 출력 구성
<a name="workflow-studio-process"></a>

**상태 관리 및 데이터 트랜스포밍**  
[변수를 사용하여 상태 간 데이터 전달](workflow-variables.md)과 [JSONata를 사용하여 데이터 트랜스포밍](transforming-data.md)에 대해 알아봅니다.

각 상태는 수신한 입력을 기반으로 결정을 내리거나 작업을 수행합니다. 대부분의 경우 출력을 다른 상태로 전달합니다. Workflow Studio의 [Inspector 패널](workflow-studio.md#workflow-studio-components-formdefinition) 패널에 있는 **입력** 및 **출력** 탭에서 상태가 입력 및 출력 데이터를 필터링하고 조작하는 방법을 구성할 수 있습니다. 입력과 출력을 구성할 때 **정보** 링크를 사용하여 상황별 도움말에 액세스할 수 있습니다.

![\[상태 입력, 출력 및 정보 도움말 패널을 보여주는 예시 스크린샷\]](http://docs.aws.amazon.com/ko_kr/step-functions/latest/dg/images/wfs_input_output_01.png)


Step Functions에서 입력과 출력을 처리하는 방법에 대한 자세한 내용은 [Step Functions에서 입력 및 출력 처리](concepts-input-output-filtering.md) 섹션을 참조하세요.

## 상태에 대한 입력 구성
<a name="workflow-studio-process-input"></a>

각 상태는 이전 상태의 입력을 JSON으로 수신합니다. 입력을 필터링하려면 [Inspector 패널](workflow-studio.md#workflow-studio-components-formdefinition) 패널의 **입력** 탭 아래에 있는 `InputPath` 필터를 사용하면 됩니다. `InputPath`는 `$`로 시작하는 문자열로, 특정 JSON 노드를 식별합니다. 이를 [참조 경로](amazon-states-language-paths.md)라고 하며 JsonPath 구문을 따릅니다.

입력 필터링하기
+ **InputPath로 입력 필터링**을 선택합니다.
+ `InputPath` 필터에 유효한 [JsonPath](https://datatracker.ietf.org/wg/jsonpath/about/)를 입력합니다. 예를 들어 **\$1.data**입니다.

`InputPath` 필터가 워크플로에 추가됩니다.

**Example 예제 1: Workflow Studio에서 InputPath 필터 사용**  
상태에 대한 입력에 다음 JSON 데이터가 포함되어 있다고 가정해보겠습니다.  

```
{
  "comment": "Example for InputPath",
  "dataset1": {
    "val1": 1,
    "val2": 2,
    "val3": 3
  },
  "dataset2": {
    "val1": "a",
    "val2": "b",
    "val3": "c"
  }
}
```
`InputPath` 필터를 적용하려면 **InputPath로 입력 필터링**를 선택한 다음 적절한 참조 경로를 입력합니다. **\$1.dataset2.val1**을 입력하면 다음 JSON이 상태에 대한 입력으로 전달됩니다.  

```
{"a"}
```
참조 경로에도 선택할 수 있는 값이 있습니다. 참조하는 데이터가 `{ "a": [1, 2, 3, 4] }`이고 참조 경로 `$.a[0:2]`를 `InputPath` 필터로 적용한 경우 결과는 다음과 같습니다.  

```
[ 1, 2 ]
```

[병렬 워크플로 상태](state-parallel.md), [Map 워크플로 상태](state-map.md) 및 [Pass 워크플로 상태](state-pass.md) 흐름 상태의 **입력** 탭 아래에는 `Parameters`라는 추가 입력 필터링 옵션이 있습니다. 이 필터는 InputPath 필터 이후에 적용되며 키-값 페어 하나 이상으로 구성된 사용자 지정 JSON 객체를 구성하는 데 사용될 수 있습니다. 각 페어의 값은 정적 값이거나 입력에서 선택되거나 경로가 있는 [Step Functions의 컨텍스트 객체에서 실행 데이터 액세스](input-output-contextobject.md)에서 선택될 수 있습니다.

**참고**  
파라미터에서 참조 경로를 사용하여 입력의 JSON 노드를 가리키도록 지정하려면 파라미터 이름이 `.$`로 끝나야 합니다.

**Example 예제 2: Parallel 상태를 위한 사용자 지정 JSON 입력 만들기**  
다음 JSON 데이터가 Parallel 상태에 대한 입력이라고 가정해보겠습니다.  

```
{
  "comment": "Example for Parameters",
  "product": {
    "details": {
      "color": "blue",
      "size": "small",
      "material": "cotton"
    },
    "availability": "in stock",
    "sku": "2317",
    "cost": "$23"
  }
}
```

이 입력의 일부를 선택하고 정적 값이 있는 추가 키-값 페어를 전달하려면 **Parallel** 상태의 **입력** 탭 아래에 있는 **파라미터** 필드에 다음을 지정하면 됩니다.

```
{
 "comment": "Selecting what I care about.",
 "MyDetails": {
    "size.$": "$.product.details.size",
    "exists.$": "$.product.availability",
    "StaticValue": "foo"
    }
 }
```

결과는 다음과 같은 JSON 데이터가 됩니다.

```
{
  "comment": "Selecting what I care about.",
  "MyDetails": {
    "size": "small",
    "exists": "in stock",
    "StaticValue": "foo"
  }
}
```

## 상태 출력 구성
<a name="workflow-studio-process-output"></a>

각 상태는 다음 상태로 전달되기 전에 필터링될 수 있는 JSON 출력을 생성합니다. 여러 가지 필터를 사용할 수 있으며 각 필터는 서로 다른 방식으로 출력에 영향을 미칩니다. 각 상태에 사용할 수 있는 출력 필터는 **Inspector** 패널의 **출력** 탭 아래에 나열되어 있습니다. [Task 워크플로 상태](state-task.md) 상태의 경우 선택한 모든 출력 필터는 다음 순서로 처리됩니다.

1.  `ResultSelector`:상태 결과를 조작하려면 이 필터를 사용합니다. 결과 일부를 사용하여 새 JSON 객체를 구성할 수 있습니다.

1.  `Step Functions에서 ResultPath를 사용하여 상태 출력 지정`: 상태 입력과 작업 결과의 조합을 선택하여 출력에 전달하려면 이 필터를 사용합니다.

1.  `OutputPath를 사용하여 상태 출력 필터링`: JSON 출력을 필터링하여 결과에서 다음 상태로 전달될 정보를 선택하려면 이 필터를 사용합니다.

### ResultSelector 사용
<a name="workflow-studio-process-output-resultselector"></a>

`ResultSelector`는 다음 상태에 대한 선택적 출력 필터입니다.
+  [Task 워크플로 상태](state-task.md) 상태는 모든 상태가 [상태 브라우저](workflow-studio.md#workflow-studio-components-states)의 **작업** 탭에 나열되는 상태입니다.
+  [Map 워크플로 상태](state-map.md) 상태는 상태 브라우저의 **흐름** 탭에 있습니다.
+  [병렬 워크플로 상태](state-parallel.md) 상태는 상태 브라우저의 **흐름** 탭에 있습니다.

`ResultSelector`는 키-값 페어 하나 이상으로 구성된 사용자 지정 JSON 객체를 구성하는 데 사용될 수 있습니다. 각 페어의 값은 정적 값이거나 경로가 있는 상태 결과에서 선택될 수 있습니다.

**참고**  
파라미터에서 경로를 사용하여 결과에서 JSON 노드를 참조하도록 지정하려면 파라미터 이름이 `.$`로 끝나야 합니다.

**Example ResultSelector 필터 사용 예제**  
이 예시에서는 `ResultSelector`를 사용하여 Amazon EMR `CreateCluster` 상태에 대한 Amazon EMR CreateCluster API 직접 호출의 응답을 조작합니다. 다음은 Amazon EMR `CreateCluster` API 직접 호출의 결과입니다.  

```
{
  "resourceType": "elasticmapreduce",
  "resource": "createCluster.sync",
  "output": {
    "SdkHttpMetadata": {
      "HttpHeaders": {
        "Content-Length": "1112",
        "Content-Type": "application/x-amz-JSON-1.1",
        "Date": "Mon, 25 Nov 2019 19:41:29 GMT",
        "x-amzn-RequestId": "1234-5678-9012"
      },
      "HttpStatusCode": 200
    },
    "SdkResponseMetadata": {
      "RequestId": "1234-5678-9012"
    },
    "ClusterId": "AKIAIOSFODNN7EXAMPLE"
  }
}
```
이 정보의 일부를 선택하고 정적 값이 있는 추가 키-값 페어를 전달하려면 상태의 **출력** 탭 아래에 있는 **ResultSelector** 필드에 다음을 지정합니다.  

```
{
 "result": "found",
 "ClusterId.$": "$.output.ClusterId", 
 "ResourceType.$": "$.resourceType"
 }
```
`ResultSelector`를 사용하면 다음 결과가 생성됩니다.  

```
{
 "result": "found",
 "ClusterId": "AKIAIOSFODNN7EXAMPLE",
 "ResourceType": "elasticmapreduce"
}
```

### ResultPath 사용
<a name="workflow-studio-process-output-resultpath"></a>

상태 출력은 해당 입력의 복사본, 생성된 결과 또는 해당 입력과 결과의 조합일 수 있습니다. `ResultPath`를 사용하여 상태 출력으로 이들의 어떤 조합을 전달할지 관리합니다. 더 많은 `ResultPath` 사용 사례는 [Step Functions에서 ResultPath를 사용하여 상태 출력 지정](input-output-resultpath.md) 섹션을 참조하세요.

`ResultPath`는 다음 상태에 대한 선택적 출력 필터입니다.
+  [Task 워크플로 상태](state-task.md) 상태는 모든 상태가 상태 브라우저의 **작업** 탭에 나열되는 상태입니다.
+  [Map 워크플로 상태](state-map.md) 상태는 상태 브라우저의 **흐름** 탭에 있습니다.
+  [병렬 워크플로 상태](state-parallel.md) 상태는 상태 브라우저의 **흐름** 탭에 있습니다.
+  [Pass 워크플로 상태](state-pass.md) 상태는 상태 브라우저의 **흐름** 탭에 있습니다.

`ResultPath`는 결과를 원래 상태 입력에 추가하는 데 사용될 수 있습니다. 지정된 경로는 결과를 추가할 위치를 나타냅니다.

**Example ResultPath 필터 사용 예제**  
Task 상태에 대한 입력이 다음과 같다고 가정해보겠습니다.  

```
{
  "details": "Default example",
  "who": "AWS Step Functions"
}
```
Task 상태 결과는 다음과 같습니다.  

```
Hello, AWS Step Functions
```
`ResultPath`를 적용하고 결과를 추가하려는 위치를 나타내는 참조 [경로](amazon-states-language-paths.md)(예: `$.taskresult`)를 입력하여 이 결과를 상태 입력에 추가할 수 있습니다.  
이 `ResultPath`를 사용하여 상태 출력으로 전달되는 JSON은 다음과 같습니다.  

```
{
  "details": "Default example",
  "who": "AWS Step Functions",
  "taskresult": "Hello, AWS Step Functions!"
}
```

### OutputPath 사용
<a name="workflow-studio-process-output-resultselector"></a>

`OutputPath` 필터를 사용하면 원치 않는 정보를 필터링하고 필요한 JSON 부분만 전달할 수 있습니다. `OutputPath`는 `$`로 시작하는 문자열로, JSON 텍스트 내의 노드를 식별합니다.

**Example OutputPath 필터 사용 예제**  
Lambda Invoke API 직접 호출은 Lambda 함수 결과와 함께 메타데이터를 반환한다고 가정해 보겠습니다.  

```
{
  "ExecutedVersion": "$LATEST",
  "Payload": {
     "foo": "bar",
     "colors": [
          "red",
          "blue",
          "green"    
     ],
     "car": {
          "year": 2008,
          "make": "Toyota",
          "model": "Matrix"
     }
   },
"SdkHttpMetadata": {
  "AllHttpHeaders": {
    "X-Amz-Executed-Version": ["$LATEST"]
...
```
`OutputPath`를 사용하여 추가 메타데이터를 필터링할 수 있습니다. 기본적으로 Workflow Studio를 통해 생성된 Lambda Invoke 상태에 대한 **OutputPath** 필터의 값은 `$.Payload`입니다. 이 기본값은 추가 메타데이터를 제거하고 Lambda 함수를 직접 실행하는 것과 동일한 출력을 반환합니다.  
Lambda Invoke 작업 결과 예제와 **출력** 필터의 `$.Payload` 값은 다음 JSON 데이터를 출력으로 전달합니다.  

```
{
 "foo": "bar",
 "colors": [
      "red",
      "blue",
      "green"    
 ],
 "car": {
      "year": 2008,
      "make": "Toyota",
      "model": "Matrix"
 }
}
```
`OutputPath` 필터는 마지막으로 적용되는 출력 필터이므로 `ResultSelector` 또는 `ResultPath`와 같은 추가 출력 필터를 사용하는 경우 `OutputPath` 필터의 기본값 `$.Payload`를 적절하게 수정해야 합니다.

# Step Functions의 Workflow Studio를 사용하여 실행 역할 설정
<a name="manage-state-machine-permissions"></a>

Workflow Studio를 사용하여 워크플로의 실행 역할을 설정할 수 있습니다. 모든 Step Functions 상태 머신을 사용하려면 AWS 서비스 및 리소스에서 작업을 수행하거나 HTTPS API를 직접 호출할 수 있는 권한을 상태 머신에 부여하는 AWS Identity and Access Management(IAM) 역할이 있어야 합니다. 이 역할은 *실행 역할*이라고 합니다.

실행 역할에는 각 작업에 대한 IAM 정책이 포함되어야 합니다. 상태 머신이 AWS Lambda 함수를 호출하거나, AWS Batch 작업을 실행하거나, Stripe API를 호출하도록 허용하는 정책을 예로 들 수 있습니다. Step Functions는 다음의 경우에 실행 역할을 제공해야 합니다.
+ 콘솔, AWS SDK 또는 [CreateStateMachine](https://docs.aws.amazon.com/step-functions/latest/apireference/API_CreateStateMachine.html) API를 사용하는 AWS CLI에서 상태 머신을 생성합니다.
+ 콘솔, AWS SDK 또는 [TestState](https://docs.aws.amazon.com/step-functions/latest/apireference/API_TestState.html) API를 사용하는 AWS CLI에서 상태를 [테스트](test-state-isolation.md)합니다.

**Topics**
+ [자동 생성된 역할 정보](#wfs-auto-gen-roles)
+ [역할 자동 생성](#auto-generating-roles)
+ [역할 생성 문제 해결](#resolve-role-gen-problem)
+ [Workflow Studio에서 HTTP 태스크를 테스트하기 위한 역할](#test-state-role-http)
+ [Workflow Studio에서 최적화 서비스 통합을 테스트하기 위한 역할](#test-state-role-optimized)
+ [Workflow Studio에서 AWS SDK 서비스 통합을 테스트하기 위한 역할](#test-state-role-aws-sdk)
+ [Workflow Studio에서 흐름 상태를 테스트하기 위한 역할](#test-state-role-flow)

## 자동 생성된 역할 정보
<a name="wfs-auto-gen-roles"></a>

Step Functions 콘솔에서 상태 머신을 만들면 [Workflow Studio](workflow-studio.md)에서는 필요한 IAM 정책이 포함된 실행 역할을 자동으로 생성할 수 있습니다. Workflow Studio는 상태 머신 정의를 분석하고 워크플로를 실행하는 데 필요한 최소 권한으로 정책을 생성합니다.

Workflow Studio는 다음에 대한 IAM 정책을 생성할 수 있습니다.
+ HTTPS API를 직접 호출하는 [HTTP 태스크](call-https-apis.md)입니다.
+ [최적화 통합](integrate-optimized.md)을 사용해 다른 AWS 서비스를 호출하는 태스크 상태(예: [Lambda Invoke](connect-lambda.md), [DynamoDB GetItem](connect-batch.md), [AWS Glue StartJobRun](connect-glue.md)).
+ [중첩된 워크플로](connect-stepfunctions.md)를 실행하는 태스크 상태.
+ 하위 워크플로 실행 시작, Amazon S3 버킷 나열, S3 객체 읽기 또는 쓰기에 대한 [정책](iam-policies-eg-dist-map.md) 등 [분산 맵 상태](state-map-distributed.md)
+ [X-Ray](concepts-xray-tracing.md) 추적. Workflow Studio에서 자동 생성되는 모든 역할에는 상태 머신에 권한을 부여하여 X-Ray에 추적을 전송할 수 있는 [정책](concepts-xray-tracing.md#xray-iam)이 포함되어 있습니다.
+ 상태 머신에서 로깅이 활성화된 경우의 [CloudWatch Logs를 사용하여 Step Functions에서 실행 기록 로깅](cw-logs.md).

Workflow Studio는 [AWS SDK 통합](supported-services-awssdk.md)을 사용하여 다른 AWS 서비스를 호출하는 태스크 상태에 대한 IAM 정책을 생성할 수 없습니다.

## 역할 자동 생성
<a name="auto-generating-roles"></a>

1. [AWS Step Functions 콘솔](https://console.aws.amazon.com/states/home)을 열고 메뉴에서 **상태 머신**을 선택한 다음 **상태 머신 생성**을 선택합니다.

   기존의 상태 머신을 업데이트할 수도 있습니다. 상태 머신을 업데이트하는 중이면 4단계를 참조하세요.

1. **새로 생성**을 선택합니다.

1. 상태 머신의 이름을 지정한 다음 **계속**을 선택하여 Workflow Studio에서 상태 머신을 편집합니다.

1. **구성** 탭을 선택합니다.

1. **권한** 섹션이 나올 때까지 스크롤하고 다음을 수행합니다.

   1. **실행 역할**에서 기본 선택인 **새 역할 생성**을 그대로 유지해야 합니다.

      Workflow Studio는 상태 머신 정의의 모든 유효한 상태에 필요한 모든 IAM 정책을 자동으로 생성합니다. 여기에는 **모든 권한을 가진 실행 역할이 생성됩니다**라는 메시지가 담긴 배너가 표시됩니다.  
![\[자동 생성된 권한의 미리 보기가 포함된 구성 탭의 예시 스크린샷입니다.\]](http://docs.aws.amazon.com/ko_kr/step-functions/latest/dg/images/wfs-full-permissions-role.png)
**작은 정보**  
Workflow Studio에서 상태 머신에 자동으로 생성하는 권한을 검토하려면 **자동 생성된 권한 검토**를 선택하세요.
**참고**  
Step Functions에서 만드는 IAM 역할을 삭제하면 나중에 Step Functions에서 이 역할을 다시 만들 수 없습니다. 마찬가지로, 역할을 수정하면(예: IAM 정책의 주요에서 Step Functions 제거) 나중에 Step Functions에서 해당 원본 설정을 복원할 수 없습니다.

      Workflow Studio에서 필요한 IAM 정책을 모두 생성할 수 없는 경우 **특정 작업에 대한 권한은 자동 생성할 수 없습니다라는 메시지가 포함된 배너가 표시됩니다. IAM 역할은 일부 권한만 있는 상태로 생성됩니다.** 누락된 권한을 추가하는 방법을 자세히 알아보려면 [역할 생성 문제 해결](#resolve-role-gen-problem) 섹션을 참조하세요.

   1. 상태 머신을 생성 중이면 **생성**을 선택합니다. 그렇지 않은 경우 **저장**을 선택합니다.

   1. 나타나는 대화 상자에서 **확인**을 선택합니다.

      Workflow Studio는 상태 머신을 저장하고 새 실행 역할을 생성합니다.

## 역할 생성 문제 해결
<a name="resolve-role-gen-problem"></a>

다음의 경우에는 Workflow Studio에서 필요한 모든 권한이 포함된 실행 역할을 자동으로 생성할 수 없습니다.
+ 상태 머신에서 오류가 발생했습니다. Workflow Studio의 모든 검증 오류를 해결해야 합니다. 또한 저장 과정에서 발생하는 모든 서버 측 오류를 해결해야 합니다.
+ 상태 머신에는 AWS SDK 통합을 사용하는 태스크가 포함되어 있습니다. 이 경우 Workflow Studio는 IAM 정책을 [자동 생성](#auto-generating-roles)할 수 없습니다. Workflow Studio에는 **특정 작업에 대한 권한은 자동 생성할 수 없습니다라는 메시지가 포함된 배너가 표시됩니다. IAM 역할은 일부 권한만 있는 상태로 생성됩니다.** 실행 역할이 누락된 정책에 대한 자세한 내용을 보려면 **자동 생성 권한 검토** 테이블에서 **상태**에 있는 콘텐츠를 선택합니다. Workflow Studio는 여전히 실행 역할을 생성할 수 있지만 이 역할에 모든 작업에 대한 IAM 정책이 포함되지는 않습니다. 자체 정책을 작성하고 생성된 후 역할에 추가하려면 **설명서 링크** 아래에 있는 링크를 확인하세요. 이러한 링크는 상태 머신을 저장한 후에도 사용할 수 있습니다.

## Workflow Studio에서 HTTP 태스크를 테스트하기 위한 역할
<a name="test-state-role-http"></a>

HTTP 태스크 상태를 [테스트](call-https-apis.md#http-task-test)하려면 실행 역할이 필요합니다. 충분한 권한을 지닌 역할이 없는 경우 다음 옵션 중 하나를 사용하여 역할을 생성합니다.
+ **Workflow Studio를 사용하여 역할 자동 생성(권장)** - 안전한 옵션입니다. **테스트 상태** 대화 상자를 닫고 [역할 자동 생성](#auto-generating-roles) 섹션의 지침을 따릅니다. 이렇게 하려면 먼저 상태 머신을 만들거나 업데이트한 다음 Workflow Studio로 돌아가 상태를 테스트해야 합니다.
+ **관리자 액세스 권한이 있는 역할 사용** - AWS의 모든 서비스와 리소스에 대한 전체 액세스 권한이 있는 역할을 만들 수 있는 권한이 있는 경우, 해당 역할을 사용하여 워크플로의 모든 유형의 상태를 테스트할 수 있습니다. 이렇게 하면 IAM 콘솔([https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/))에서 Step Functions 서비스 역할을 만들고 [AdministratorAccess](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_job-functions.html#jf_administrator) 정책을 추가할 수 있습니다.

## Workflow Studio에서 최적화 서비스 통합을 테스트하기 위한 역할
<a name="test-state-role-optimized"></a>

[최적화 서비스 통합](integrate-optimized.md)을 직접 호출하는 태스크 상태에는 실행 역할이 필요합니다. 충분한 권한을 지닌 역할이 없는 경우 다음 옵션 중 하나를 사용하여 역할을 생성합니다.
+ **Workflow Studio를 사용하여 역할 자동 생성(권장)** - 안전한 옵션입니다. **테스트 상태** 대화 상자를 닫고 [역할 자동 생성](#auto-generating-roles) 섹션의 지침을 따릅니다. 이렇게 하려면 먼저 상태 머신을 만들거나 업데이트한 다음 Workflow Studio로 돌아가 상태를 테스트해야 합니다.
+ **관리자 액세스 권한이 있는 역할 사용** - AWS의 모든 서비스와 리소스에 대한 전체 액세스 권한이 있는 역할을 만들 수 있는 권한이 있는 경우, 해당 역할을 사용하여 워크플로의 모든 유형의 상태를 테스트할 수 있습니다. 이렇게 하면 IAM 콘솔([https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/))에서 Step Functions 서비스 역할을 만들고 [AdministratorAccess](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_job-functions.html#jf_administrator) 정책을 추가할 수 있습니다.

## Workflow Studio에서 AWS SDK 서비스 통합을 테스트하기 위한 역할
<a name="test-state-role-aws-sdk"></a>

[AWS SDK 통합](supported-services-awssdk.md)을 직접 호출하는 태스크 상태에는 실행 역할이 필요합니다. 충분한 권한을 지닌 역할이 없는 경우 다음 옵션 중 하나를 사용하여 역할을 생성합니다.
+ **Workflow Studio를 사용하여 역할 자동 생성(권장)** - 안전한 옵션입니다. **테스트 상태** 대화 상자를 닫고 [역할 자동 생성](#auto-generating-roles) 섹션의 지침을 따릅니다. 이렇게 하려면 먼저 상태 머신을 만들거나 업데이트한 다음 Workflow Studio로 돌아가 상태를 테스트해야 합니다. 다음을 수행합니다.

  1. **테스트 상태** 대화 상자를 닫습니다.

  1. **구성** 탭을 선택하여 구성 모드를 확인합니다.

  1. **권한** 섹션이 나올 때까지 스크롤합니다.

  1. Workflow Studio에는 **특정 작업에 대한 권한은 자동 생성할 수 없습니다라는 메시지가 포함된 배너가 표시됩니다. IAM 역할은 일부 권한만 있는 상태로 생성됩니다.** **자동 생성 권한 검토**를 선택합니다.

  1. **자동 생성 권한 검토** 테이블에는 테스트하려는 태스크 상태에 해당하는 작업을 보여 주는 행이 표시됩니다. 사용자 지정 역할에 자체 IAM 정책을 작성하려면 **설명서 링크** 아래에 있는 링크를 확인하세요.
+ **관리자 액세스 권한이 있는 역할 사용** - AWS의 모든 서비스와 리소스에 대한 전체 액세스 권한이 있는 역할을 만들 수 있는 권한이 있는 경우, 해당 역할을 사용하여 워크플로의 모든 유형의 상태를 테스트할 수 있습니다. 이렇게 하면 IAM 콘솔([https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/))에서 Step Functions 서비스 역할을 만들고 [AdministratorAccess](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_job-functions.html#jf_administrator) 정책을 추가할 수 있습니다.

## Workflow Studio에서 흐름 상태를 테스트하기 위한 역할
<a name="test-state-role-flow"></a>

Workflow Studio에서 흐름 상태를 테스트하려면 실행 역할이 필요합니다. 흐름 상태는 실행 흐름으로 연결되는 상태이며 [Choice 워크플로 상태](state-choice.md), [병렬 워크플로 상태](state-parallel.md), [Map 워크플로 상태](state-map.md), [Pass 워크플로 상태](state-pass.md), [Wait 워크플로 상태](state-wait.md), [Succeed 워크플로 상태](state-succeed.md), [Fail 워크플로 상태](state-fail.md) 등이 그러한 예입니다. [TestState](https://docs.aws.amazon.com/step-functions/latest/apireference/API_TestState.html) API는 Map 또는 Parallel 상태에서는 작동하지 않습니다. 다음 옵션 중 하나를 사용하여 흐름 상태 테스트용 역할을 생성합니다.
+ **AWS 계정에서 원하는 역할 사용(권장)** - 흐름 상태는 AWS 작업이나 리소스를 호출하지 않으므로 특정 IAM 정책이 필요하지 않습니다. 따라서 AWS 계정에서 어떤 IAM 역할이든 사용할 수 있습니다.

  1. **테스트 상태** 대화 상자의 **실행 역할** 드롭다운 목록에서 원하는 역할을 선택합니다.

  1. 드롭다운 목록에 역할이 나타나지 않으면 다음 내용을 따릅니다.

     1. IAM 콘솔([https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/))에서 **역할**을 선택합니다.

     1. 목록에서 역할을 선택하고 역할 세부 정보 페이지에서 해당 ARN을 복사합니다. **테스트 상태** 대화 상자에 이 ARN을 입력해야 합니다.

     1. **테스트 상태** 대화 상자의 **실행 역할** 드롭다운 목록에서 **역할 ARN 입력**을 선택합니다.

     1. **역할 ARN**에 ARN을 붙여넣습니다.
+ **관리자 액세스 권한이 있는 역할 사용** - AWS의 모든 서비스와 리소스에 대한 전체 액세스 권한이 있는 역할을 만들 수 있는 권한이 있는 경우, 해당 역할을 사용하여 워크플로의 모든 유형의 상태를 테스트할 수 있습니다. 이렇게 하면 IAM 콘솔([https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/))에서 Step Functions 서비스 역할을 만들고 [AdministratorAccess](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_job-functions.html#jf_administrator) 정책을 추가할 수 있습니다.

# Step Functions의 Workflow Studio를 사용하여 오류 처리 구성
<a name="workflow-studio-process-error"></a>

**상태 관리 및 데이터 트랜스포밍**  
[변수를 사용하여 상태 간 데이터 전달](workflow-variables.md)과 [JSONata를 사용하여 데이터 트랜스포밍](transforming-data.md)에 대해 알아봅니다.

Workflow Studio 시각적 편집기 내에서 오류 처리를 구성할 수 있습니다. 기본적으로 상태에서 오류를 보고하면 Step Functions로 인해 워크플로 실행 전체가 실패합니다. 작업 및 일부 흐름 상태의 경우 Step Functions에서 오류를 처리하는 방법을 구성할 수 있습니다.

오류 처리를 구성했더라도 여전히 일부 오류로 인해 워크플로 실행이 실패할 수 있습니다. 자세한 내용은 [Step Functions 워크플로의 오류 처리](concepts-error-handling.md) 단원을 참조하십시오. Workflow Studio에서 [Inspector 패널](workflow-studio.md#workflow-studio-components-formdefinition)의 **오류 처리** 탭에서 오류 처리를 구성합니다.

## 오류 재시도
<a name="workflow-studio-process-error-retry"></a>

작업 상태 및 [병렬 워크플로 상태](state-parallel.md) 흐름 상태에 규칙을 하나 이상 추가하여 오류가 발생할 때 작업을 재시도할 수 있습니다. 이러한 규칙을 *Retier*라고 합니다. Retrier를 추가하려면 **Retrier \$11** 상자에 있는 편집 아이콘을 선택한 다음 해당 옵션을 구성합니다.
+ (선택 사항) **설명**명 필드에 메모를 추가합니다. 워크플로에는 영향을 주지 않지만 워크플로에 주석을 다는 데 사용할 수 있습니다.
+ **오류** 필드에 커서를 올려 놓고 Retrier를 트리거할 오류를 선택하거나 사용자 지정 오류 이름을 입력합니다. 오류를 여러 개 선택하거나 추가할 수 있습니다.
+ (선택 사항) **간격**을 설정합니다. Step Functions가 처음 재시도하기 전까지의 시간(초)입니다. 추가 재시도는 **최대 시도 횟수** 및 **백오프 비율**로 구성할 수 있는 간격을 따릅니다.
+ (선택 사항) **최대 시도 횟수**를 설정합니다. 이는 Step Functions로 인해 실행이 실패하기 전까지의 최대 재시도 횟수입니다.
+ (선택 사항) **백오프 비율**을 설정합니다. 이 비율은 시도할 때마다 재시도 간격이 증가하는 정도를 결정하는 승수입니다.

**참고**  
모든 상태에서 모든 오류 처리 옵션을 사용할 수 있는 것은 아닙니다. Lambda Invoke에는 기본적으로 Retrier 하나가 구성되어 있습니다.

## 오류 포착
<a name="workflow-studio-process-error-catch"></a>

작업 상태와 [병렬 워크플로 상태](state-parallel.md) 및 [Map 워크플로 상태](state-map.md) 흐름 상태에 규칙을 하나 이상 추가하여 오류를 포착할 수 있습니다. 이러한 규칙을 *Catcher*라고 합니다. Catcher를 추가하려면 **새 Catcher 추가**를 선택한 다음 해당 옵션을 구성합니다.
+ (선택 사항) **설명**명 필드에 메모를 추가합니다. 워크플로에는 영향을 주지 않지만 워크플로에 주석을 다는 데 사용할 수 있습니다.
+ **오류** 필드에 커서를 올려 놓고 Catcher를 트리거할 오류를 선택하거나 사용자 지정 오류 이름을 입력합니다. 오류를 여러 개 선택하거나 추가할 수 있습니다.
+ **폴백 상태** 필드에서 [폴백 상태](concepts-error-handling.md#error-handling-fallback-states)를 선택합니다. 이 상태는 오류가 포착되면 워크플로가 다음으로 이동하는 상태입니다.
+ (선택 사항) **ResultPath** 필드에 `ResultPath` 필터를 추가하여 원래 상태 입력에 오류를 추가합니다. [`ResultPath`](input-output-resultpath.md)는 유효한 [JsonPath](https://datatracker.ietf.org/wg/jsonpath/about/)여야 합니다. 이는 폴백 상태로 전송됩니다.

## 시간 초과
<a name="workflow-studio-process-error-timeout"></a>

작업 상태의 제한 시간을 구성하여 실패하기 전에 상태를 실행할 수 있는 최대 시간(초)을 설정할 수 있습니다. 제한 시간을 사용하여 실행 멈춤을 방지합니다. 제한 시간을 구성하려면 실행이 실패하기 전에 상태가 기다려야 하는 시간(초)을 입력합니다. 제한 시간에 대한 자세한 내용은 [Task 워크플로 상태](state-task.md) 상태의 `TimeoutSeconds` 섹션을 참조하세요.

## HeartbeatSeconds
<a name="workflow-studio-process-error-heartbeat"></a>

작업에서 보내는 *하트비트* 또는 정기 알림을 구성할 수 있습니다. 하트비트 간격을 설정했지만 상태에서 구성된 간격으로 하트비트 알림을 전송하지 않으면 작업이 실패로 표시됩니다. 하트비트를 구성하려면 0이 아닌 양의 정수로 시간(초)을 설정합니다. 자세한 내용은 [Task 워크플로 상태](state-task.md)의 `HeartBeatSeconds` 섹션을 참조하세요.

# Infrastructure Composer의 Workflow Studio를 사용하여 Step Functions 워크플로 구축
<a name="use-wfs-in-app-composer"></a>

Infrastructure Composer에서 워크플로를 설계하고 구축하는 데 도움이 되는 Workflow Studio를 사용할 수 있습니다. Infrastructure Composer의 Workflow Studio는 IaC 도구(예: CloudFormation 템플릿)를 사용하여 구축한 서버리스 애플리케이션에 워크플로를 쉽게 통합할 수 있는 시각적 코드형 인프라(IaC) 환경을 제공합니다.

AWS Infrastructure Composer은 간단한 그래픽 인터페이스를 사용하여 AWS SAM 및 AWS CloudFormation 템플릿을 개발하는 데 도움이 되는 시각적 빌더입니다. 를 사용하면 시각적 캔버스 AWS 서비스 에서를 드래그, 그룹화 및 연결하여 애플리케이션 아키텍처를 설계Infrastructure Composer할 수 있습니다. 그런 Infrastructure Composer 다음는 AWS SAM 명령줄 인터페이스(AWS SAM CLI) 또는를 사용하여 애플리케이션을 배포하는 데 사용할 수 있는 IaC 템플릿을 설계에서 생성합니다CloudFormation. Infrastructure Composer에 대한 자세한 내용은 [Infrastructure Composer란](https://docs.aws.amazon.com/application-composer/latest/dg/what-is-composer.html)을 참조하십시오.

에서 Workflow Studio를 사용하는 경우 Infrastructure ComposerInfrastructure Composer는 개별 워크플로 단계를 AWS 리소스에 연결하고 AWS SAM 템플릿에서 리소스 구성을 생성합니다.는 워크플로를 실행하는 데 필요한 IAM 권한Infrastructure Composer도 추가합니다. Infrastructure Composer에서 Workflow Studio를 사용하면 애플리케이션의 프로토타입을 만들어 바로 사용할 수 있는 애플리케이션으로 전환할 수 있습니다.

Infrastructure Composer에서 Workflow Studio를 사용하면 Infrastructure Composer 캔버스와 Workflow Studio를 전환할 수 있습니다.

**Topics**
+ [Infrastructure Composer에서 Workflow Studio 사용](#procedure-use-wfs-in-app-composer)
+ [CloudFormation 정의 대체를 사용하여 리소스를 동적으로 참조](#use-cfn-sub-edit-state-machine-resource)
+ [서비스 통합 태스크를 향상된 구성 요소 카드에 연결](#connect-service-integrations-enhanced-cards)
+ [기존 프로젝트를 가져와 로컬로 동기화합니다.](#import-projects-local-sync)
+ [Step Functions 워크플로를 AWS Infrastructure Composer에 직접 내보내기](#export-wsf-projects-into-app-composer)
+ [AWS Infrastructure Composer에서 사용할 수 없는 Workflow Studio 기능](#wfs-features-unavailable-app-composer)

## Infrastructure Composer에서 Workflow Studio를 사용하여 서버리스 워크플로 구축
<a name="procedure-use-wfs-in-app-composer"></a>

1. [Infrastructure Composer 콘솔](https://console.aws.amazon.com/composer/home)을 열고 **프로젝트 생성**을 선택하여 프로젝트를 생성합니다.

1. **리소스** 팔레트의 검색 필드에 **state machine**를 입력합니다.

1. **Step Functions 상태 머신** 리소스를 캔버스 위로 드래그합니다.

1. **Workflow Studio에서 편집**을 선택하여 상태 머신 리소스를 편집합니다.

   다음 애니메이션은 상태 머신 정의를 편집하기 위해 Workflow Studio로 전환하는 방법을 보여 줍니다.  
![\[Infrastructure Composer에서 Workflow Studio를 사용하는 방법을 보여 주는 애니메이션입니다.\]](http://docs.aws.amazon.com/ko_kr/step-functions/latest/dg/images/use-wfs-in-app-composer.gif)

   Infrastructure Composer에서 만든 상태 머신 리소스를 편집하기 위한 Workflow Studio와의 통합은 [https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-resource-statemachine.html](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-resource-statemachine.html) 리소스에만 사용할 수 있습니다. [https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-stepfunctions-statemachine.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-stepfunctions-statemachine.html) 리소스를 사용하는 템플릿에는 이 통합을 사용할 수 없습니다.

## Workflow Studio에서 CloudFormation 정의 대체를 사용하여 리소스를 동적으로 참조
<a name="use-cfn-sub-edit-state-machine-resource"></a>

Workflow Studio에서는 워크플로 정의에 CloudFormation 정의 대체를 사용하여 IaC 템플릿에서 정의한 리소스를 동적으로 참조할 수 있습니다. `${dollar_sign_brace}` 표기법을 사용하여 워크플로 정의에 자리 표시자 대체를 추가할 수 있습니다. 그러면 CloudFormation 스택 생성 프로세스 중에 자리 표시자 대체가 실제 값으로 대체됩니다. 정의 대체에 대한 자세한 내용은 [AWS SAM 템플릿의 DefinitionSubstitutions](concepts-sam-sfn.md#sam-definition-substitution-eg) 섹션을 참조하세요.

다음 애니메이션은 상태 머신 정의의 리소스에 자리 표시자 대체를 추가하는 방법을 보여 줍니다.

![\[상태 머신의 리소스에 자리 표시자 대체를 추가하는 방법을 보여 주는 애니메이션입니다.\]](http://docs.aws.amazon.com/ko_kr/step-functions/latest/dg/images/use-def-sub-wfs-app-composer.gif)


## 서비스 통합 태스크를 향상된 구성 요소 카드에 연결
<a name="connect-service-integrations-enhanced-cards"></a>

[최적화 서비스 통합](integrate-optimized.md)을 호출하는 태스크를 Infrastructure Composer 캔버스의 [향상된 구성 요소 카드](https://docs.aws.amazon.com/application-composer/latest/dg/reference-cards.html#reference-cards-enhanced-components)에 연결할 수 있습니다. 이렇게 하면 워크플로 정의의 `${dollar_sign_brace}` 표기법으로 지정된 모든 자리 표시자 대체가 `StateMachine` 리소스의 `DefinitionSubstitution` 속성과 자동으로 매핑됩니다. 또한 상태 머신에 적절한 AWS SAM 정책을 추가합니다.

최적화 서비스 통합 태스크를 [표준 구성 요소 카드](https://docs.aws.amazon.com/application-composer/latest/dg/using-composer-cards.html#using-composer-cards-component-intro)에 매핑하는 경우 Infrastructure Composer 캔버스에 연결선이 표시되지 않습니다.

다음 애니메이션은 최적화된 태스크를 향상된 구성 요소 카드에 연결하고 [https://docs.aws.amazon.com/application-composer/latest/dg/using-change-inspector.html](https://docs.aws.amazon.com/application-composer/latest/dg/using-change-inspector.html)에서 변경 사항을 보는 방법을 보여 줍니다.

![\[태스크를 연결하고 서비스 통합을 최적화하는 방법을 보여주는 애니메이션입니다.\]](http://docs.aws.amazon.com/ko_kr/step-functions/latest/dg/images/make-connections-wfs-app-composer.gif)


태스크 상태의 [AWS SDK 통합](supported-services-awssdk.md)을 향상된 구성 요소 카드 또는 표준 구성 요소 카드가 포함된 최적화 서비스 통합과 연결할 수는 없습니다. 이러한 태스크의 경우 Infrastructure Composer 캔버스의 **리소스 속성** 패널에서 대체를 매핑하고 AWS SAM 템플릿에 정책을 추가할 수 있습니다.

**작은 정보**  
**리소스 속성** 패널의 **정의 대체**에서 상태 머신의 자리 표시자 대체를 매핑할 수도 있습니다. 이렇게 하려면 상태 시스템 실행 역할에서 AWS 서비스 태스크 상태 호출에 필요한 권한을 추가해야 합니다. 필요할 수 있는 실행 역할 권한에 대해 알아보려면 [Step Functions의 Workflow Studio를 사용하여 실행 역할 설정](manage-state-machine-permissions.md) 섹션을 참조하세요.

다음 애니메이션은 **리소스 속성** 패널에서 자리 표시자 대체 매핑을 수동으로 업데이트하는 방법을 보여 줍니다.

![\[리소스 속성 패널에서 자리 표시자 대체 매핑을 업데이트하는 방법을 보여주는 애니메이션입니다.\]](http://docs.aws.amazon.com/ko_kr/step-functions/latest/dg/images/manual-update-placeholder-mapping.gif)


## 기존 프로젝트를 가져와 로컬로 동기화합니다.
<a name="import-projects-local-sync"></a>

Infrastructure Composer에서 기존 CloudFormation 및 AWS SAM 프로젝트를 열어 이를 시각화하여 디자인을 더 잘 이해하고 수정할 수 있습니다. Infrastructure Composer의 [로컬 동기화](https://docs.aws.amazon.com/application-composer/latest/dg/reference-features-local-sync.html) 기능을 사용하면 템플릿과 코드 파일을 로컬 빌드 컴퓨터에 자동으로 동기화하고 저장할 수 있습니다. 로컬 동기화 모드를 사용하면 기존 개발 흐름을 보완할 수 있습니다. 웹 애플리케이션이 로컬 파일 시스템에서 파일을 읽고 쓰고 저장할 수 있도록 하는 [File System Access API](https://docs.aws.amazon.com/application-composer/latest/dg/reference-fsa.html)를 지원하는 브라우저가 있는지 확인합니다. 구글 크롬이나 Microsoft Edge를 사용하는 것이 좋습니다.

## Step Functions 워크플로를 AWS Infrastructure Composer에 직접 내보내기
<a name="export-wsf-projects-into-app-composer"></a>

 AWS Step Functions 콘솔은 저장된 상태 시스템 워크플로를에서 고급 IaC 리소스로 인식되는 템플릿으로 내보내는 기능을 제공합니다Infrastructure Composer. 이 기능은 IaC 템플릿을 AWS SAM 스키마로 생성하고 로 이동합니다Infrastructure Composer. 자세한 내용은 [워크플로를 IaC 템플릿으로 내보내기](exporting-iac-templates.md) 단원을 참조하십시오.

## AWS Infrastructure Composer에서 사용할 수 없는 Workflow Studio 기능
<a name="wfs-features-unavailable-app-composer"></a>

Infrastructure Composer에서 Workflow Studio를 사용할 때 일부 Workflow Studio 기능은 사용할 수 없습니다. 또한 [Inspector 패널](workflow-studio.md#workflow-studio-components-formdefinition) 패널에서 사용할 수 있는 **API 파라미터** 섹션에서는 CloudFormation 정의 대체를 지원합니다. `${dollar_sign_brace}` 표기법을 사용하여 [코드 모드](workflow-studio.md#wfs-interface-code-mode)에서 대체를 추가할 수 있습니다. 이 표기법에 대한 자세한 내용은 [AWS SAM 템플릿의 DefinitionSubstitutions](concepts-sam-sfn.md#sam-definition-substitution-eg) 섹션을 참조하세요.

다음 목록은 Infrastructure Composer에서 Workflow Studio를 사용할 때 사용할 수 없는 Workflow Studio 기능을 설명합니다.
+ [스타터 템플릿](starter-templates.md) - 스타터 템플릿은 워크플로 프로토타입과 정의를 자동으로 생성하여 바로 실행 가능한 샘플 프로젝트입니다. 이러한 템플릿은 프로젝트에 필요한 모든 관련 AWS 리소스를에 배포합니다 AWS 계정.
+ [구성 모드](workflow-studio.md#wfs-interface-config-mode) - 이 모드를 사용하면 상태 머신의 구성을 관리할 수 있습니다. IaC 템플릿에서 상태 머신 구성을 업데이트하거나 Infrastructure Composer 캔버스의 **리소스 속성** 패널을 사용할 수 있습니다. **리소스 속성** 패널의 구성 업데이트에 대한 자세한 내용은 [서비스 통합 태스크를 향상된 구성 요소 카드에 연결](#connect-service-integrations-enhanced-cards) 섹션을 참조하세요.
+ [TestState](test-state-isolation.md) API
+ Workflow Studio의 **작업** 드롭다운 버튼에서 워크플로 정의를 가져오거나 내보내는 옵션입니다. 대신 Infrastructure Composer **메뉴**에서 **열기** > **프로젝트 폴더**를 선택합니다. Infrastructure Composer 캔버스의 변경 사항을 로컬 머신에 직접 자동으로 저장하도록 [로컬 동기화](https://docs.aws.amazon.com/application-composer/latest/dg/reference-features-local-sync.html) 모드를 활성화했는지 확인합니다.
+ **실행** 버튼을 사용합니다. Infrastructure Composer에서 Workflow Studio를 사용하는 경우 Infrastructure Composer에서 워크플로용 IaC 코드가 생성됩니다. 따라서 먼저 템플릿을 배포해야 합니다. 그런 다음 콘솔 또는 AWS Command Line Interface (AWS CLI)를 통해 워크플로를 실행합니다.

# AWS SAM 를 사용하여 Step Functions 워크플로 빌드
<a name="concepts-sam-sfn"></a>

Step Functions와 AWS Serverless Application Model 함께를 사용하여 워크플로를 구축하고 Lambda 함수, APIs 및 이벤트를 포함하여 필요한 인프라를 배포하여 서버리스 애플리케이션을 생성할 수 있습니다.

통합 환경의 AWS Toolkit for Visual Studio Code 일부로 AWS Serverless Application Model CLI를와 함께 사용하여 AWS Step Functions 상태 시스템을 빌드하고 배포할 수도 있습니다. AWS SAM을 사용하여 서버리스 애플리케이션을 빌드한 다음 VS Code IDE에서 상태 머신을 빌드할 수 있습니다. 그런 다음 리소스를 검증, 패키징 및 배포할 수 있습니다.

**작은 정보**  
를 사용하여 Step Functions 워크플로를 시작하는 샘플 서버리스 애플리케이션을 배포하려면 * AWS Step Functions 워크숍의 *[를 사용하여 배포 AWS SAM](https://catalog.workshops.aws/stepfunctions/iac/deploy-with-sam)를 AWS SAM참조하세요.

## Step Functions를와 함께 사용하는 이유는 무엇인가요 AWS SAM?
<a name="concepts-sam-sfn-integration"></a>

Step Functions를와 함께 사용하면 다음을 AWS SAM 수행할 수 있습니다.
+  AWS SAM 샘플 템플릿 사용을 시작합니다.
+ 상태 머신을 서버리스 애플리케이션에 빌드합니다.
+ 변수 대체를 사용하여 배포 시 ARN을 상태 머신으로 대체합니다.

   AWS CloudFormation은 CloudFormation 템플릿에 제공하는 값에 워크플로 정의의 동적 참조를 추가할 수 있도록 [https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-stepfunctions-statemachine.html#cfn-stepfunctions-statemachine-definitionsubstitutions](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-stepfunctions-statemachine.html#cfn-stepfunctions-statemachine-definitionsubstitutions)를 지원합니다. `${dollar_sign_brace}` 표기법으로 워크플로 정의에 대체 항목을 추가하여 동적 참조를 추가할 수 있습니다. 또한 CloudFormation 템플릿의 StateMachine 리소스에 대한 `DefinitionSubstitutions` 속성에 이러한 동적 참조를 정의해야 합니다. CloudFormation 스택 생성 프로세스 중에 이러한 대체 값이 실제 값으로 대체됩니다. 자세한 내용은 [AWS SAM 템플릿의 DefinitionSubstitutions](#sam-definition-substitution-eg) 단원을 참조하십시오.
+  AWS SAM 정책 템플릿을 사용하여 상태 시스템의 역할을 지정합니다.
+ API Gateway, EventBridge 이벤트 또는 AWS SAM 템플릿 내의 일정에 따라 상태 시스템 실행을 시작합니다.

## Step Functions와 AWS SAM 사양 통합
<a name="concepts-sam-sfn-ots2"></a>

[AWS SAM 정책 템플릿](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-policy-templates.html)을 사용하여 상태 머신에 권한을 추가할 수 있습니다. 이러한 권한을 사용하면 Lambda 함수 및 기타 AWS 리소스를 오케스트레이션하여 복잡하고 강력한 워크플로를 구성할 수 있습니다.

## Step Functions와 SAM CLI의 통합
<a name="concepts-sam-sfn-ots3"></a>

Step Functions는 AWS SAM CLI와 통합됩니다. 이를 사용하여 상태 머신를 서버리스 애플리케이션으로 신속하게 개발합니다.

를 사용하여 상태 시스템을 AWS SAM 생성하는 방법을 알아보려면 [를 사용하여 Step Functions 상태 시스템 생성 AWS SAM](tutorial-state-machine-using-sam.md) 자습서를 사용해 보세요.

지원되는 AWS SAM CLI 함수는 다음과 같습니다.


| CLI 명령 | 설명 | 
| --- | --- | 
| sam 이니트 |   AWS SAM 템플릿을 사용하여 서버리스 애플리케이션을 초기화합니다. Step Functions에 대해 SAM 템플릿과 함께 사용할 수 있습니다.  | 
| sam validate |  AWS SAM 템플릿을 검증합니다. | 
| sam package |   AWS SAM 애플리케이션을 패키징합니다. 코드와 종속성의 ZIP 파일을 만든 다음 Amazon S3에 업로드합니다. 그런 다음 로컬 아티팩트에 대한 참조를 명령이 아티팩트를 업로드한 Amazon S3 위치로 변경하여 AWS SAM 템플릿의 사본을 반환합니다.  | 
| sam deploy |  AWS SAM 애플리케이션을 배포합니다. | 
| sam publish |  에 AWS SAM 애플리케이션을 게시합니다 AWS Serverless Application Repository. 이 명령은 패키징된 AWS SAM 템플릿을 가져와 지정된 리전에 애플리케이션을 게시합니다.  | 

**참고**  
 AWS SAM 로컬을 사용하는 경우 Lambda 및 API Gateway를 로컬에서 에뮬레이션할 수 있습니다. 그러나를 사용하여 Step Functions를 로컬로 에뮬레이션할 수 없습니다 AWS SAM.

## AWS SAM 템플릿의 DefinitionSubstitutions
<a name="sam-definition-substitution-eg"></a>

AWS SAM으로 CloudFormation 템플릿을 사용하여 상태 머신을 정의할 수 있습니다. AWS SAM을 사용하여 템플릿 또는 별도의 파일에서 상태 머신을 인라인으로 정의할 수 있습니다. 다음 AWS SAM 템플릿에는 주식 거래 워크플로를 시뮬레이션하는 상태 머신이 포함되어 있습니다. 이 상태 머신은 주식 가격을 확인하고 주식 매수 또는 매도 여부를 결정하는 3가지 Lambda 함수를 호출합니다. 그러면 이 거래가 Amazon DynamoDB 테이블에 기록됩니다. 다음 템플릿의 Lambda 함수 및 DynamoDB 테이블의 ARN은 [https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-stepfunctions-statemachine.html#cfn-stepfunctions-statemachine-definitionsubstitutions](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-stepfunctions-statemachine.html#cfn-stepfunctions-statemachine-definitionsubstitutions)를 사용하여 지정됩니다.

```
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: |
  step-functions-stock-trader
  Sample SAM Template for step-functions-stock-trader
Resources:
  StockTradingStateMachine:
    Type: AWS::Serverless::StateMachine
    Properties:
      DefinitionSubstitutions:
        StockCheckerFunctionArn: !GetAtt StockCheckerFunction.Arn
        StockSellerFunctionArn: !GetAtt StockSellerFunction.Arn
        StockBuyerFunctionArn: !GetAtt StockBuyerFunction.Arn
        DDBPutItem: !Sub arn:${AWS::Partition}:states:::dynamodb:putItem
        DDBTable: !Ref TransactionTable
      Policies:
        - DynamoDBWritePolicy:
            TableName: !Ref TransactionTable
        - LambdaInvokePolicy:
            FunctionName: !Ref StockCheckerFunction
        - LambdaInvokePolicy:
            FunctionName: !Ref StockBuyerFunction
        - LambdaInvokePolicy:
            FunctionName: !Ref StockSellerFunction
      DefinitionUri: statemachine/stock_trader.asl.json
  StockCheckerFunction:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: functions/stock-checker/
      Handler: app.lambdaHandler
      Runtime: nodejs18.x
      Architectures:
        - x86_64
  StockSellerFunction:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: functions/stock-seller/
      Handler: app.lambdaHandler
      Runtime: nodejs18.x
      Architectures:
        - x86_64
  StockBuyerFunction:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: functions/stock-buyer/
      Handler: app.lambdaHandler
      Runtime: nodejs18.x
      Architectures:
        - x86_64
  TransactionTable:
    Type: AWS::DynamoDB::Table
    Properties:
      AttributeDefinitions:
        - AttributeName: id
          AttributeType: S
```

다음 코드는 [를 사용하여 Step Functions 상태 시스템 생성 AWS SAM](tutorial-state-machine-using-sam.md) 자습서에서 사용되는 `stock_trader.asl.json` 파일의 상태 머신 정의입니다. 이 상태 머신 정의에는 `${dollar_sign_brace}` 표기법으로 표시된 여러 개의 `DefinitionSubstitutions`가 포함되어 있습니다. 예를 들어 `Check Stock Value` 작업에 정적 Lambda 함수 ARN을 지정하는 대신 대체 `${StockCheckerFunctionArn}` 함수를 사용합니다. 이 대체 값은 템플릿의 [DefinitionSubstitutions](#sam-template-def-substitution) 속성에 정의되어 있습니다. `DefinitionSubstitutions`는 상태 머신 리소스의 키-값 페어의 맵입니다. `DefinitionSubstitutions`에서 \$1\$1StockCheckerFunctionArn\$1은 CloudFormation 내장 함수 [https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-getatt.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-getatt.html)를 사용하여 `StockCheckerFunction` 리소스의 ARN에 매핑됩니다. AWS SAM 템플릿을 배포하면 템플릿의 `DefinitionSubstitutions`가 실제 값으로 대체됩니다.

```
{
    "Comment": "A state machine that does mock stock trading.",
    "StartAt": "Check Stock Value",
    "States": {
        "Check Stock Value": {
            "Type": "Task",
            "Resource": "arn:aws:states:::lambda:invoke",
            "OutputPath": "$.Payload",
            "Parameters": {
                "Payload.$": "$",
                "FunctionName": "${StockCheckerFunctionArn}"
            },
            "Next": "Buy or Sell?"
        },
        "Buy or Sell?": {
            "Type": "Choice",
            "Choices": [
                {
                    "Variable": "$.stock_price",
                    "NumericLessThanEquals": 50,
                    "Next": "Buy Stock"
                }
            ],
            "Default": "Sell Stock"
        },
        "Buy Stock": {
            "Type": "Task",
            "Resource": "arn:aws:states:::lambda:invoke",
            "OutputPath": "$.Payload",
            "Parameters": {
                "Payload.$": "$",
                "FunctionName": "${StockBuyerFunctionArn}"
            },
            "Retry": [
                {
                    "ErrorEquals": [
                        "Lambda.ServiceException",
                        "Lambda.AWSLambdaException",
                        "Lambda.SdkClientException",
                        "Lambda.TooManyRequestsException"
                    ],
                    "IntervalSeconds": 1,
                    "MaxAttempts": 3,
                    "BackoffRate": 2
                }
            ],
            "Next": "Record Transaction"
        },
        "Sell Stock": {
            "Type": "Task",
            "Resource": "arn:aws:states:::lambda:invoke",
            "OutputPath": "$.Payload",
            "Parameters": {
                "Payload.$": "$",
                "FunctionName": "${StockSellerFunctionArn}"
            },
            "Next": "Record Transaction"
        },
        "Record Transaction": {
            "Type": "Task",
            "Resource": "arn:aws:states:::dynamodb:putItem",
            "Parameters": {
                "TableName": "${DDBTable}",
                "Item": {
                    "Id": {
                        "S.$": "$.id"
                    },
                    "Type": {
                        "S.$": "$.type"
                    },
                    "Price": {
                        "N.$": "$.price"
                    },
                    "Quantity": {
                        "N.$": "$.qty"
                    },
                    "Timestamp": {
                        "S.$": "$.timestamp"
                    }
                }
            },
            "End": true
        }
    }
}
```

## 다음 단계
<a name="concepts-sam-sfn-next-steps"></a>

다음 리소스 AWS SAM 와 함께에서 Step Functions를 사용하는 방법에 대해 자세히 알아볼 수 있습니다.
+ 자[를 사용하여 Step Functions 상태 시스템 생성 AWS SAM](tutorial-state-machine-using-sam.md)습서를 완료하여 상태 시스템을 생성합니다 AWS SAM.
+ [AWS::Serverless::StateMachine](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-resource-statemachine.html) 리소스를 지정합니다.
+ 사용할 [AWS SAM 정책 템플릿](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-policy-templates.html)을 찾습니다.
+ Step Functions에서 [AWS Toolkit for Visual Studio Code](https://docs.aws.amazon.com/toolkit-for-vscode/latest/userguide/stepfunctions.html)를 사용합니다.
+  AWS SAM에서 제공하는 기능을 자세히 알아보려면 [AWS SAM CLI 참조](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-cli-command-reference.html)를 검토하세요.

또한 Infrastructure Composer의 Workflow Studio와 같은 비주얼 빌더를 사용하여 코드형 인프라(IaC)에서 워크플로를 설계하고 구축할 수 있습니다. 자세한 내용은 [Infrastructure Composer의 Workflow Studio를 사용하여 Step Functions 워크플로 구축](use-wfs-in-app-composer.md) 단원을 참조하십시오.

# CloudFormation 를 사용하여 Step Functions에서 워크플로 생성
<a name="tutorial-lambda-state-machine-cloudformation"></a>

이 자습서에서는를 사용하여 AWS Lambda 함수를 생성합니다 AWS CloudFormation. CloudFormation 콘솔과 YAML 템플릿을 사용하여 *스택*(IAM 역할, Lambda 함수 및 상태 시스템)을 생성합니다. 그런 다음 Step Functions 콘솔을 사용하여 상태 머신 실행을 시작합니다.

자세한 내용은 *AWS CloudFormation 사용 설명서*의 [CloudFormation 템플릿 사용](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/template-guide.html) 및 `[AWS::StepFunctions::StateMachine](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-stepfunctions-statemachine.html)` 리소스를 참조하세요.

## 1단계: CloudFormation 템플릿 설정
<a name="lambda-state-machine-cfn-step-1"></a>

[예제 템플릿](#lambda-state-machine-cfn-step-2)을 사용하기 전에 CloudFormation 템플릿의 다른 부분을 선언하는 방법을 이해해야 합니다.

### Lambda용 IAM 역할을 생성하려면,
<a name="lambda-state-machine-cfn-procedure-create-iam-role"></a>

Lambda 함수용 IAM 역할과 관련된 신뢰 정책을 정의합니다. 다음 예제에서는 YAML 또는 JSON을 사용하여 신뢰 정책을 정의합니다.

------
#### [ YAML ]

```
LambdaExecutionRole:
    Type: "AWS::IAM::Role"
    Properties:
      AssumeRolePolicyDocument:
        Version: "2012-10-17"		 	 	 
        Statement:
          - Effect: Allow
            Principal:
              Service: lambda.amazonaws.com
            Action: "sts:AssumeRole"
```

------
#### [ JSON ]

```
          "LambdaExecutionRole": {
              "Type": "AWS::IAM::Role",
              "Properties": {
                  "AssumeRolePolicyDocument": {
                      "Version": "2012-10-17",		 	 	 
                      "Statement": [
                          {
                              "Effect": "Allow",
                              "Principal": {
                                  "Service": "lambda.amazonaws.com"
                              },
                              "Action": "sts:AssumeRole"
                          }
                      ]
                  }
              }
```

------

### Lambda 함수 생성
<a name="lambda-state-machine-cfn-create-function"></a>

`Hello World` 메시지를 출력하는 Lambda 함수의 다음 속성을 정의합니다.

**중요**  
Lambda 함수가 상태 시스템과 동일한 AWS 계정 및 AWS 리전 에 있는지 확인합니다.

------
#### [ YAML ]

```
MyLambdaFunction:
    Type: "AWS::Lambda::Function"
    Properties:
      Handler: "index.handler"
      Role: !GetAtt [ LambdaExecutionRole, Arn ]
      Code:
        ZipFile: |
          exports.handler = (event, context, callback) => {
              callback(null, "Hello World!");
          };
      Runtime: "nodejs12.x"
      Timeout: "25"
```

------
#### [ JSON ]

```
        "MyLambdaFunction": {
              "Type": "AWS::Lambda::Function",
              "Properties": {
                  "Handler": "index.handler",
                  "Role": {
                      "Fn::GetAtt": [
                          "LambdaExecutionRole",
                          "Arn"
                      ]
                  },
                  "Code": {
                      "ZipFile": "exports.handler = (event, context, callback) => {\n    callback(null, \"Hello World!\");\n};\n"
                  },
                  "Runtime": "nodejs12.x",
                  "Timeout": "25"
              }
          },
```

------

### 상태 머신 실행에 대한 IAM 역할 만들기
<a name="lambda-state-machine-cfn-create-role"></a>

상태 머신 실행에 대한 IAM 역할과 관련된 신뢰 정책을 정의합니다.

------
#### [ YAML ]

```
StatesExecutionRole:
    Type: "AWS::IAM::Role"
    Properties:
      AssumeRolePolicyDocument:
        Version: "2012-10-17"		 	 	 
        Statement:
          - Effect: "Allow"
            Principal:
              Service:
                - !Sub states.${AWS::Region}.amazonaws.com
            Action: "sts:AssumeRole"
      Path: "/"
      Policies:
        - PolicyName: StatesExecutionPolicy
          PolicyDocument:
            Version: "2012-10-17"		 	 	 
            Statement:
              - Effect: Allow
                Action:
                  - "lambda:InvokeFunction"
                Resource: "*"
```

------
#### [ JSON ]

```
        "StatesExecutionRole": {
              "Type": "AWS::IAM::Role",
              "Properties": {
                  "AssumeRolePolicyDocument": {
                      "Version": "2012-10-17",		 	 	 
                      "Statement": [
                          {
                              "Effect": "Allow",
                              "Principal": {
                                  "Service": [
                                      {
                                          "Fn::Sub": "states.${AWS::Region}.amazonaws.com"
                                      }
                                  ]
                              },
                              "Action": "sts:AssumeRole"
                          }
                      ]
                  },
                  "Path": "/",
                  "Policies": [
                      {
                          "PolicyName": "StatesExecutionPolicy",
                          "PolicyDocument": {
                              "Version": "2012-10-17",		 	 	 
                              "Statement": [
                                  {
                                      "Effect": "Allow",
                                      "Action": [
                                          "lambda:InvokeFunction"
                                      ],
                                      "Resource": "*"
                                  }
                              ]
                          }
                      }
                  ]
              }
          },
```

------

### Lambda 상태 머신 만들기
<a name="lambda-state-machine-cfn-create"></a>

Lambda 상태 머신을 정의합니다.

------
#### [ YAML ]

```
MyStateMachine:
    Type: "AWS::StepFunctions::StateMachine"
    Properties:
      DefinitionString:
        !Sub
          - |-
            {
              "Comment": "A Hello World example using an AWS Lambda function",
              "StartAt": "HelloWorld",
              "States": {
                "HelloWorld": {
                  "Type": "Task",
                  "Resource": "${lambdaArn}",
                  "End": true
                }
              }
            }
          - {lambdaArn: !GetAtt [ MyLambdaFunction, Arn ]}
      RoleArn: !GetAtt [ StatesExecutionRole, Arn ]
```

------
#### [ JSON ]

```
        "MyStateMachine": {
              "Type": "AWS::StepFunctions::StateMachine",
              "Properties": {
                  "DefinitionString": {
                      "Fn::Sub": [
                          "{\n  \"Comment\": \"A Hello World example using an AWS Lambda function\",\n  \"StartAt\": \"HelloWorld\",\n  \"States\": {\n    \"HelloWorld\": {\n      \"Type\": \"Task\",\n      \"Resource\": \"${lambdaArn}\",\n      \"End\": true\n    }\n  }\n}",
                          {
                              "lambdaArn": {
                                  "Fn::GetAtt": [
                                      "MyLambdaFunction",
                                      "Arn"
                                  ]
                              }
                          }
                      ]
                  },
                  "RoleArn": {
                      "Fn::GetAtt": [
                          "StatesExecutionRole",
                          "Arn"
                      ]
                  }
              }
          }
```

------

## 2단계: CloudFormation 템플릿을 사용하여 Lambda 상태 시스템 생성
<a name="lambda-state-machine-cfn-step-2"></a>

 CloudFormation 템플릿의 구성 요소를 이해한 후 템플릿을 사용하여 CloudFormation 스택을 생성할 수 있습니다.

### Lambda 상태 머신 만들기
<a name="to-create-the-lam-state-machine"></a>

1. 다음 예제 데이터를 YAML 예제용 `MyStateMachine.yaml` 또는 JSON용 `MyStateMachine.json` 파일에 복사합니다.

------
#### [ YAML ]

   ```
   AWSTemplateFormatVersion: "2010-09-09"
     Description: "An example template with an IAM role for a Lambda state machine."
     Resources:
       LambdaExecutionRole:
         Type: "AWS::IAM::Role"
         Properties:
           AssumeRolePolicyDocument:
             Version: "2012-10-17"		 	 	 
             Statement:
               - Effect: Allow
                 Principal:
                   Service: lambda.amazonaws.com
                 Action: "sts:AssumeRole"
     
       MyLambdaFunction:
         Type: "AWS::Lambda::Function"
         Properties:
           Handler: "index.handler"
           Role: !GetAtt [ LambdaExecutionRole, Arn ]
           Code:
             ZipFile: |
               exports.handler = (event, context, callback) => {
                   callback(null, "Hello World!");
               };
           Runtime: "nodejs12.x"
           Timeout: "25"
     
       StatesExecutionRole:
         Type: "AWS::IAM::Role"
         Properties:
           AssumeRolePolicyDocument:
             Version: "2012-10-17"		 	 	 
             Statement:
               - Effect: "Allow"
                 Principal:
                   Service:
                     - !Sub states.${AWS::Region}.amazonaws.com
                 Action: "sts:AssumeRole"
           Path: "/"
           Policies:
             - PolicyName: StatesExecutionPolicy
               PolicyDocument:
                 Version: "2012-10-17"		 	 	 
                 Statement:
                   - Effect: Allow
                     Action:
                       - "lambda:InvokeFunction"
                     Resource: "*"
     
       MyStateMachine:
         Type: "AWS::StepFunctions::StateMachine"
         Properties:
           DefinitionString:
             !Sub
               - |-
                 {
                   "Comment": "A Hello World example using an AWS Lambda function",
                   "StartAt": "HelloWorld",
                   "States": {
                     "HelloWorld": {
                       "Type": "Task",
                       "Resource": "${lambdaArn}",
                       "End": true
                     }
                   }
                 }
               - {lambdaArn: !GetAtt [ MyLambdaFunction, Arn ]}
           RoleArn: !GetAtt [ StatesExecutionRole, Arn ]
   ```

------
#### [ JSON ]

   ```
   {
         "AWSTemplateFormatVersion": "2010-09-09",
         "Description": "An example template with an IAM role for a Lambda state machine.",
         "Resources": {
             "LambdaExecutionRole": {
                 "Type": "AWS::IAM::Role",
                 "Properties": {
                     "AssumeRolePolicyDocument": {
                         "Version": "2012-10-17",		 	 	 
                         "Statement": [
                             {
                                 "Effect": "Allow",
                                 "Principal": {
                                     "Service": "lambda.amazonaws.com"
                                 },
                                 "Action": "sts:AssumeRole"
                             }
                         ]
                     }
                 }
             },
             "MyLambdaFunction": {
                 "Type": "AWS::Lambda::Function",
                 "Properties": {
                     "Handler": "index.handler",
                     "Role": {
                         "Fn::GetAtt": [
                             "LambdaExecutionRole",
                             "Arn"
                         ]
                     },
                     "Code": {
                         "ZipFile": "exports.handler = (event, context, callback) => {\n    callback(null, \"Hello World!\");\n};\n"
                     },
                     "Runtime": "nodejs12.x",
                     "Timeout": "25"
                 }
             },
             "StatesExecutionRole": {
                 "Type": "AWS::IAM::Role",
                 "Properties": {
                     "AssumeRolePolicyDocument": {
                         "Version": "2012-10-17",		 	 	 
                         "Statement": [
                             {
                                 "Effect": "Allow",
                                 "Principal": {
                                     "Service": [
                                         {
                                             "Fn::Sub": "states.${AWS::Region}.amazonaws.com"
                                         }
                                     ]
                                 },
                                 "Action": "sts:AssumeRole"
                             }
                         ]
                     },
                     "Path": "/",
                     "Policies": [
                         {
                             "PolicyName": "StatesExecutionPolicy",
                             "PolicyDocument": {
                                 "Version": "2012-10-17",		 	 	 
                                 "Statement": [
                                     {
                                         "Effect": "Allow",
                                         "Action": [
                                             "lambda:InvokeFunction"
                                         ],
                                         "Resource": "*"
                                     }
                                 ]
                             }
                         }
                     ]
                 }
             },
             "MyStateMachine": {
                 "Type": "AWS::StepFunctions::StateMachine",
                 "Properties": {
                     "DefinitionString": {
                         "Fn::Sub": [
                             "{\n  \"Comment\": \"A Hello World example using an AWS Lambda function\",\n  \"StartAt\": \"HelloWorld\",\n  \"States\": {\n    \"HelloWorld\": {\n      \"Type\": \"Task\",\n      \"Resource\": \"${lambdaArn}\",\n      \"End\": true\n    }\n  }\n}",
                             {
                                 "lambdaArn": {
                                     "Fn::GetAtt": [
                                         "MyLambdaFunction",
                                         "Arn"
                                     ]
                                 }
                             }
                         ]
                     },
                     "RoleArn": {
                         "Fn::GetAtt": [
                             "StatesExecutionRole",
                             "Arn"
                         ]
                     }
                 }
             }
         }
     }
   ```

------

1. [CloudFormation 콘솔](https://console.aws.amazon.com/cloudformation/home)을 열고 **스택 생성**을 선택합니다.

1. **템플릿 선택** 페이지에서 **Amazon S3에 템플릿 업로드**를 선택합니다. `MyStateMachine` 파일을 선택한 후 **다음**을 선택합니다.

1. **세부 정보 지정** 페이지에서 **스택 이름**에 `MyStateMachine`을 입력한 후 **다음**을 선택합니다.

1. **옵션** 페이지에서 **다음**을 선택합니다.

1. **검토** 페이지에서 **I acknowledge that CloudFormation might create IAM resources**를 선택한 다음 **생성**을 선택합니다.

   CloudFormation 가 `MyStateMachine` 스택 생성을 시작하고 **CREATE\$1IN\$1PROGRESS** 상태를 표시합니다. 이 과정이 완료되면 CloudFormation 에는 **CREATE\$1COMPLETE** 상태가 표시됩니다.

1. (선택 사항) 스택에 리소스를 표시하려면 스택을 선택하고 [**Resources** ] 탭을 선택합니다.

## 3단계: 상태 머신 실행 시작
<a name="lambda-state-machine-cfn-step-3"></a>

Lambda 상태 머신을 만들었으면 실행을 시작할 수 있습니다.

### 상태 머신 실행을 시작하려면
<a name="to-start-the-state-machine-execution"></a>

1. [Step Functions 콘솔](https://console.aws.amazon.com/states/home)을 열고를 사용하여 생성한 상태 시스템의 이름을 선택합니다 CloudFormation.

1. [***MyStateMachine-ABCDEFGHIJ1K***] 페이지에서 [**New execution**]을 선택합니다.

   [**New execution**] 페이지가 표시됩니다.

1. (선택 사항) 생성된 기본값을 재정의하려면 사용자 지정 실행 이름을 입력합니다.
**비 ASCII 이름 및 로깅**  
Step Functions는 비 ASCII 문자가 포함된 상태 머신, 실행, 활동 및 레이블 이름을 허용합니다. 이러한 문자는 Amazon CloudWatch에서 데이터 로깅을 방지하므로 Step Functions 지표를 추적할 수 있도록 ASCII 문자만 사용하는 것이 좋습니다.

1. **실행 시작**을 선택합니다.

   상태 머신의 새로운 실행이 시작되고 실행 중인 실행을 보여주는 새로운 페이지가 표시됩니다.

1. (선택 사항) **실행 세부 정보**에서 **실행 상태**와 **시작** 및 **종료됨** 타임스탬프를 검토합니다.

1. 실행 결과를 보려면 **Output(출력)**을 선택합니다.

# AWS CDK 를 사용하여 Step Functions에서 표준 워크플로 생성
<a name="tutorial-lambda-state-machine-cdk"></a>

AWS Cloud Development Kit (AWS CDK) 코드형 인프라(IaC)프레임워크를 사용하여 AWS Lambda 함수가 포함된 AWS Step Functions 상태 머신을 생성할 수 있습니다.

의 CDK지원되는 언어 중 하나를 사용하여 AWS 인프라를 정의합니다. 인프라를 정의한 후 앱을 CloudFormation 템플릿에 합성하고 AWS 계정에 배포합니다.

 이 방법을 사용하여 Lambda 함수가 포함된 Step Functions 상태 머신을 정의한 다음 Step Functions AWS Management Console을 사용하여 상태 머신을 실행합니다.

이 자습서를 시작하기 전에 *AWS Cloud Development Kit (AWS CDK) 개발자 안내서*의 [AWS CDK 시작하기 - 사전 조건](https://docs.aws.amazon.com/cdk/latest/guide/getting_started.html#getting_started_prerequisites)의 설명대로 AWS CDK 개발 환경을 설정해야 합니다. 그런 다음 다음 명령으로 AWS CLI에 AWS CDK를 설치합니다.

```
npm install -g aws-cdk
```

이 자습서에서는 [CloudFormation 를 사용하여 Step Functions에서 워크플로 생성](tutorial-lambda-state-machine-cloudformation.md)와 동일한 결과를 생성합니다. 하지만 이 자습서에서 AWS CDK를 사용하기 위해 IAM 역할을 만들 필요가 없습니다. AWS CDK에서 자동으로 만듭니다. AWS CDK 버전에도 상태 머신에 단계를 추가하는 방법을 설명하는 [Succeed 워크플로 상태](state-succeed.md) 단계가 포함되어 있습니다.

**작은 정보**  
TypeScript와 AWS CDK 함께를 사용하여 Step Functions 워크플로를 시작하는 샘플 서버리스 애플리케이션을 배포하려면 워크숍의 [를 사용하여 배포AWS CDK](https://catalog.workshops.aws/stepfunctions/iac/deploy-with-cdk)를 참조하세요. * AWS Step Functions * 

## 1단계: AWS CDK 프로젝트 설정
<a name="lambda-state-machine-cdk-step-1"></a>

1. 홈 디렉터리 또는 원하는 경우 다른 디렉터리에서 다음 명령을 실행하여 새 AWS CDK 앱을 위한 디렉터리를 만듭니다.
**중요**  
디렉터리 이름을 `step`으로 지정해야 합니다. AWS CDK 애플리케이션 템플릿은 디렉터리 이름을 사용하여 소스 파일과 클래스의 이름을 생성합니다. 다른 이름을 사용하는 경우 앱이 이 자습서와 일치하지 않습니다.

------
#### [ TypeScript ]

   ```
   mkdir step && cd step
   ```

------
#### [ JavaScript ]

   ```
   mkdir step && cd step
   ```

------
#### [ Python ]

   ```
   mkdir step && cd step
   ```

------
#### [ Java ]

   ```
   mkdir step && cd step
   ```

------
#### [ C\$1 ]

   .NET 버전 6.0 이상을 설치했는지 확인합니다. 자세한 내용은 [지원되는 버전](https://dotnet.microsoft.com/en-us/download/dotnet)을 참조하세요.

   ```
   mkdir step && cd step
   ```

------

1. **cdk init** 명령을 사용하여 앱을 초기화합니다. 다음 예제와 같이 원하는 템플릿(“app”)과 프로그래밍 언어를 지정합니다.

------
#### [ TypeScript ]

   ```
   cdk init --language typescript
   ```

------
#### [ JavaScript ]

   ```
   cdk init --language javascript
   ```

------
#### [ Python ]

   ```
   cdk init --language python
   ```

   프로젝트가 초기화되면 프로젝트의 가상 환경을 활성화하고 AWS CDK 기준선 종속성을 설치합니다.

   ```
   source .venv/bin/activate
   python -m pip install -r requirements.txt
   ```

------
#### [ Java ]

   ```
   cdk init --language java
   ```

------
#### [ C\$1 ]

   ```
   cdk init --language csharp
   ```

------

## 2단계: AWS CDK를 사용하여 상태 머신 만들기
<a name="lambda-state-machine-cdk-step-2"></a>

먼저 Lambda 함수와 Step Functions 상태 머신을 정의하는 개별 코드 조각을 살펴보겠습니다. 그런 다음 AWS CDK 앱에 이들을 배치하는 방법을 설명하겠습니다. 마지막으로 이러한 리소스를 합성하고 배포하는 방법을 살펴보겠습니다.

### Lambda 함수를 만들려면
<a name="lambda-state-machine-cdk-create-function"></a>

다음 AWS CDK 코드는 Lambda 함수를 정의하고 소스 코드를 인라인으로 제공합니다.

------
#### [ TypeScript ]

```
const helloFunction = new lambda.Function(this, 'MyLambdaFunction', {
    code: lambda.Code.fromInline(`
          exports.handler = (event, context, callback) => {
              callback(null, "Hello World!");
          };
      `),
    runtime: lambda.Runtime.NODEJS_18_X,
    handler: "index.handler",
    timeout: cdk.Duration.seconds(3)
});
```

------
#### [ JavaScript ]

```
const helloFunction = new lambda.Function(this, 'MyLambdaFunction', {
    code: lambda.Code.fromInline(`
          exports.handler = (event, context, callback) => {
              callback(null, "Hello World!");
          };
      `),
    runtime: lambda.Runtime.NODEJS_18_X,
    handler: "index.handler",
    timeout: cdk.Duration.seconds(3)
});
```

------
#### [ Python ]

```
hello_function = lambda_.Function(
            self, "MyLambdaFunction",
            code=lambda_.Code.from_inline("""
            exports.handler = (event, context, callback) => {
                callback(null, "Hello World!");
                }"""),
                runtime=lambda_.Runtime.NODEJS_18_X,
                handler="index.handler",
                timeout=Duration.seconds(25))
```

------
#### [ Java ]

```
final Function helloFunction = Function.Builder.create(this, "MyLambdaFunction")
        .code(Code.fromInline(
                "exports.handler = (event, context, callback) => { callback(null, 'Hello World!' );}"))
        .runtime(Runtime.NODEJS_18_X)
        .handler("index.handler")
        .timeout(Duration.seconds(25))
        .build();
```

------
#### [ C\$1 ]

```
var helloFunction = new Function(this, "MyLambdaFunction", new FunctionProps
{
    Code = Code.FromInline(@"`
      exports.handler = (event, context, callback) => {
        callback(null, 'Hello World!');
      }"),
    Runtime = Runtime.NODEJS_12_X,
    Handler = "index.handler",
    Timeout = Duration.Seconds(25)
});
```

------

이 짧은 예제 코드에서 다음을 확인할 수 있습니다.
+ 함수의 논리명(`MyLambdaFunction`)
+ AWS CDK 앱의 소스 코드에 문자열로 임베딩된 함수의 소스 코드
+ 기타 함수 속성(예: 사용할 런타임(Node 18.x)), 함수 진입점 및 제한 시간

### 상태 머신을 생성하려면
<a name="lambda-state-machine-cdk-create"></a>

상태 머신에는 Lambda 함수 작업과 [Succeed 워크플로 상태](state-succeed.md) 상태 등 두 가지 상태가 있습니다. 함수를 사용하려면 함수를 간접적으로 호출하는 Step Functions [Task 워크플로 상태](state-task.md)를 만들어야 합니다. 이 Task 상태는 상태 머신의 첫 번째 단계로 사용됩니다. Task 상태의 `next()` 메서드를 통해 Success 상태가 상태 머신에 추가됩니다. 다음 코드는 먼저 `MyLambdaTask` 함수를 간접적으로 호출한 다음 `next()` 메서드를 사용하여 `GreetedWorld` 성공 상태를 정의합니다.

------
#### [ TypeScript ]

```
const stateMachine = new sfn.StateMachine(this, 'MyStateMachine', {
  definition: new tasks.LambdaInvoke(this, "MyLambdaTask", {
    lambdaFunction: helloFunction
  }).next(new sfn.Succeed(this, "GreetedWorld"))
});
```

------
#### [ JavaScript ]

```
const stateMachine = new sfn.StateMachine(this, 'MyStateMachine', {
  definition: new tasks.LambdaInvoke(this, "MyLambdaTask", {
    lambdaFunction: helloFunction
  }).next(new sfn.Succeed(this, "GreetedWorld"))
});
```

------
#### [ Python ]

```
state_machine = sfn.StateMachine(
                                 self, "MyStateMachine",
                                 definition=tasks.LambdaInvoke(
                                 self, "MyLambdaTask",
                                 lambda_function=hello_function)
                                 .next(sfn.Succeed(self, "GreetedWorld")))
```

------
#### [ Java ]

```
final StateMachine stateMachine = StateMachine.Builder.create(this, "MyStateMachine")
        .definition(LambdaInvoke.Builder.create(this, "MyLambdaTask")
            .lambdaFunction(helloFunction)
            .build()
            .next(new Succeed(this, "GreetedWorld")))
        .build();
```

------
#### [ C\$1 ]

```
var stateMachine = new StateMachine(this, "MyStateMachine", new StateMachineProps {
    DefinitionBody = DefinitionBody.FromChainable(new LambdaInvoke(this, "MyLambdaTask", new LambdaInvokeProps
    {
        LambdaFunction = helloFunction
    })
    .Next(new Succeed(this, "GreetedWorld")))
});
```

------

### AWS CDK 앱을 빌드하고 배포하기
<a name="lambda-state-machine-cdk-app"></a>

새롭게 만든 AWS CDK 프로젝트에서 스택 정의가 포함된 파일을 다음 예제와 비슷하게 편집합니다. 이전 섹션에서 살펴본 Lambda 함수와 Step Functions 상태 머신의 정의를 이해합니다.

1. 다음 예제와 같이 스택을 업데이트합니다.

------
#### [ TypeScript ]

   다음 코드로 `lib/step-stack.ts`를 업데이트합니다.

   ```
   import * as cdk from 'aws-cdk-lib';
   import * as lambda from 'aws-cdk-lib/aws-lambda';
   import * as sfn from 'aws-cdk-lib/aws-stepfunctions';
   import * as tasks from 'aws-cdk-lib/aws-stepfunctions-tasks';
   
   export class StepStack extends cdk.Stack {
     constructor(app: cdk.App, id: string) {
       super(app, id);
   
       const helloFunction = new lambda.Function(this, 'MyLambdaFunction', {
         code: lambda.Code.fromInline(`
             exports.handler = (event, context, callback) => {
                 callback(null, "Hello World!");
             };
         `),
         runtime: lambda.Runtime.NODEJS_18_X,
         handler: "index.handler",
         timeout: cdk.Duration.seconds(3)
       });
   
       const stateMachine = new sfn.StateMachine(this, 'MyStateMachine', {
         definition: new tasks.LambdaInvoke(this, "MyLambdaTask", {
           lambdaFunction: helloFunction
         }).next(new sfn.Succeed(this, "GreetedWorld"))
       });
     }
   }
   ```

------
#### [ JavaScript ]

   다음 코드로 `lib/step-stack.js`를 업데이트합니다.

   ```
   import * as cdk from 'aws-cdk-lib';
   import * as lambda from 'aws-cdk-lib/aws-lambda';
   import * as sfn from 'aws-cdk-lib/aws-stepfunctions';
   import * as tasks from 'aws-cdk-lib/aws-stepfunctions-tasks';
   
   export class StepStack extends cdk.Stack {
     constructor(app, id) {
       super(app, id);
   
       const helloFunction = new lambda.Function(this, 'MyLambdaFunction', {
         code: lambda.Code.fromInline(`
             exports.handler = (event, context, callback) => {
                 callback(null, "Hello World!");
             };
         `),
         runtime: lambda.Runtime.NODEJS_18_X,
         handler: "index.handler",
         timeout: cdk.Duration.seconds(3)
       });
   
       const stateMachine = new sfn.StateMachine(this, 'MyStateMachine', {
         definition: new tasks.LambdaInvoke(this, "MyLambdaTask", {
           lambdaFunction: helloFunction
         }).next(new sfn.Succeed(this, "GreetedWorld"))
       });
     }
   }
   ```

------
#### [ Python ]

   다음 코드로 `step/step_stack.py`를 업데이트합니다.

   ```
   from aws_cdk import (
       Duration,
       Stack,
       aws_stepfunctions as sfn,
       aws_stepfunctions_tasks as tasks,
       aws_lambda as lambda_
   )
   class StepStack(Stack):
   
       def __init__(self, scope: Construct, construct_id: str, **kwargs) -> None:
           super().__init__(scope, construct_id, **kwargs)
   
           hello_function = lambda_.Function(
               self, "MyLambdaFunction",
               code=lambda_.Code.from_inline("""
               exports.handler = (event, context, callback) => {
                   callback(null, "Hello World!");
                   }"""),
                   runtime=lambda_.Runtime.NODEJS_18_X,
                   handler="index.handler",
                   timeout=Duration.seconds(25))
   
           state_machine = sfn.StateMachine(
               self, "MyStateMachine",
               definition=tasks.LambdaInvoke(
               self, "MyLambdaTask",
               lambda_function=hello_function)
               .next(sfn.Succeed(self, "GreetedWorld")))
   ```

------
#### [ Java ]

   다음 코드로 `src/main/java/com.myorg/StepStack.java`를 업데이트합니다.

   ```
   package com.myorg;
   
   import software.constructs.Construct;
   import software.amazon.awscdk.Stack;
   import software.amazon.awscdk.StackProps;
   import software.amazon.awscdk.Duration;
   import software.amazon.awscdk.services.lambda.Code;
   import software.amazon.awscdk.services.lambda.Function;
   import software.amazon.awscdk.services.lambda.Runtime;
   import software.amazon.awscdk.services.stepfunctions.StateMachine;
   import software.amazon.awscdk.services.stepfunctions.Succeed;
   import software.amazon.awscdk.services.stepfunctions.tasks.LambdaInvoke;
   
   public class StepStack extends Stack {
       public StepStack(final Construct scope, final String id) {
           this(scope, id, null);
       }
   
       public StepStack(final Construct scope, final String id, final StackProps props) {
           super(scope, id, props);
   
           final Function helloFunction = Function.Builder.create(this, "MyLambdaFunction")
                   .code(Code.fromInline(
                           "exports.handler = (event, context, callback) => { callback(null, 'Hello World!' );}"))
                   .runtime(Runtime.NODEJS_18_X)
                   .handler("index.handler")
                   .timeout(Duration.seconds(25))
                   .build();
   
           final StateMachine stateMachine = StateMachine.Builder.create(this, "MyStateMachine")
                   .definition(LambdaInvoke.Builder.create(this, "MyLambdaTask")
                           .lambdaFunction(helloFunction)
                           .build()
                           .next(new Succeed(this, "GreetedWorld")))
                   .build();
       }
   }
   ```

------
#### [ C\$1 ]

   다음 코드로 `src/Step/StepStack.cs`를 업데이트합니다.

   ```
   using Amazon.CDK;
   using Constructs;
   using Amazon.CDK.AWS.Lambda;
   using Amazon.CDK.AWS.StepFunctions;
   using Amazon.CDK.AWS.StepFunctions.Tasks;
   
   namespace Step
   {
       public class StepStack : Stack
       {
           internal StepStack(Construct scope, string id, IStackProps props = null) : base(scope, id, props)
           {
               var helloFunction = new Function(this, "MyLambdaFunction", new FunctionProps
               {
                   Code = Code.FromInline(@"exports.handler = (event, context, callback) => {
                       callback(null, 'Hello World!');
                   }"),
                   Runtime = Runtime.NODEJS_18_X,
                   Handler = "index.handler",
                   Timeout = Duration.Seconds(25)
               });
   
               var stateMachine = new StateMachine(this, "MyStateMachine", new StateMachineProps
               {
                   DefinitionBody = DefinitionBody.FromChainable(new LambdaInvoke(this, "MyLambdaTask", new LambdaInvokeProps
                   {
                       LambdaFunction = helloFunction
                   })
                   .Next(new Succeed(this, "GreetedWorld")))
               });
           }
       }
   }
   ```

------

1. 소스 파일을 저장한 다음 앱의 기본 디렉터리에서 `cdk synth` 명령을 실행합니다.

   AWS CDK에서 앱을 실행하고 앱에서 CloudFormation 템플릿을 합성합니다. 그러면 AWS CDK에서 템플릿을 표시합니다.
**참고**  
TypeScript를 사용하여 AWS CDK 프로젝트를 만든 경우 `cdk synth` 명령을 실행하면 다음 오류가 반환될 수 있습니다.  

   ```
   TSError: ⨯ Unable to compile TypeScript:
   bin/step.ts:7:33 - error TS2554: Expected 2 arguments, but got 3.
   ```
다음 예제와 같이 `bin/step.ts` 파일을 수정하여 이 오류를 해결합니다.  

   ```
   #!/usr/bin/env node
   import 'source-map-support/register';
   import * as cdk from 'aws-cdk-lib';
   import { StepStack } from '../lib/step-stack';
   
   const app = new cdk.App();
   new StepStack(app, 'StepStack');
   app.synth();
   ```

1. Lambda 함수와 Step Functions 상태 머신을 AWS 계정에 배포하려면 `cdk deploy`를 실행합니다. 가 AWS CDK 생성한 IAM 정책을 승인하라는 메시지가 표시됩니다.

## 3단계: 상태 머신 실행 시작
<a name="lambda-state-machine-cdk-step-3"></a>

상태 머신을 만든 후에 실행을 시작할 수 있습니다.

### 상태 머신 실행을 시작하려면
<a name="to-start-the-state-machine-execution"></a>

1. [Step Functions 콘솔](https://console.aws.amazon.com/states/home)을 열고 AWS CDK을 사용하여 만든 상태 머신의 이름을 선택합니다.

1. 상태 머신 페이지에서 **실행 시작**을 선택합니다.

   **실행 시작** 대화 상자가 표시됩니다.

1. (선택 사항) 생성된 기본값을 재정의하려면 사용자 지정 실행 이름을 입력합니다.
**비 ASCII 이름 및 로깅**  
Step Functions는 비 ASCII 문자가 포함된 상태 머신, 실행, 활동 및 레이블 이름을 허용합니다. 이러한 문자는 Amazon CloudWatch에서 데이터 로깅을 방지하므로 Step Functions 지표를 추적할 수 있도록 ASCII 문자만 사용하는 것이 좋습니다.

1. **실행 시작**을 선택합니다.

   상태 머신 실행이 시작되고 실행 중인 실행을 보여주는 새로운 페이지가 표시됩니다.

1. Step Functions 콘솔은 실행 ID가 제목인 페이지로 이동합니다. 이 페이지를 *실행 세부 정보* 페이지라고 합니다. 실행이 진행되는 동안 또는 완료된 후에 이 페이지에서 실행 결과를 검토할 수 있습니다.

   실행 결과를 검토하려면 **그래프 보기**에서 개별 상태를 선택한 다음 [단계 세부 정보](concepts-view-execution-details.md#exec-details-intf-step-details) 창에서 개별 탭을 선택하여 입력, 출력 및 정의가 포함된 각 상태의 세부 정보를 각각 봅니다. *실행 세부 정보* 페이지에서 볼 수 있는 실행 정보에 대한 자세한 내용은 [실행 세부 정보 개요](concepts-view-execution-details.md#exec-details-interface-overview) 섹션을 참조하세요.

## 4단계: 정리
<a name="lambda-state-machine-cdk-step-4"></a>

상태 머신을 테스트한 후에는 상태 머신과 관련 Lambda 함수를 모두 제거하여 AWS 계정에서 리소스를 확보하는 것이 좋습니다. 앱의 기본 디렉터리에서 `cdk destroy` 명령을 실행하여 상태 머신을 제거합니다.

## 다음 단계
<a name="lambda-state-machine-cdk-next-steps"></a>

를 사용하여 AWS 인프라를 개발하는 방법에 대한 자세한 내용은 [AWS CDK 개발자 안내서](https://docs.aws.amazon.com/cdk/v2/guide/home.html)를 AWS CDK참조하세요.

선택한 언어로 AWS CDK 앱을 작성하는 방법에 대한 내용은 다음을 참조하세요.

------
#### [ TypeScript ]

 [TypeScript에서 AWS CDK 사용](https://docs.aws.amazon.com/cdk/v2/guide/work-with-cdk-typescript.html)용 

------
#### [ JavaScript ]

 [JavaScript에서 AWS CDK 사용](https://docs.aws.amazon.com/cdk/v2/guide/work-with-cdk-javascript.html) 

------
#### [ Python ]

 [Python에서 AWS CDK 사용](https://docs.aws.amazon.com/cdk/v2/guide/work-with-cdk-python.html) 

------
#### [ Java ]

 [Java에서 AWS CDK 사용](https://docs.aws.amazon.com/cdk/v2/guide/work-with-cdk-java.html) 

------
#### [ C\$1 ]

 [C\$1에서 AWS CDK 사용](https://docs.aws.amazon.com/cdk/v2/guide/work-with-cdk-csharp.html) 

------

이 자습서에서 사용되는 AWS Construct Library 모듈에 대한 자세한 내용은 다음 AWS CDK API 참조 개요를 참조하세요.
+  [aws-lambda](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_lambda-readme.html) 
+  [aws-stepfunctions](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_stepfunctions-readme.html) 
+  [aws-stepfunctions-tasks](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_stepfunctions_tasks-readme.html) 

# AWS CDK 를 사용하여 Step Functions에서 Express 워크플로 생성
<a name="tutorial-step-functions-rest-api-integration-cdk"></a>

이 자습서에서는 코드형 AWS Cloud Development Kit (AWS CDK) 인프라(IAC) 프레임워크를 사용하여 동기식 Express 상태 시스템을 백엔드 통합으로 사용하여 API Gateway REST API를 생성하는 방법을 알아봅니다.

`StepFunctionsRestApi` 구조를 사용하여 상태 시스템을 API Gateway에 연결합니다. `StepFunctionsRestApi` 구조는 필수 권한 및 HTTP “ANY” 메서드와 함께 기본 입력/출력 매핑과 API Gateway REST API를 설정합니다.

 AWS CDK 는 코드형 인프라(IAC) 프레임워크이므로 프로그래밍 언어를 사용하여 AWS 인프라를 정의합니다. CDK에서 지원하는 언어 중 하나로 앱을 정의하고 코드를 CloudFormation 템플릿으로 합성한 다음 AWS 계정에 인프라를 배포합니다.

 CloudFormation 를 사용하여 동기 Express 상태 시스템과 백엔드로 통합된 API Gateway REST API를 정의한 다음를 사용하여 실행 AWS Management Console 을 시작합니다.

이 자습서를 시작하기 전에 [AWS CDK 사전 조건 시작하기](https://docs.aws.amazon.com/cdk/latest/guide/getting_started.html#getting_started_prerequisites)에 설명된 대로 AWS CDK 개발 환경을 설정한 다음 다음을 실행 AWS CDK 하여를 설치합니다.

```
npm install -g aws-cdk
```

## 1단계: AWS CDK 프로젝트 설정
<a name="step-functions-rest-api-integration-cdk-step-1"></a>

먼저 새 AWS CDK 앱의 디렉터리를 생성하고 프로젝트를 초기화합니다.

------
#### [ TypeScript ]

```
mkdir stepfunctions-rest-api
cd stepfunctions-rest-api
cdk init --language typescript
```

------
#### [ JavaScript ]

```
mkdir stepfunctions-rest-api
cd stepfunctions-rest-api
cdk init --language javascript
```

------
#### [ Python ]

```
mkdir stepfunctions-rest-api
cd stepfunctions-rest-api
cdk init --language python
```

프로젝트가 초기화된 후 프로젝트의 가상 환경을 활성화하고 AWS CDK의 기준 종속성을 설치합니다.

```
source .venv/bin/activate
python -m pip install -r requirements.txt
```

------
#### [ Java ]

```
mkdir stepfunctions-rest-api
cd stepfunctions-rest-api
cdk init --language java
```

------
#### [ C\$1 ]

```
mkdir stepfunctions-rest-api
cd stepfunctions-rest-api
cdk init --language csharp
```

------
#### [ Go ]

```
mkdir stepfunctions-rest-api
cd stepfunctions-rest-api
cdk init --language go
```

------

**참고**  
디렉터리 이름을 `stepfunctions-rest-api`으로 지정해야 합니다. AWS CDK 애플리케이션 템플릿은 디렉터리 이름을 사용하여 소스 파일과 클래스의 이름을 생성합니다. 다른 이름을 사용하는 경우 앱이 이 자습서와 일치하지 않습니다.

이제 AWS Step Functions 및 Amazon API Gateway용 구문 라이브러리 모듈을 설치합니다.

------
#### [ TypeScript ]

```
npm install @aws-cdk/aws-stepfunctions @aws-cdk/aws-apigateway
```

------
#### [ JavaScript ]

```
npm install @aws-cdk/aws-stepfunctions @aws-cdk/aws-apigateway
```

------
#### [ Python ]

```
python -m pip install aws-cdk.aws-stepfunctions
python -m pip install aws-cdk.aws-apigateway
```

------
#### [ Java ]

프로젝트의 `pom.xml`을 편집하여 기존 `<dependencies>` 컨테이너 내에 다음 종속성을 추가합니다.

```
        <dependency>
            <groupId>software.amazon.awscdk</groupId>
            <artifactId>stepfunctions</artifactId>
            <version>${cdk.version}</version>
        </dependency>
        <dependency>
            <groupId>software.amazon.awscdk</groupId>
            <artifactId>apigateway</artifactId>
            <version>${cdk.version}</version>
        </dependency>
```

Maven은 다음에 앱을 구축할 때 이러한 종속성을 자동으로 설치합니다. 구축하려면 `mvn compile`을 실행하거나 Java IDE의 **Build** 명령을 사용합니다.

------
#### [ C\$1 ]

```
dotnet add src/StepfunctionsRestApi package Amazon.CDK.AWS.Stepfunctions
dotnet add src/StepfunctionsRestApi package Amazon.CDK.AWS.APIGateway
```

Visual Studio NuGet GUI를 사용해 표시된 패키지를 설치할 수도 있습니다. Visual Studio NuGet GUI는 **도구(Tools)** > **NuGet 패키지 관리자(NuGet Package Manager)** > **솔루션용 NuGet 패키지 관리(Manage NuGet Packages for Solution)**에서 사용할 수 있습니다.

------

모듈을 설치한 후에는 다음 패키지를 가져와서 AWS CDK 앱에서 사용할 수 있습니다.

------
#### [ TypeScript ]

```
@aws-cdk/aws-stepfunctions
@aws-cdk/aws-apigateway
```

------
#### [ JavaScript ]

```
@aws-cdk/aws-stepfunctions
@aws-cdk/aws-apigateway
```

------
#### [ Python ]

```
aws_cdk.aws_stepfunctions
aws_cdk.aws_apigateway
```

------
#### [ Java ]

```
software.amazon.awscdk.services.apigateway.StepFunctionsRestApi
software.amazon.awscdk.services.stepfunctions.Pass
software.amazon.awscdk.services.stepfunctions.StateMachine
software.amazon.awscdk.services.stepfunctions.StateMachineType
```

------
#### [ C\$1 ]

```
Amazon.CDK.AWS.StepFunctions
Amazon.CDK.AWS.APIGateway
```

------
#### [ Go ]

다음을 `stepfunctions-rest-api.go` 내 `import`에 추가합니다.

```
"github.com/aws/aws-cdk-go/awscdk/awsapigateway"
"github.com/aws/aws-cdk-go/awscdk/awsstepfunctions"
```

------

## 2단계: AWS CDK 를 사용하여 동기 Express 상태 시스템 백엔드 통합으로 API Gateway REST API 생성
<a name="step-functions-rest-api-integration-cdk-step-2"></a>

먼저 동기 Express 상태 시스템과 API Gateway REST API를 정의하는 개별 코드 조각을 살펴본 다음 이를 AWS CDK 앱에 함께 배치하는 방법을 설명하겠습니다. 그런 다음 이러한 리소스를 합성하고 배포하는 방법을 알아보겠습니다.

**참고**  
여기에 표시되는 상태 시스템은 `Pass` 상태가 있는 단순한 상태 시스템입니다.

### Express 상태 시스템 만들기
<a name="step-functions-rest-api-integration-cdk-create-state-machine"></a>

상태가 있는 간단한 상태 시스템을 정의하는 AWS CDK 코드입니다`Pass`.

------
#### [ TypeScript ]

```
const machineDefinition = new stepfunctions.Pass(this, 'PassState', {
    result: {value:"Hello!"},
})

const stateMachine = new stepfunctions.StateMachine(this, 'MyStateMachine', {
    definition: machineDefinition,
    stateMachineType: stepfunctions.StateMachineType.EXPRESS,
});
```

------
#### [ JavaScript ]

```
const machineDefinition = new sfn.Pass(this, 'PassState', {
    result: {value:"Hello!"},
})

const stateMachine = new sfn.StateMachine(this, 'MyStateMachine', {
    definition: machineDefinition,
    stateMachineType: stepfunctions.StateMachineType.EXPRESS,
});
```

------
#### [ Python ]

```
machine_definition = sfn.Pass(self,"PassState", 
                        result = sfn.Result("Hello"))
    
state_machine = sfn.StateMachine(self, 'MyStateMachine', 
        definition = machine_definition, 
        state_machine_type = sfn.StateMachineType.EXPRESS)
```

------
#### [ Java ]

```
Pass machineDefinition = Pass.Builder.create(this, "PassState")
                        .result(Result.fromString("Hello"))
                        .build();

StateMachine stateMachine = StateMachine.Builder.create(this, "MyStateMachine")
                            .definition(machineDefinition)
                            .stateMachineType(StateMachineType.EXPRESS)
                            .build();
```

------
#### [ C\$1 ]

```
var machineDefinition = new Pass(this, "PassState", new PassProps
{
    Result = Result.FromString("Hello")
});

var stateMachine = new StateMachine(this, "MyStateMachine", new StateMachineProps
{
    Definition = machineDefinition,
    StateMachineType = StateMachineType.EXPRESS
});
```

------
#### [ Go ]

```
var machineDefinition = awsstepfunctions.NewPass(stack, jsii.String("PassState"), &awsstepfunctions.PassProps
{
    Result: awsstepfunctions.NewResult(jsii.String("Hello")),
})

var stateMachine = awsstepfunctions.NewStateMachine(stack, jsii.String("StateMachine"), &awsstepfunctions.StateMachineProps
{    
    Definition: machineDefinition,
    StateMachineType: awsstepfunctions.StateMachineType_EXPRESS,
})
```

------

이 짧은 조각에서 확인할 수 있는 항목은 다음과 같습니다.
+ `PassState` 시스템 정의(`Pass` 상태)
+ 상태 시스템의 논리명(`MyStateMachine`)
+ 상태 시스템 정의로 사용되는 시스템 정의
+ `StepFunctionsRestApi`에서 동기 Express 상태 시스템만 허용하기 때문에 `EXPRESS`로 설정된 상태 시스템 유형

### `StepFunctionsRestApi` 구성을 사용하여 API Gateway REST API 만들기
<a name="step-functions-rest-api-integration-cdk-create-rest-api"></a>

`StepFunctionsRestApi` 구성을 사용하여 필요한 권한과 기본 입력/출력 매핑이 있는 API Gateway REST API를 만듭니다.

------
#### [ TypeScript ]

```
const api = new apigateway.StepFunctionsRestApi(this, 
  'StepFunctionsRestApi', { stateMachine: stateMachine });
```

------
#### [ JavaScript ]

```
const api = new apigateway.StepFunctionsRestApi(this, 
  'StepFunctionsRestApi', { stateMachine: stateMachine });
```

------
#### [ Python ]

```
api = apigw.StepFunctionsRestApi(self, "StepFunctionsRestApi",
                            state_machine = state_machine)
```

------
#### [ Java ]

```
StepFunctionsRestApi api = StepFunctionsRestApi.Builder.create(this, "StepFunctionsRestApi")
                           .stateMachine(stateMachine)
                           .build();
```

------
#### [ C\$1 ]

```
var api = new StepFunctionsRestApi(this, "StepFunctionsRestApi", new StepFunctionsRestApiProps
{
    StateMachine = stateMachine
});
```

------
#### [ Go ]

```
awsapigateway.NewStepFunctionsRestApi(stack, jsii.String("StepFunctionsRestApi"), &awsapigateway.StepFunctionsRestApiProps
{
    StateMachine = stateMachine,
})
```

------

### AWS CDK 앱을 빌드하고 배포하려면
<a name="step-functions-rest-api-integration-cdk-app"></a>

생성한 AWS CDK 프로젝트에서 스택의 정의가 포함된 파일을 아래 코드처럼 편집합니다. 위에서 Step Functions 상태 시스템과 API Gateway의 정의를 이해합니다.

------
#### [ TypeScript ]

` lib/stepfunctions-rest-api-stack.ts`를 업데이트하여 다음을 확인합니다.

```
import * as cdk from 'aws-cdk-lib';
import * as stepfunctions from 'aws-cdk-lib/aws-stepfunctions' 
import * as apigateway from 'aws-cdk-lib/aws-apigateway';


export class StepfunctionsRestApiStack extends cdk.Stack {
    constructor(scope: cdk.App, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    const machineDefinition = new stepfunctions.Pass(this, 'PassState', {
        result: {value:"Hello!"},
    });
    
    const stateMachine = new stepfunctions.StateMachine(this, 'MyStateMachine', {
        definition: machineDefinition,
        stateMachineType: stepfunctions.StateMachineType.EXPRESS,
    });
    
    const api = new apigateway.StepFunctionsRestApi(this, 
        'StepFunctionsRestApi', { stateMachine: stateMachine });
```

------
#### [ JavaScript ]

`lib/stepfunctions-rest-api-stack.js`를 업데이트하여 다음을 확인합니다.

```
const cdk = require('@aws-cdk/core');
const stepfunctions = require('@aws-cdk/aws-stepfunctions');
const apigateway = require('@aws-cdk/aws-apigateway');


class StepfunctionsRestApiStack extends cdk.Stack {
    constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    const machineDefinition = new stepfunctions.Pass(this, "PassState", {
        result: {value:"Hello!"},
    })
    
    const stateMachine = new sfn.StateMachine(this, 'MyStateMachine', {
        definition: machineDefinition,
        stateMachineType: stepfunctions.StateMachineType.EXPRESS,
    });
    
    const api = new apigateway.StepFunctionsRestApi(this, 
        'StepFunctionsRestApi', { stateMachine: stateMachine });

    }
}

module.exports = { StepStack }
```

------
#### [ Python ]

`stepfunctions_rest_api/stepfunctions_rest_api_stack.py`를 업데이트하여 다음을 확인합니다.

```
from aws_cdk import App, Stack
from constructs import Construct
from aws_cdk import aws_stepfunctions as sfn
from aws_cdk import aws_apigateway as apigw

class StepfunctionsRestApiStack(Stack):

    def __init__(self, scope: Construct, construct_id: str, **kwargs) -> None:
        super().__init__(scope, construct_id, **kwargs)
        
        
        machine_definition = sfn.Pass(self,"PassState", 
                                result = sfn.Result("Hello"))

        state_machine = sfn.StateMachine(self, 'MyStateMachine', 
                definition = machine_definition, 
                state_machine_type = sfn.StateMachineType.EXPRESS)

        api = apigw.StepFunctionsRestApi(self, 
                    "StepFunctionsRestApi",
                    state_machine = state_machine)
```

------
#### [ Java ]

`src/main/java/com.myorg/StepfunctionsRestApiStack.java`를 업데이트하여 다음을 확인합니다.

```
package com.myorg;


import software.amazon.awscdk.core.Construct;
import software.amazon.awscdk.core.Stack;
import software.amazon.awscdk.core.StackProps;
import software.amazon.awscdk.services.stepfunctions.Pass;
import software.amazon.awscdk.services.stepfunctions.StateMachine;
import software.amazon.awscdk.services.stepfunctions.StateMachineType;
import software.amazon.awscdk.services.apigateway.StepFunctionsRestApi;

public class StepfunctionsRestApiStack extends Stack {
    public StepfunctionsRestApiStack(final Construct scope, final String id) {
        this(scope, id, null);
    }

    public StepfunctionsRestApiStack(final Construct scope, final String id, final StackProps props) {
        super(scope, id, props);

        Pass machineDefinition = Pass.Builder.create(this, "PassState")
                                .result(Result.fromString("Hello"))
                                .build();
        
        StateMachine stateMachine = StateMachine.Builder.create(this, "MyStateMachine")
                                    .definition(machineDefinition)
                                    .stateMachineType(StateMachineType.EXPRESS)
                                    .build();
                                    
        StepFunctionsRestApi api = StepFunctionsRestApi.Builder.create(this, "StepFunctionsRestApi")
                                   .stateMachine(stateMachine)
                                   .build();
                                   
    }
}
```

------
#### [ C\$1 ]

`src/StepfunctionsRestApi/StepfunctionsRestApiStack.cs`를 업데이트하여 다음을 확인합니다.

```
using Amazon.CDK;
using Amazon.CDK.AWS.StepFunctions;
using Amazon.CDK.AWS.APIGateway;

namespace StepfunctionsRestApi
{
    public class StepfunctionsRestApiStack : Stack
    {
        internal StepfunctionsRestApi(Construct scope, string id, IStackProps props = null) : base(scope, id, props)
        {
            var machineDefinition = new Pass(this, "PassState", new PassProps
            {
                Result = Result.FromString("Hello")
            });

            var stateMachine = new StateMachine(this, "MyStateMachine", new StateMachineProps
            {
                Definition = machineDefinition,
                StateMachineType = StateMachineType.EXPRESS
            });
            
            var api = new StepFunctionsRestApi(this, "StepFunctionsRestApi", new StepFunctionsRestApiProps
            {
                StateMachine = stateMachine
            });

        }
    }
}
```

------
#### [ Go ]

`stepfunctions-rest-api.go`를 업데이트하여 다음을 확인합니다.

```
package main
import (
    "github.com/aws/aws-cdk-go/awscdk"
    "github.com/aws/aws-cdk-go/awscdk/awsapigateway"
    "github.com/aws/aws-cdk-go/awscdk/awsstepfunctions"
    "github.com/aws/constructs-go/constructs/v3"
    "github.com/aws/jsii-runtime-go"
)


type StepfunctionsRestApiGoStackProps struct {
    awscdk.StackProps
}

func NewStepfunctionsRestApiGoStack(scope constructs.Construct, id string, props *StepfunctionsRestApiGoStackProps) awscdk.Stack {
    var sprops awscdk.StackProps
    if props != nil {
        sprops = props.StackProps
    }
    stack := awscdk.NewStack(scope, &id, &sprops)

    // The code that defines your stack goes here
    var machineDefinition = awsstepfunctions.NewPass(stack, jsii.String("PassState"), &awsstepfunctions.PassProps
    {
        Result: awsstepfunctions.NewResult(jsii.String("Hello")),
    })

    var stateMachine = awsstepfunctions.NewStateMachine(stack, jsii.String("StateMachine"), &awsstepfunctions.StateMachineProps{
        Definition: machineDefinition,
        StateMachineType: awsstepfunctions.StateMachineType_EXPRESS,
    });

    awsapigateway.NewStepFunctionsRestApi(stack, jsii.String("StepFunctionsRestApi"), &awsapigateway.StepFunctionsRestApiProps{
        StateMachine = stateMachine,
    })

    return stack
}

func main() {
    app := awscdk.NewApp(nil)

    NewStepfunctionsRestApiGoStack(app, "StepfunctionsRestApiGoStack", &StepfunctionsRestApiGoStackProps{
        awscdk.StackProps{
            Env: env(),
        },
    })

    app.Synth(nil)
}

// env determines the AWS environment (account+region) in which our stack is to
// be deployed. For more information see: https://docs.aws.amazon.com/cdk/latest/guide/environments.html
func env() *awscdk.Environment {
    // If unspecified, this stack will be "environment-agnostic".
    // Account/Region-dependent features and context lookups will not work, but a
    // single synthesized template can be deployed anywhere.
    //---------------------------------------------------------------------------
    return nil

    // Uncomment if you know exactly what account and region you want to deploy
    // the stack to. This is the recommendation for production stacks.
    //---------------------------------------------------------------------------
    // return &awscdk.Environment{
    //  Account: jsii.String("account-id"),
    //  Region:  jsii.String("us-east-1"),
    // }

    // Uncomment to specialize this stack for the AWS Account and Region that are
    // implied by the current CLI configuration. This is recommended for dev
    // stacks.
    //---------------------------------------------------------------------------
    // return &awscdk.Environment{
    //  Account: jsii.String(os.Getenv("CDK_DEFAULT_ACCOUNT")),
    //  Region:  jsii.String(os.Getenv("CDK_DEFAULT_REGION")),
    // }
}
```

------

소스 파일을 저장한 다음 앱의 기본 디렉터리에서 `cdk synth`를 실행합니다. 는 앱을 AWS CDK 실행하고이 앱에서 CloudFormation 템플릿을 합성한 다음 템플릿을 표시합니다.

실제로 Amazon API Gateway와 AWS Step Functions 상태 시스템을 AWS 계정에 배포하려면를 실행합니다`cdk deploy`. 가 AWS CDK 생성한 IAM 정책을 승인하라는 메시지가 표시됩니다.

## 3단계: API Gateway 테스트
<a name="step-functions-rest-api-integration-cdk-step-3"></a>

동기 Express 상태 시스템이 백엔드 통합으로 있는 API Gateway REST API를 만든 후 API Gateway를 테스트할 수 있습니다.

### API Gateway 콘솔을 사용하여 배포된 API Gateway 테스트하기
<a name="to-test-the-deployed-api-gateway-using-console"></a>

1. [Amazon API Gateway 콘솔을](https://console.aws.amazon.com/apigateway/) 열고 로그인합니다.

1. 이름이 `StepFunctionsRestApi`인 REST API를 선택합니다.

1. **리소스** 창에서 `ANY` 메서드를 선택합니다.

1. **테스트** 탭을 선택합니다. 탭을 표시하려면 오른쪽 화살표 버튼을 선택해야 할 수도 있습니다.

1. **Method(메서드)**에서 **POST**를 선택합니다.

1. **요청 본문**에서 다음 요청 파라미터를 복사합니다.

   ```
   {
       "key": "Hello"
   }
   ```

1. **테스트**를 선택합니다. 다음 정보가 표시됩니다.
   + **요청**은 메서드에 대해 호출된 리소스의 경로입니다.
   + **상태**는 응답의 HTTP 상태 코드입니다.
   + **지연 시간**은 호출자로부터 요청을 수신한 시간과 응답 반환 시간의 시간차입니다.
   + **응답 본문**은 HTTP 응답 본문입니다.
   + **응답 헤더**는 HTTP 응답 헤더입니다.
   + **로그**는 이 메서드가 API Gateway 콘솔 밖에서 호출되었을 경우 작성되었을 시뮬레이션된 Amazon CloudWatch Logs 입력입니다.
**참고**  
CloudWatch Logs 입력은 시뮬레이션된 것이지만 메서드 호출의 결과는 실제입니다.

**응답 본문** 출력은 다음과 같아야 합니다.

```
"Hello"
```

**작은 정보**  
다른 메서드와 잘못된 입력으로 API Gateway를 사용해 보고 오류 출력을 확인합니다. 특정 키를 찾도록 상태 시스템을 변경하고 테스트 중에 잘못된 키를 입력하면 상태 머신 실행이 실패하고 **응답 본문** 출력에 오류 메시지가 생성될 수 있습니다.

### cURL을 사용하여 배포된 API를 테스트하기
<a name="to-test-the-deployed-api-gateway-using-curl"></a>

1. 터미널 창을 엽니다.

1. 다음 cURL 명령을 복사하여 터미널 창에 붙여 넣습니다. `<api-id>`를 해당 API의 API ID로 바꾸고, `<region>`을 해당 API가 배포된 리전으로 바꾸십시오.

   ```
   curl -X POST\
    'https://<api-id>.execute-api.<region>.amazonaws.com/prod' \
    -d '{"key":"Hello"}' \
    -H 'Content-Type: application/json'
   ```

**응답 본문** 출력은 다음과 같아야 합니다.

```
"Hello"
```

**작은 정보**  
다른 메서드와 잘못된 입력으로 API Gateway를 사용해 보고 오류 출력을 확인합니다. 특정 키를 찾도록 상태 시스템을 변경하고 테스트 중에 잘못된 키를 입력하면 상태 시스템 실행이 실패하고 **응답 본문** 출력에 오류 메시지가 생성될 수 있습니다.

## 4단계: 정리
<a name="step-functions-rest-api-integration-cdk-step-4"></a>

API Gateway 사용을 마치면 AWS CDK를 사용하여 상태 시스템과 API Gateway를 모두 제거할 수 있습니다. 앱의 기본 디렉토리에서 `cdk destroy`를 실행합니다.

# 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).

# 워크플로를 IaC 템플릿으로 내보내기
<a name="exporting-iac-templates"></a>

AWS Step Functions 콘솔은 저장된 워크플로를 AWS CloudFormation 또는 AWS SAM(SAM) 템플릿으로 내보내고 다운로드할 수 있는 기능을 제공합니다. AWS Infrastructure Composer 지원 AWS 리전의 경우 워크플로를 Infrastructure Composer로 내보내고 Infrastructure Composer 콘솔로 이동하여 새로 생성된 템플릿을 계속 사용할 수 있습니다.

## 템플릿 구성 옵션
<a name="exporting-iac-templates-config-options"></a>

이 기능과 함께 다음 옵션을 사용할 수 있습니다. IaC 템플릿 파일을 내보내고 다운로드하도록 선택하면 콘솔에 저장된 상태 머신에 적용되는 옵션이 표시됩니다. Infrastructure Composer로 내보내는 경우 Step Functions 콘솔은 상태 머신에 적용되는 구성을 자동으로 구현합니다.
+  **사용자를 대신하여 콘솔에서 생성한 IAM 역할 포함** -이 옵션은 실행 역할 정책을 내보냅니다. 템플릿에서 IAM 역할을 구성하고 상태 머신 리소스에 연결합니다. 이 옵션은 상태 머신에 콘솔에서 생성한 실행 역할이 있는 경우에만 적용됩니다.
+  **CloudWatch 로그 그룹 포함** - 템플릿에 CloudWatch 로그 그룹을 구성하고 상태 머신 리소스에 연결합니다. 이 옵션은 상태 머신에 CloudWatch 로그 그룹이 연결되어 있고 [로그 수준](cw-logs.md#cloudwatch-log-level)이 `OFF`로 설정되지 *않은* 경우에만 적용됩니다.
+  **리소스 참조를 DefinitionSubstitutions로 바꾸기** - 이 옵션은 다음 구성 요소에 대한 [DefinitionSubstitutions](concepts-sam-sfn.md#sam-definition-substitution-eg)를 생성합니다.
  + [Distributed Map](state-map-distributed.md) S3 필드.
  + `Activity` 리소스. 내보내기에는 모든 `Run Activity` 작업에 대한 CloudFormation 템플릿의 `Activity` 리소스가 포함됩니다. 내보내기는 생성된 `Activity` 리소스를 참조하는 `DefinitionSubstitutions` 기능도 제공합니다.
  + 모든 서비스 통합에 대한 페이로드 필드의 `ARN` 또는 `S3URI`.
  + `ARN` 및 `S3URI` 필드 외에도 내보내기는 자주 사용되는 다른 서비스 통합 페이로드 필드에 대해 `DefinitionSubstitutions`를 생성합니다. 특정 서비스 통합은 다음과 같습니다.
    + `athena:startQueryExecution`
    + `batch:submitJob`
    +  `dynamodb:getItem`, `dynamodb:updateItem`, `dynamodb:updateItem`, `dynamodb:deleteItem` 
    + `ecs:runTask`
    + `glue:startJobRun`
    + `http:invoke`
    + `lambda:invoke`
    + `sns:publish`
    + `sqs:sendMessage`
    + `states:startExecution`

## 워크플로의 IaC 템플릿 내보내기 및 다운로드
<a name="exporting-iac-templates-files-procedure"></a>

**워크플로를 IaC 템플릿 파일로 내보내려면**

1. [Step Functions 콘솔](https://console.aws.amazon.com/states/home?region=us-east-1#/)을 열고 작업할 상태 머신을 선택합니다. 다음 단계로 진행하기 전에 상태 머신에 대한 변경 사항이 저장되었는지 확인합니다.

1. **작업** 메뉴에서 ** CloudFormation 또는 SAM 템플릿으로 내보내기**를 선택합니다.

1. 표시되는 대화 상자에서 **유형**을 **SAM** 또는 **CloudFormation**으로 선택합니다.
   + **CloudFormation** 템플릿을 선택한 경우 다음으로 **JSON** 또는 **YAML** 파일 형식을 선택합니다.
   + **SAM** 템플릿을 선택한 경우 형식 선택 항목이 표시되지 않습니다. SAM 템플릿의 기본값은 YAML 파일 형식입니다.

1. **추가 구성**을 확장합니다. 기본적으로 모든 옵션이 선택됩니다. IaC 템플릿의 옵션 선택을 검토하고 업데이트합니다. 옵션은 이전 섹션([템플릿 구성 옵션](#exporting-iac-templates-config-options))에서 자세히 설명합니다.

   옵션이 특정 워크플로에 적용되지 않으면 대화 상자에 표시되지 않습니다.

1. **다운로드**를 선택하여 생성된 IaC 템플릿 파일을 내보내고 다운로드합니다.

## 워크플로를 AWS Infrastructure Composer로 직접 내보내기
<a name="exporting-iac-templates-infra-composer-procedure"></a>

**워크플로를 Infrastructure Composer로 내보내려면**

1. [Step Functions 콘솔](https://console.aws.amazon.com/states/home?region=us-east-1#/)을 열고 작업할 상태 머신을 선택합니다. 다음 단계로 진행하기 전에 상태 머신에 대한 변경 사항이 저장되었는지 확인합니다.

1. **작업** 메뉴에서 **Infrastructure Composer로 내보내기**를 선택합니다.

1. **Infrastructure Composer로 내보내기** 대화 상자가 표시됩니다. **전송 버킷 이름** 필드에 표시되는 기본 이름을 사용하거나 새 이름을 입력할 수 있습니다. Amazon S3 버킷에 이름은 전역적으로 고유해야 하며 [버킷 이름 지정 규칙](https://docs.aws.amazon.com/AmazonS3/latest/userguide/bucketnamingrules.html)을 따라야 합니다.

1. **확인 및 프로젝트 생성**을 선택하여 워크플로를 Infrastructure Composer로 내보냅니다.

1. 프로젝트 및 워크플로 정의를 Infrastructure Composer에 저장하려면 [로컬 동기화 모드](https://docs.aws.amazon.com/application-composer/latest/dg/reference-features-local-sync.html)를 활성화합니다.

**참고**  
이전에 **Infrastructure Composer로 내보내기** 기능을 사용하고 기본 이름을 사용하여 Amazon S3 버킷을 생성한 경우, Step Functions는 이 버킷이 아직 존재한다면 재사용할 수 있습니다. 대화 상자에서 기본 버킷 이름을 수락하여 기존 버킷을 재사용합니다.

### Amazon S3 버킷 구성 전송
<a name="export-appcomposer-bucket-info"></a>

Step Functions가 워크플로를 전송하기 위해 생성하는 Amazon S3 버킷은 AES 256 암호화 표준을 사용하여 객체를 자동으로 암호화합니다. Step Functions는 또한 [버킷 소유자 조건](https://docs.aws.amazon.com/AmazonS3/latest/userguide/bucket-owner-condition.html)을 사용하도록 버킷을 구성하여 AWS 계정만 버킷에 객체를 추가할 수 있도록 합니다.

기본 버킷 이름은 10자리 영숫자 문자열인 접두사 `states-templates`을 사용하며, 워크플로를 생성한 AWS 리전의 위치는 다음과 같습니다. `states-templates-amzn-s3-demo-bucket-us-east-1`. AWS 계정에 추가되어 추가 요금이 부과되지 않도록 하려면 Infrastructure Composer로 워크플로 내보내기를 완료하는 즉시 Amazon S3 버킷을 삭제하는 것이 좋습니다.

표준 [Amazon S3 요금](https://aws.amazon.com/s3/pricing/)이 적용됩니다.

### 필수 권한
<a name="export-appcomposer-permissions"></a>

Infrastructure Composer 기능을 포함하는 Step Functions를 사용하려면 AWS SAM 템플릿을 다운로드하고 Amazon S3에 템플릿 구성을 작성할 수 있는 특정 권한이 필요합니다.

AWS SAM 템플릿을 다운로드하려면 다음 API 작업을 사용할 권한이 있어야 합니다.
+ [iam:GetPolicy](https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetPolicy.html)
+ [iam:GetPolicyVersion](https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetPolicyVersion.html)
+ [iam:GetRole](https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetRole.html)
+ [iam:GetRolePolicy](https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetRolePolicy.html)
+ [iam:ListAttachedRolePolicies](https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListAttachedRolePolicies.html)
+ [iam:ListRolePolicies](https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListRolePolicies.html)
+ [iam:ListRoles](https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListRoles.html)

Step Functions가 Amazon S3에 함수 구성을 작성하려면 다음 API 작업을 사용할 권한이 있어야 합니다.
+ [S3:PutObject](https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html)
+ [S3:CreateBucket](https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateBucket.html)
+ [S3:PutBucketEncryption](https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketEncryption.html)

함수 구성을 Infrastructure Composer로 내보낼 수 없는 경우 계정에 이러한 작업에 필요한 권한이 있는지 확인합니다.