Cloud

AWS API와 Step Functions로 빠르게 비즈니스 기능 개발하기

융서융서 2022. 10. 28. 19:25

2022 AWS Community Day Seoul 발표(Step Functions로 30분 만에 서버리스 서비스 개발하기)에서 진행한 실습의 Full 가이드입니다.

계속 업데이트 됩니다. 

 

들어가며,

AWS가 제공하는 서비스들을 이용해서 애플리케이션을 개발하기가 점점 쉬워지고 있다.

<AWS Step Functions>는 AWS에서 서버리스 애플리케이션을 개발할 때, 로직들 간 관계를 정의하고 연결하는 데에 편리한 오케스트레이션 서비스이다. 이를 이용하면 여러 기능의 Lambda들을 원하는 순서로 연결하는 것뿐 아니라 SDK(Software Development Kit)로 제공되는 다양한 AWS의 서비스 API들을 간편히 연결해서 하나의 애플리케이션을 만들 수 있다.

 

 

이 서비스를 이용하면 AWS의 다양한 서비스를 통합하기가 쉬워서 개인적으로 정말 좋아하는 서비스인데, 사용 사례에 대한 레퍼런스가 많이 없고 나도 공부할 때 힘들었던 기억이 있어서 잊기 전에 이번 커뮤니티데이 발표와 해당 포스트를 통해 공유해보기로 했다. 

오늘 포스트에서는 AWS API와 Step Functions만을 이용해서, 코드를 쓰지 않고 빠르게 하나의 애플리케이션을 개발하는 과정을 자세히 담아보려고 한다. 


어떤 애플리케이션을 만들까요?

오늘 만들 애플리케이션은, 영화 또는 비디오에서 우리가 자막으로 넣길 원하지 않는 단어들(예를 들어 욕설, 비속어 등)을 필터링해서, 아래 결과물처럼 ***로 마스킹 처리한 스크립트를 만드는 기능이다. 

 

+ '필터링 자막 생성기'는 지금 Serverlessland 라는 aws-samples 오픈소스 사이트에 올라가 있는데, 여기서 Launch Stack 버튼으로 배포해서 실행해볼 수 있다. 실습을 차근차근 따라하면서 만들어도 되지만, 여기서 템플릿을 배포해서 바로 모든 리소스들을 자신의 계정에 만들고 사용해 볼 수도 있다. :)

 

Serverless Land

Your resource for learning serverless technology.

serverlessland.com

 

간단히 동작 과정을 설명하자면,

스토리지 서비스인 S3 버킷에 저장된 video.mp4 파일을 읽어와서,
Amazon Transcribe가 제공하는 API로 단어를 필터링하고, 스크립트로 작성해주는 작업을 수행한다.
그리고 결과물로 저장된 script.txt 파일을 다시 S3 results 버킷에 저장해줄 것이다. 

Transcribe API를 이용하는 여러 작업이 하나의 작업처럼 연결되게 하기 위해 AWS Step Functions를 이용해서 오케스트레이션을 진행해주었다. Step Functions가 제공하는 Workflow Studio 덕분에 우리는 코드를 작성하지 않고 드래그앤 드롭 만으로 여러 기능들을 연결하고 관리하는 것(=오케스트레이션)이 가능해졌는데, 어떤 의미인지 오늘 실습에서 확인해보도록 하자.

그리고 S3에 비디오가 업로드되는 이벤트를 감지하면 자동으로 Step Functions 상태머신을 돌려 비디오->스크립트로 변환해줄 수 있게 event-driven 과정을 추가해줄 것이다. 이 과정에서 Amazon EventBridge를 이용한다.

정리하면, 실습 순서는

1) S3 버킷 생성 (media bucket, results bucket)

2) Step Functions 실행에 필요한 IAM 역할 정의

3) Transcribe 작업을 수행할 Step Functions 상태머신 생성

4) Amazon EventBridge로 S3와 Step functions 상태머신을 연결하는 규칙 생성

5) 테스트

이렇게 된다.

완성 후 아키텍처!

media 버킷에 video.mp4 파일을 업로드 하면, 이벤트브릿지가 이를 감지하고 Step functions 상태머신을 실행시킨다. 

상태머신 내부에서는 Transcribe 서비스가 먼저 필터를 생성하고,

완료되면 그 필터를 적용해서 오디오->텍스트로 변환해주는 작업을 수행한다.

이 작업이 끝나면 결과물로 script.txt 파일이 results 버킷에 저장되면서 종료되는 흐름이다. 


 

그럼 실습에서 사용할 버킷부터 만들어보도록 하자. 

1. S3 Bucket 생성하기

S3 콘솔에서 "Create bucket" 버튼을 클릭해 버킷 생성 창으로 이동하자.

 

Media 버킷과 Results 버킷 2개를 생성해야 한다.

버킷 이름은 2022communityday-내이름-media 로 지정했고, 나머지는 모두 기본값을 사용해서 버킷을 생성했다. 
(Region은 Asia Pacific (Seoul) 을 선택해줬고, Public Access 설정과 다른 것 모두 기본값을 사용)

