AWS Step Functions를 사용하면 상태 머신으로 확장 가능한 분산된 애플리케이션을 구축할 수 있습니다. 이전까지는 Step Functions에서 워크플로를 구축하려면 Amazon State Language(ASL)를 배우고 이해해야 했습니다. Workflow Studio는 코드를 적게 사용하는 시각적 도구로, 가이드가 있는 인터랙티브 인터페이스를 통해 Step Functions를 배우고 워크플로를 더욱 빠르게 프로토타이핑하여 구축할 수 있습니다.
Workflow Studio는 첫 워크플로를 구축하는 시간이 단축되고, 개발자가 실습으로 빠르게 익숙해질 수 있기 때문에 Step Functions를 처음 사용하는 개발자에게 유용합니다. 또한, Workflow Studio는 시각적 도구로 개발 시간을 더욱 줄일 수 있기 때문에 워크플로 구축 경험이 있는 개발자에게도 유용합니다. 예를 들어 Workflow Studio를 사용하여 워크플로를 프로토타이핑하고 관계자들에게 빠르게 공유할 수 있습니다. 또는, Workflow Studio를 사용하여 상태 머신의 상용구를 설계할 수 있습니다. Workflow Studio를 사용할 때는 모든 리소스를 AWS 계정에 배포하지 않아도 됩니다. 상태 머신을 구축하고, 준비 상태에 따라 다양한 작업으로 서서히 완료하면 됩니다.
# Lambda를 사용하는 Step Functions 상태 머신 생성
이 자습서에서는 AWS Lambda함수를 호출하는 AWS Step Functions 데 사용하는 단일 단계 워크플로를 만들어 보겠습니다.
:::info
Step Functions는 상태 시스템 및 작업을 기반으로 합니다. Step Functions에서 워크플로는 일련의 이벤트 기반 단계인 상태 머신이라고 합니다. 워크플로의 각 단계를 상태라고 합니다. 작업 상태는 AWS Lambda와 같은 다른 AWS 서비스가 수행하는 작업 단위를 나타냅니다. Task 상태는 모든 AWS 서비스 또는 API를 호출할 수 있습니다.
:::
Lambda 함수는 서버리스이며 작성하기 쉽습니다. 코드는 AWS Management Console 또는 자주 사용하는 편집기에서 작성할 수 있습니다. 함수에 대한 컴퓨팅 환경을 제공하고 이를 실행하는 세부 사항은 AWS에서 처리합니다.
#### 주제
- 1단계: Lambda 함수 생성
- 2단계: Lambda 함수 테스트
- 3단계: 상태 머신 만들기
- 4단계: 새 실행 시작
## 1단계: Lambda 함수 생성
Lambda 함수는 이벤트 데이터를 수신하고 인사말 메시지를 반환합니다.
:::warning
Lambda 함수가 상태 머신과 동일한 AWS 계정 및 AWS 리전에 속하는지 확인하십시오.
:::
1. Lambda 콘솔을 열고 함수 생성을 선택합니다.
1. 함수 생성 페이지에서 새로 작성을 선택합니다.
1. **함수 이름(Function name)** 에 HelloFunction을 입력합니다.
1. 다른 모든 옵션의 기본 선택을 유지한 다음 **Create function (함수 만들기)** 을 선택합니다.
1. Lambda 함수를 생성한 후 페이지 오른쪽 상단에 표시된 함수의 Amazon 리소스 이름 (ARN) 을 복사합니다.
```
arn:aws:lambda:us-east-1:123456789012:function:HelloFunction
```
1. Lambda함수의 다음 코드를 HelloFunction페이지의 코드 소스 섹션에 복사합니다.
```javascript=
export const handler = async(event, context, callback) => {
callback(null, "Hello from " + event.who + "!");
};
```
이 코드는 함수에 전달된 `event` 개체에서 제공하는 입력 데이터의 `who` 필드를 사용하여 인사말을 조합합니다. 나중에 새 실행을 시작할 때 이 함수에 대한 입력 데이터를 추가합니다. 콜백 메서드는 함수에서 조합된 인사말을 반환합니다.
1. 배포를 선택합니다.
## 2단계: Lambda 함수 테스트
Lambda 함수를 테스트하여 작동 중인지 확인하십시오.
1. 테스트(Test)를 선택합니다.
1. 이벤트 이름에 HelloEvent를 입력합니다.
1. 이벤트 JSON 데이터를 다음과 같이 바꿉니다.
```jsonld=
{
"who": "AWS Step Functions"
}
```
이 `who` 항목은 Lambda 함수의 event.who 필드에 해당하며, 인사말을 완성합니다. 상태 머신을 실행할 때 동일한 입력 데이터를 입력하게 됩니다.
1. [Save] 를 선택한 다음 [Test] 를 선택합니다.
1. 테스트 결과를 확인하려면 실행 결과(Execution result)에서 세부 정보(Details)를 확장합니다.
## 3단계: 상태 머신 만들기
Step Functions 콘솔을 사용하여 1단계에서 생성한 Lambda 함수를 호출하는 상태 머신을 생성할 수 있습니다.
1. Step Functions 콘솔을 열고 상태 머신 생성을 선택합니다.
:::warning
상태 머신이 이전에 생성한 Lambda 함수와 동일한 AWS 계정 및 리전에 속하는지 확인하십시오.
:::
1. **Choose authoring method**에서 **Design your workflow visually**를 선택합니다.
1. 유형에서는 기본 선택 (standard) 을 유지합니다.
1. 다음을 선택합니다. 그러면 워크플로 스튜디오가 열립니다.
1. 왼쪽의 상태 브라우저에서 **Actions** 패널을 선택합니다.
1. AWS Lambda Invoke API를 여기의 **first state here**라는 레이블이 붙은 빈 상태로 끌어다 놓습니다.

