Amazon Web Services 한국 블로그
AWS Step Functions – AWS SDK 통합을 통해 200개 이상 서비스에서 워크플로 자동화 지원
AWS Step Functions는 AWS SDK 서비스 통합 신규 기능을 통해, 지원 서비스가 17개에서 200개 이상이 되었으며 AWS API 작업은 46개에서 9,000개 이상이 되었습니다.
개발자가 분산 아키텍처를 구축할 때, 워크플로 기반 오케스트레이션 패턴을 사용하곤 합니다. 이 패턴은 서비스 내에서 분산 트랜잭션을 수행하는 워크플로 자동화에 유용합니다. 분산 트랜잭션의 예로는 주문을 처리하고 항상 트랜잭션 상태를 추적하는 데 필요한 모든 태스크가 있습니다.
Step Functions는 워크플로 자동화에 사용되는 로우 코드 시각적 워크플로 서비스로, 서비스를 오케스트레이션하고 이 패턴을 적용하는 데 도움을 줍니다. 개발자는 인공 지능 서비스, Amazon Simple Storage Service(Amazon S3) 및 Amazon DynamoDB와 같은 관리형 서비스와 Step Functions를 함께 사용합니다.
AWS Step Functions – AWS SDK 서비스 통합 소개
지금까지 개발자는 AWS 서비스와 통합되는 워크플로를 구축하는 경우 AWS Step Functions를 통해 제공되는 17개의 지원 서비스 중에서 선택해야 했습니다. 만일, 서비스 통합을 사용할 수 없었던 경우에는 AWS Lambda 함수에서 통합 기능을 코딩해야 했습니다. 이는 애플리케이션에 복잡성과 비용을 추가하므로 이상적이지 않습니다.
이제 Step Functions AWS SDK 서비스 통합을 통해 개발자는 AWS SDK가 지원되는 AWS 서비스에 상태 머신을 직접 통합할 수 있습니다.
AWS SDK 서비스 통합을 사용하는 상태 머신을 생성하기 위해 Amazon States Language(ASL) 및 AWS Cloud Development Kit(AWS CDK)를 사용하거나 시각적으로 AWS Step Function Workflow Studio를 사용할 수 있습니다. 시작하려면 새 Task 상태를 만듭니다. 그런 다음 Task 상태의 리소스 필드에서 직접 ASL을 사용해 AWS SDK 서비스를 호출합니다. 이렇게 하려면 다음 구문을 사용합니다.
arn:aws:states:::aws-sdk:serviceName:apiAction.[serviceIntegrationPattern]
데모를 사용하여 어떻게 시작하는지 보여드리겠습니다.
데모
이 데모에서는 S3에 저장된 동영상 파일이 주어지면 음성을 인식해서 텍스트로 변환하고 영어에서 스페인어로 번역하는 애플리케이션을 구축하고 있습니다.
Step Functions를 사용해 이 데모를 구축해 보겠습니다. 서비스 통합을 통해 상태 머신은 S3, Amazon Transcribe 및 Amazon Translate에 직접 통합됩니다. 음성의 텍스트 변환를 위한 API는 비동기식입니다. 음성의 텍스트 변환 작업이 완료되었는지 확인하려면 준비될 때까지 대기하는 폴링 루프가 필요합니다.
상태 머신 생성
이 데모를 함께 따라가려면 다음과 같은 요구 사항을 미리 준비해야 합니다.
- 처리하려는 원본 파일을 저장할 S3 버킷
- 해당 버킷에 저장된, 영어로 녹음된 동영상 또는 오디오 파일
- 처리를 수행하려는 S3 버킷
AWS 관리 콘솔을 사용하여 이 데모를 수행하는 방법을 보여 드리겠습니다. 이 데모를 코드형 인프라로 배포하려면 이 프로젝트에 대해 AWS CloudFormation 템플릿을 배포합니다.
이 데모를 시작하려면 새 표준 상태 머신을 생성합니다. 워크플로를 코드로 작성(Write your workflow in code) 옵션을 선택하여 ASL을 사용해 상태 머신을 구축합니다. 상태 머신의 이름을 만들고 새 역할을 만듭니다.
음성의 텍스트 변환 작업 시작
상태 머신 정의에 대한 작업을 시작하기 위해 상태 머신을 편집(Edit) 할 수 있습니다.
다음 ASL 코드는 새로운 AWS SDK 서비스 통합 기능을 사용하는 두 가지 태스크가 있는 상태 머신입니다. 첫 번째 태스크는 하나의 S3 버킷에서 다른 버킷으로 파일을 복사하는 것이며, 두 번째 태스크는 Amazon Transcribe를 직접 호출하여 음성의 텍스트 변환 작업을 시작하는 것입니다.
Step Functions에서 이 새 기능을 사용하려면 상태 유형이 Task여야 합니다. “arn:aws:states:::aws-sdk:serviceName:apiAction.<serviceIntegrationPattern>” 구문을 사용해 서비스 이름과 API 작업을 지정해야 합니다. Resource 필드의 APIAction 이름(예: ‘copyObject’)에는 camelCase를 사용하고 Parameters 필드의 파라미터 이름(예: ‘CopySource’)에는 PascalCase를 사용합니다.
파라미터의 경우 이 서비스에 대한 AWS API 설명서 및 API 작업에서 이름과 필수 파라미터를 찾습니다.
{
"Comment": "A State Machine that process a video file",
"StartAt": "GetSampleVideo",
"States": {
"GetSampleVideo": {
"Type": "Task",
"Resource": "arn:aws:states:::aws-sdk:s3:copyObject",
"Parameters": {
"Bucket.$": "$.S3BucketName",
"Key.$": "$.SampleDataInputKey",
"CopySource.$": "States.Format('{}/{}',$.SampleDataBucketName,$.SampleDataInputKey)"
},
"ResultPath": null,
"Next": "StartTranscriptionJob"
},
"StartTranscriptionJob": {
"Type": "Task",
"Resource": "arn:aws:states:::aws-sdk:transcribe:startTranscriptionJob",
"Parameters": {
"Media": {
"MediaFileUri.$": "States.Format('s3://{}/{}',$.S3BucketName,$.SampleDataInputKey)"
},
"TranscriptionJobName.$": "$$.Execution.Name",
"LanguageCode": "en-US",
"OutputBucketName.$": "$.S3BucketName",
"OutputKey": "transcribe.json"
},
"ResultPath": "$.transcription",
"End": true
}
}
}
이전 코드에서 ASL이 제공하는 내장 함수의 흥미로운 사용 사례를 볼 수 있습니다. 다른 파라미터를 사용하여 문자열을 만들 수 있습니다. AWS SDK 서비스 통합과 내장 함수를 조합해서 사용하면 Lambda 함수 없이도 데이터를 조작할 수 있습니다. 예를 들어 다음 줄을 보겠습니다.
"MediaFileUri.$": "States.Format('s3://{}/{}',$.S3BucketName,$.SampleDataInputKey)"
상태 머신에 권한 부여
지금 상태 머신의 실행을 시작하면 실패합니다. 이 상태 머신에는 S3 버킷에 액세스하거나 Amazon Transcribe를 사용할 권한이 없습니다. Step Functions는 대부분의 AWS SDK 서비스 통합에 대해 IAM 정책을 자동 생성할 수 없으므로 이러한 정책을 역할에 수동으로 추가해야 합니다.
해당 권한을 이 상태 머신에 대해 생성된 IAM 역할에 추가합니다. 상태 머신 세부 정보에서 역할에 대한 빠른 링크를 찾을 수 있습니다. 역할에 “AmazonTranscribeFullAccess” 및 “AmazonS3FullAccess” 정책을 연결합니다.
상태 머신 처음 실행
이제 권한이 설정되었으므로 이 상태 머신을 실행할 수 있습니다. 이 상태 머신은 원본 동영상이 업로드되는 S3 버킷 이름, 파일의 이름과 이 파일을 저장하려는 S3 버킷의 이름을 입력으로 사용해서 모든 처리를 수행합니다.
이 기능이 작동하려면 이 파일이 동영상 또는 오디오 파일이어야 하며 영어여야 합니다. 음성의 텍스트 변환 작업이 완료되면 지정한 버킷에서 transcribe.json이라는 이름의 입력 파일에 결과가 저장됩니다.
{
"SampleDataBucketName": "<원본 파일이 있는 버킷의 이름>",
"SampleDataInputKey": "<원본 파일의 이름>",
"S3BucketName": "<처리가 수행될 버킷의 이름>"
}
StartTranscriptionJob은 비동기식 호출이므로 결과를 즉시 볼 수 없습니다. 상태 머신은 API만 호출한 다음 완료됩니다. 음성의 텍스트 변환 작업이 준비될 때까지 기다린 다음 출력 버킷의 transcribe.json 파일에서 결과를 확인해야 합니다.
폴링 루프 추가
음성의 텍스트 변환 결과를 사용하여 텍스트를 번역하려고 하므로 상태 머신이 음성의 텍스트 변환 작업이 완료될 때까지 기다려야 합니다. 상태 머신에서 API 폴러를 구축하기 위해 Task, Wait 및 Choice 상태를 사용할 수 있습니다.
- Task 상태는 작업 상태를 가져옵니다. 이 경우에는 Amazon Transcribe 서비스와 API getTranscriptionJob을 호출합니다.
- 음성의 텍스트 변환 작업의 길이는 입력 파일의 크기에 따라 달라지므로 Wait 상태는 20초 동안 대기합니다.
- 작업 상태의 결과에 따라 Choice 상태에서 적합한 단계로 이동합니다. 작업이 완료되면 시스템에서 다음 단계로 이동하고, 그렇지 않은 경우 계속 대기합니다.
Wait 상태
추가하려는 첫 번째 상태는 Wait 상태입니다. 이것은 20초 동안 대기하는 간단한 상태입니다.
"Wait20Seconds": {
"Type": "Wait",
"Seconds": 20,
"Next": "CheckIfTranscriptionDone"
},
Task 상태
추가할 다음 상태는 Task 상태이며, 이 상태는 API GetTranscriptionJob을 호출합니다. 이 API를 호출하려면 음성의 텍스트 변환 작업 이름을 전달해야 합니다. 이 상태는 Choice 상태의 입력인 작업 상태를 반환합니다.
"CheckIfTranscriptionDone": {
"Type": "Task",
"Resource": "arn:aws:states:::aws-sdk:transcribe:getTranscriptionJob",
"Parameters": {
"TranscriptionJobName.$": "$.transcription.TranscriptionJob.TranscriptionJobName"
},
"ResultPath": "$.transcription",
"Next": "IsTranscriptionDone?"
},
Choice 상태
Choice 상태에는 음성의 텍스트 변환 작업 상태가 완료되었는지 확인하는 규칙이 하나 있습니다. 해당 규칙이 true이면 다음 상태로 이동합니다. 그렇지 않은 경우 Wait 상태로 이동합니다.
"IsTranscriptionDone?": {
"Type": "Choice",
"Choices": [
{
"Variable": "$.transcription.TranscriptionJob.TranscriptionJobStatus",
"StringEquals": "COMPLETED",
"Next": "GetTranscriptionText"
}
],
"Default": "Wait20Seconds"
},
문자로 변환된 텍스트 얻기
이 단계에서는 음성의 텍스트 변환 작업에 의해 반환된 출력 파일에서 문자로 변환된 텍스트만 추출합니다. 결과 파일에는 메타데이터가 너무 많아서 번역하기에 너무 길어지고 혼란스럽기 때문에 문자로 변환된 텍스트만 있으면 됩니다.
이 단계는 일반적으로 Lambda 함수로 수행하는 단계입니다. 그러나 상태 머신에서 직접 ASL을 사용해 수행할 수 있습니다.
먼저 S3에서 결과 파일을 가져오는 AWS SDK 서비스 통합을 사용하여 상태를 생성해야 합니다. 그런 다음 다른 ASL 내장 함수를 사용하여 파일 텍스트를 문자열에서 JSON으로 변환합니다.
다음 상태에서는 파일을 JSON 객체로 처리할 수 있습니다. 이 상태는 이전 상태의 출력을 지우고 문자로 변환된 텍스트만 가져오는 Pass 상태입니다.
"GetTranscriptionText": {
"Type": "Task",
"Resource": "arn:aws:states:::aws-sdk:s3:getObject",
"Parameters": {
"Bucket.$": "$.S3BucketName",
"Key": "transcribe.json"
},
"ResultSelector": {
"filecontent.$": "States.StringToJson($.Body)"
},
"ResultPath": "$.transcription",
"Next": "PrepareTranscriptTest"
},
"PrepareTranscriptTest" : {
"Type": "Pass",
"Parameters": {
"transcript.$": "$.transcription.filecontent.results.transcripts[0].transcript"
},
"Next": "TranslateText"
},
텍스트 번역하기
문자로 변환된 텍스트가 준비되면 번역할 수 있습니다. 이를 위해 상태 머신에서 직접 Amazon Translate API translateText를 사용합니다. 이 상태는 상태 머신의 마지막 상태가 되며 이 상태의 출력에서 번역된 텍스트를 반환합니다.
"TranslateText": {
"Type": "Task",
"Resource": "arn:aws:states:::aws-sdk:translate:translateText",
"Parameters": {
"SourceLanguageCode": "en",
"TargetLanguageCode": "es",
"Text.$": "$.transcript"
},
"ResultPath": "$.translate",
"End": true
}
관리형 정책 “TranslateReadOnly”를 연결하여 상태 머신에 번역 API를 호출할 권한을 추가합니다.
이제 모든 준비가 완료되어 상태 머신을 실행할 수 있습니다. 상태 머신이 실행을 마치면 마지막 상태의 출력에서 번역된 텍스트가 표시됩니다.
알아야 할 중요한 사항
다음은 AWS SDK 서비스 통합을 사용하는 데 도움이 되는 몇 가지 사항입니다.
- Task 상태의 리소스 필드에서 직접 ASL을 사용하여 AWS SDK 서비스를 호출합니다. 이렇게 하려면 arn:aws:states:::aws-sdk:serviceName:apiAction.[serviceIntegrationPattern] 구문을 사용하세요.
- Resource 필드의 APIAction 이름(예: ‘copyObject’)에는 camelCase를 사용하고 Parameters 필드의 파라미터 이름(예: ‘CopySource’)에는 PascalCase를 사용합니다.
- Step Functions는 대부분의 AWS SDK 서비스 통합에 대해 IAM 정책을 자동 생성할 수 없으므로 해당 정책을 상태 머신의 IAM 역할에 수동으로 추가해야 합니다.
- ASL 내장 함수를 활용하여 데이터를 조작할 수 있으며 간단한 변환에 Lambda 함수를 사용하지 않아도 됩니다.
지금 바로 시작하세요!
AWS SDK 서비스 통합은 미국 동부(버지니아 북부), 미국 동부(오하이오), 미국 서부(오레곤), 캐나다(중부), 유럽(아일랜드), 유럽(밀라노), 아프리카(케이프타운) 및 아시아 태평양(도쿄) 리전에서 사용하실 수 있습니다. 향후 Step Functions를 사용할 수 있는 다른 모든 상용 리전에서 정식 출시될 예정입니다.
이 새로운 기능에 대해 자세히 알아보려면 설명서를 읽어보세요.
— Marcia