Results 버킷도 똑같은 방법으로 2022communityday-내이름-results 으로 하나 생성해주자. 

생성된 Media, Results 버킷

 

버킷에 들어가서 '권한' 메뉴로 들어간다. 아래로 내리면 '버킷 정책'을 설정할 수 있는 부분이 있는데 '편집'을 눌러서 수정하자.

그리고 아래 버킷 정책을 복사 & 붙여넣기 해서 넣어준다. ⏬

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "ListObjectsInBucket",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:ListBucket",
            "Resource": "arn:aws:s3:::cdaytest-bucket-media"
        },
        {
            "Sid": "AllObjectActions",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:*Object",
            "Resource": "arn:aws:s3:::cdaytest-bucket-media/*"
        }
    ]
}

Results 버킷도 똑같이 정책 설정을 해주면 버킷 생성이 완료 되었다. 

(사실 Media/Results 를 나누지 않고 버킷을 하나만 만들어서 input, output을 모두 받는 것도 상관 없다. 이번 실습에서는 아키텍처가 헷갈릴까봐 일부러 나눠둔 건데 하나만 만들어서 media와 Results를 한 버킷으로 지정해도 된다.)

 

2. Step Functions 상태머신에서 사용할 IAM 역할 생성하기

본격적으로 Step Functions 상태머신을 만들기 전에, 우리가 사용할 다른 서비스(Transcribe, S3 등)에 Step Functions 서비스가 접근할 수 있도록 IAM 역할을 정의해야 한다. 

IAM 콘솔에 들어가서, 좌측에 있는 "역할" 메뉴를 클릭하고, "역할 생성"을 클릭해 생성 창으로 이동한다.

'Step 1. 신뢰할 수 있는 엔터티 선택' 에서 "AWS 서비스"를 클릭하고, 검색창에 "Step Functions"를 입력한 후, "Step Functions" 서비스를 클릭한다.

다음 > 다음 을 눌러 역할 이름을 지정하고 '역할 생성' 버튼으로 역할을 생성한다. 

이제 역할(role)에 정책(policy)을 연결시켜주자. 

방금 만든 역할을 클릭해 들어가고, 

아래 화면에서 '권한 추가 > 인라인 정책 생성'을 누른다. 

 

아래와 같은 정책 생성 페이지에서 "JSON" 메뉴에, 아래 정책을 복사 & 붙여넣기 한다.

정책 ⏬

상태머신이 사용할 S3, Transcribe 서비스에 대해 최소 권한만을 설정해주는 정책이다. 

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "xray:PutTraceSegments",
                "xray:PutTelemetryRecords",
                "xray:GetSamplingRules",
                "xray:GetSamplingTargets",
                "xray:GetSamplingStatisticSummaries"
            ],
            "Resource": "*",
            "Effect": "Allow",
            "Sid": "XrayAccessPolicy"
        },
        {
            "Action": [
                "s3:PutObject",
                "s3:PutObjectAcl",
                "s3:PutLifecycleConfiguration"
            ],
            "Resource": [
                "arn:aws:s3:::cdaytest-bucket-results",
                "arn:aws:s3:::cdaytest-bucket-results/*"
            ],
            "Effect": "Allow"
        },
        {
            "Action": [
                "transcribe:GetTranscriptionJob",
                "transcribe:StartTranscriptionJob",
                "transcribe:CreateVocabularyFilter"
            ],
            "Resource": "*",
            "Effect": "Allow",
            "Sid": "TranscriptJobPolicy"
        }
    ]
}

 

'정책 검토' 버튼을 눌러서, 원하는 정책 이름을 입력하고, '정책 생성'을 하면 IAM 설정이 완료된다.

 

3. (드디어) Step Functions 상태머신을 만들 수 있다. 

여기까지, 버킷을 생성하고 IAM 권한까지 설정해줌으로써 실습 준비물이 모두 준비됐다!

우리는 아래와 같은 상태머신을 만들 것이다. 

 

필터를 먼저 생성하고(CreateVocabularyFilter),

S3 Media 버킷의 비디오를 텍스트로 변환해주는 작업을 거친다. (StartTranscriptionJob)

이후 텍스트 변환 작업이 "진행 중인지" or "성공적으로 끝났는지" or "오류가 발생했는지"를 확인하기 위해 GetTranscriptionJob 으로 상태를 받아오고,

성공적으로 끝났을 경우 S3 api로 스크립트를 저장해 줄 것이다.

 

Step Functions 콘솔로 가보자. 

/

아래 부분부터는 실습 영상에서 다루는 내용으로, 업데이트 전까지는 아래 영상으로 확인할 수 있습니다.

가이드 내용은 계속 업데이트 됩니다. 

https://youtu.be/af9zNJq64HI

 

4. EventBridge 로 S3에 이벤트가 발생하면 Step Functions을 자동 실행하도록 규칙을 설정하자.

이 부분도 실습에서 다루는 내용으로, 업데이트 전까지는 아래 영상으로 확인할 수 있습니다.

https://youtu.be/EsBJ1aMf2Is