1. 오른쪽의 Inspector 패널에서 Lambda 함수를 구성합니다.
1. API 파라미터 섹션의 함수 이름 드롭다운 목록에서 앞서 생성한 Lambda 함수를 선택합니다.
1. Payload 드롭다운 목록에서 기본 선택을 유지합니다.
1. 다음을 선택합니다.
1. 생성된 코드 검토 페이지에서 상태 머신의 ASL (Amazon States Language) 정의를 검토합니다. 이 정의는 액션 및 인스펙터 패널에서 선택한 항목에 따라 자동으로 생성됩니다.
1. 다음을 선택합니다.
1. 상태 머신 이름을 입력합니다(예: MyStateMachine).
:::info
상태 머신, 실행 및 활동 이름은 길이가 1~80자여야 하고 계정 및 AWS 지역에 따라 고유해야 하며 다음 중 어느 것도 포함하지 않아야 합니다.
공백
와일드카드 문자 (? *)
괄호 문자(< > { } [ ])
특수 문자 (: ; , \ | ^ ~ $ # % & " ' )
제어 문자(\\u0000 - \\u001f 또는 \\u007f - \\u009f).
상태 머신 유형이 Express인 경우 상태 머신의 여러 실행에 동일한 이름을 제공할 수 있습니다. Step Functions는 각 Express 상태 머신 실행에 대해 고유한 실행 ARN을 생성합니다. 이는 여러 실행의 이름이 같더라도 마찬가지입니다.
Step Functions를 사용하면 ASCII가 아닌 문자를 포함하는 상태 시스템, 실행 및 활동 이름을 생성할 수 있습니다. ASCII가 아닌 이름은 Amazon CloudWatch에서 작동하지 않습니다. CloudWatch 메트릭을 추적할 수 있도록 하려면 ASCII 문자만 사용하는 이름을 선택하십시오.
:::
1. **Execution role**의 **Permissions** 섹션에서 새 역할 만들기를 선택합니다.
1. 상태 머신 생성을 선택합니다.
## 4단계: 새 실행 시작
상태 머신을 생성했으면 실행을 시작할 수 있습니다.
1. 'MyStateMachine'페이지에서 실행 시작을 선택합니다.**Start execution** 대화 상자가 표시됩니다.
1. (선택 사항) 실행을 식별하기 위해 이름 상자에 실행 이름을 지정할 수 있습니다. 기본적으로 Step Functions는 고유한 실행 이름을 자동으로 생성합니다.
:::info
Step Functions를 사용하면 ASCII가 아닌 문자를 포함하는 상태 시스템, 실행 및 활동 이름을 생성할 수 있습니다. ASCII가 아닌 이름은 Amazon CloudWatch에서 작동하지 않습니다. CloudWatch 메트릭을 추적할 수 있도록 하려면 ASCII 문자만 사용하는 이름을 선택하십시오.
:::
1. 실행 입력 영역에서 예제 데이터를 다음으로 바꿉니다.
```jsonld=
{
"who" : "AWS Step Functions"
}
```
``"who"``는 Lambda 함수가 인사할 사람의 이름을 가져오는 데 사용하는 키 이름입니다.
1. [Start Execution]을 선택합니다.
1. 상태 머신의 새로운 실행이 시작되고 실행 중인 실행을 보여주는 새로운 페이지가 표시됩니다.
1. 다음 이미지와 같이 단계 세부 정보 창의 Output 탭에서 실행 결과를 확인합니다.
:::info
실행 요약 창의 실행 입력 및 출력 탭에서 제공한 입력에 해당하는 반환된 출력을 볼 수도 있습니다.
:::

:::info
상태 시스템에서 Lambda를 호출하는 동안 페이로드를 전달할 수도 있습니다. 매개 변수 필드에 페이로드를 전달하여 Lambda를 호출하는 방법에 대한 자세한 내용과 예제는 [Invoke Lambda with Step Functions](https://docs.aws.amazon.com/step-functions/latest/dg/connect-lambda.html) 단원을 참조하십시오.
:::
# Amazon S3 이벤트에 대한 응답으로 상태 머신 실행 시작
Amazon EventBridge 규칙 또는 일정에 따라 AWS Step Functions 상태 머신을 실행할 수 있습니다.
이 자습서에서는 상태 머신을 Amazon EventBridge 규칙의 대상으로 구성하는 방법을 보여줍니다. 이 규칙은 파일이 Amazon Simple Storage Service(Amazon S3) 버킷에 추가될 때 상태 시스템 실행을 시작합니다.
실용적인 애플리케이션의 경우 이미지 및 비디오 파일에 대한 Amazon Rekognition 분석 실행 또는 썸네일 생성과 같이 버킷에 추가한 파일에 대한 작업을 수행하는 상태 머신을 시작할 수 있습니다.
이 자습서에서는 Amazon S3 버킷에 파일을 업로드하여 Helloworld 상태 시스템 실행을 시작합니다. 그런 다음 해당 실행의 예제 입력을 검토하여 EventBridge에 전달된 Amazon S3 이벤트 알림의 입력에 포함된 정보를 식별합니다.
#### 주제
- 사전 조건: 상태 시스템 생성
- 1단계: Amazon S3에서 버킷 만들기
- 2단계: 다음을 사용하여 Amazon S3 이벤트 알림을 활성화합니다. EventBridge
- 3단계: Amazon EventBridge 규칙 만들기
- 4단계: 규칙 테스트
- 실행 입력의 예
## 사전 조건: 상태 시스템 생성
상태 머신을 Amazon EventBridge 타겟으로 구성하려면 먼저 상태 머신을 생성해야 합니다.
- 기본 상태 시스템을 생성하려면 Lambda 함수를 사용하는 상태 시스템 생성 자습서를 사용하십시오.
- Helloworld 상태 머신이 이미 있는 경우 다음 단계로 진행합니다.
## 1단계: Amazon S3에서 버킷 만들기
이제 Helloworld 상태 머신이 생겼으니 파일을 저장하는 Amazon S3 버킷을 만들어야 합니다. 이 자습서의 3단계에서는 파일이 이 버킷에 업로드될 때 상태 머신의 실행을 EventBridge 트리거하도록 규칙을 설정했습니다.
1. Amazon S3 콘솔로 이동한 다음 [Create bucket] 을 선택하여 파일을 저장할 버킷을 생성하고 Amazon S3 이벤트 규칙을 트리거합니다.
1. 버킷 이름을 입력합니다(예: username-sfn-tutorial).
:::info
버킷 이름은 Amazon S3 모든 리전에 있는 모든 기존 버킷 이름에서 고유해야 합니다.AWS 자신의 사용자 이름을 사용하여 이 이름을 고유하게 합니다. 동일한 AWS 리전의 모든 리소스를 생성해야 합니다.
:::
1. 페이지에서 기본 선택 항목을 모두 유지하고 Create bucket (Create bucket) 을 선택합니다.
## 2단계: EventBridge을 사용하여 Amazon S3 이벤트 알림을 활성화합니다.
Amazon S3 버킷을 만들었으면 S3 버킷에서 특정 이벤트 (예: 파일 업로드) 가 발생할 EventBridge 때마다 이벤트를 전송하도록 구성하십시오.
1. Amazon S3 콘솔로 이동합니다.
1. 버킷(Buckets) 목록에서 이벤트를 사용 설정하려는 버킷의 이름을 선택합니다.
1. [속성(Properties)]을 선택합니다.
1. 페이지를 아래로 스크롤하여 이벤트 알림 섹션을 확인한 다음 Amazon EventBridge 하위 섹션에서 편집을 선택합니다.
1. 이 버킷의 모든 이벤트에 EventBridge 대해 Amazon에 알림 보내기 아래에서 **활성화**를 선택합니다.
1. 변경 사항 저장(Save changes)을 선택합니다.
:::info
사용 설정한 EventBridge 후에는 변경 사항이 적용되는 데 5분 정도 걸립니다.
:::
## 3단계: Amazon EventBridge 규칙 만들기
상태 머신이 있고 Amazon S3 버킷을 만들고 EventBridge로 이벤트 알림을 보내도록 구성한 후 EventBridge 규칙을 생성하십시오.
:::info
Amazon S3 버킷과 동일한AWS 리전에 EventBridge 규칙을 구성해야 합니다.
:::
### 규칙을 만들려면
1. Amazon EventBridge 콘솔로 이동하여 **Create rule**을 선택합니다.
:::info
또는 EventBridge 콘솔의 탐색 창에서 버스 아래의 규칙을 선택한 다음 규칙 생성을 선택합니다.
:::
1. 규칙의 이름(예: S3StepFunctions)을 입력하고 선택적으로 규칙에 대한 설명을 입력합니다.
1. 이벤트 버스 및 규칙 유형의 경우 **default**을 유지하십시오.
1. 다음을 선택합니다. 빌드 이벤트 패턴 페이지가 열립니다.
1. 이벤트 패턴 섹션에서 다음을 수행합니다.
1. 이벤트 소스에서 AWS 이벤트 또는 EventBridge 파트너 이벤트 기본 선택을 유지합니다.
1. AWS 서비스를 Simple Storage Service(S3)를 선택합니다.
1. 이벤트 유형에서 Amazon S3 이벤트 알림을 선택합니다.
1. 특정 이벤트를 선택한 다음 "Object Created"을 선택합니다.
1. 이름 기준 특정 버킷을 선택하고 1단계에서 생성한 버킷 이름(username-sfn-tutorial)을 입력하여 파일을 저장합니다.
1. 다음을 선택합니다. 대상 선택 페이지가 열립니다.
### 대상을 생성하려면
1. 대상 1에서 AWS 서비스의 기본 선택을 유지합니다.
1. 대상 선택 드롭다운 목록에서 Step Functions 상태 머신을 선택합니다.
1. 상태 시스템 목록에서 이전에 생성한 상태 시스템(예: Helloworld)을 선택합니다.
1. 페이지에서 모든 기본 선택을 유지하고 다음을 선택합니다. 그러면 태그 구성 페이지가 열립니다.
1. 다음을 다시 선택합니다. 그러면 검토 및 만들기 페이지가 열립니다.
1. 규칙의 세부 정보를 검토하고 규칙 생성을 선택합니다.
규칙이 생성되고 규칙 페이지가 표시되어 모든 Amazon EventBridge 규칙이 나열됩니다.
## 4단계: 규칙 테스트
이제 모든 것이 준비되었으므로 Amazon S3 버킷에 파일 추가를 테스트한 다음 결과 상태 시스템 실행의 입력을 살펴봅니다.
1. Amazon S3 버킷에 파일을 추가합니다. Amazon S3 콘솔로 이동하여 파일을 저장하기 위해 생성한 버킷(username-sfn-tutorial)을 선택한 다음 업로드를 선택합니다.
3. 파일(예: test.png)을 추가한 다음 업로드를 선택합니다. 이렇게 하면 AWS CloudTrail의 정보를 입력으로 전달하는 상태 머신의 실행이 시작됩니다.
4. 상태 시스템의 실행을 확인하십시오. Step Functions 콘솔로 이동하여 Amazon EventBridge 규칙(Helloworld)에 사용된 상태 머신을 선택합니다.
5. 해당 상태 시스템의 가장 최근 실행을 선택하고 실행 입력 섹션을 확장합니다. 이 입력에는 버킷 이름 및 객체 이름과 같은 정보가 포함됩니다. 실제 사용 사례에서 상태 시스템은 이 입력을 사용하여 해당 개체에 대한 작업을 수행할 수 있습니다.
## 실행 입력의 예
다음 예제에서는 상태 머신 실행에 대한 일반적인 입력을 보여줍니다.
```jsonld=
{
"version": "0",
"id": "6c540ad4-0671-9974-6511-756fbd7771c3",
"detail-type": "Object Created",
"source": "aws.s3",
"account": "123456789012",
"time": "2022-02-19T01:36:58Z",
"region": "us-east-2",
"resources": [
"arn:aws:s3:::username-sfn-tutorial"
],
"detail": {
"version": "0",
"bucket": {
"name": "username-sfn-tutorial"
},
"object": {
"key": "test.png",
"size": 800704,
"etag": "f31d8546bb67845b4d3048cde533b937",
"sequencer": "00621049BA9A8C712B"
},
"request-id": "79104EXAMPLEB723",
"requester": "123456789012",
"source-ip-address": "200.0.100.11",
"reason": "PutObject"
}
}
```
## 5단계: 버킷이름 및 파일이름 출력(도전)!
Lambda를 수정하여 S3에 파일이 올라왔을때, BucketName과 ObjectName을 출력해봅시다.
Hint : State Machines의 입력과 출력을 잘 살펴보십시오.
Hint : 모든 페이로드는 Json으로 구성되어있습니다.
:::spoiler 정답!
```typescript=
export const handler = async(event, context, callback) => {
callback(null, "Bucket Name : " + event.detail.bucket.name + " / Object Name : " + event.detail.object.key );
};
```
:::
# Amazon S3 이벤트 DynamoDB에 저장하기
S3에 오브젝트가 업로드될때마다 생성되는 메타데이터를 DynamoDB에 저장하겠습니다.
## 1단계 DynamoDB생성
1. DynamoDB 콘솔로 이동합니다.
1. 테이블 생성을 선택합니다.
1. 테이블 이름에 **ImageInfo**, 파티션키에 **bucketname** , 정렬키에 **objectkey**를 입력합니다.
1. 나머지 설정은 변경하지 않고 테이블 생성을 선택합니다.
## 상태머신에 DynamoDB PutItem 추가하기
이전에 만든 MyStateMachine을 다시 활용하겠습니다. Stepfunction의 상태머신 MyStateMachine을 선택합니다. 워크샵 스튜디오를 클릭하여 시각화된 워크플로우 편집기를 실행합니다.
Invoke Lambda를 삭제합니다.
왼쪽 네비게이션 창에서 PutItem을 검색합니다.
DynamoDB PutItem을 드래그하여 첫번째 상태창에 위치시킵니다.
오른쪽 DynamoDB PutItem 정의창의 구성탭의 API파라미터에 아래 값을 입력합니다. 아래 파라미터필드를 잘 살펴보세요. 크게 어렵지 않습니다.
```jsonld=
{
"TableName": "ImageInfo",
"Item": {
"bucketname": {
"S.$": "$.detail.bucket.name"
},
"objectkey": {
"S.$": "$.detail.object.key"
}
}
}
```
적용 및 종료를 클릭하고 워크플로우를 저장합니다.
아래 테스트를 해보거나 실제 버킷에 파일을 올려봅시다.
## 실행 입력의 예
다음 예제에서는 상태 머신 실행에 대한 일반적인 입력을 보여줍니다.
```jsonld=
{
"version": "0",
"id": "6c540ad4-0671-9974-6511-756fbd7771c3",
"detail-type": "Object Created",
"source": "aws.s3",
"account": "123456789012",
"time": "2022-02-19T01:36:58Z",
"region": "us-east-2",
"resources": [
"arn:aws:s3:::username-sfn-tutorial"
],
"detail": {
"version": "0",
"bucket": {
"name": "username-sfn-tutorial"
},
"object": {
"key": "test.png",
"size": 800704,
"etag": "f31d8546bb67845b4d3048cde533b937",
"sequencer": "00621049BA9A8C712B"
},
"request-id": "79104EXAMPLEB723",
"requester": "123456789012",
"source-ip-address": "200.0.100.11",
"reason": "PutObject"
}
}
```
DynamoDB에서도 결과를 확인해 봅시다.
# (도전)이미지에서 텍스트 추출하여 DynamoDB에 저장하기
:::spoiler 정답!
MyStateMachine에서 다시 시작합니다. 상태머신의 DynamoDB PutItem 앞에 DetectText를 선택하여 드래그합니다.
## DetectText 설정
API 파라미터
```jsonld=
{
"Image": {
"S3Object": {
"Bucket.$": "$.bucket.name",
"Name.$": "$.object.key"
}
}
}
```
출력
ResultSelector로 결과 변환
```jsonld=
{
"DetectedText.$": "$.TextDetections[0].DetectedText"
}
```
ResultPath를 사용하여 출력에 원래 입력 추가
- Combine original input with result
- $.Image
## DynamoDB PutItem 설정
API 파라미터
```jsonld
{
"TableName": "ImageInfo",
"Item": {
"bucketname": {
"S.$": "$.detail.bucket.name"
},
"objectkey": {
"S.$": "$.detail.object.key"
},
"image": {
"S.$": "$.Image.DetectedText"
}
}
}
```
:::