버전 비교

  • 이 줄이 추가되었습니다.
  • 이 줄이 삭제되었습니다.
  • 서식이 변경되었습니다.

...

펼치기
title목차 자세히 보기


패널
borderColor#6699ff
bgColor#ffffff
titleColorwhite
titleBGColor#6699ff
borderStylesolid
title목차


목차 영역

목차
maxLevel3
stylenone
separatorpipe




펼치기
title버전 정보 업데이트

20192021-1206-31 01 ver 3.0 업데이트 예정 내용

  • Lambda의 Environment variables 설정하는 부분을 AWS Systems Manager parameter store로 변경합니다.
  • 프로젝트 또는 팀 단위로 리소스를 관리하기 위한 Tag 설정과 확인하는 방법을 기술합니다.
  • 스크린샷 이미지를 새로 찍고, 순서 번호를 기술합니다.
  • Translate 기능을 추가하여 원하는 언어로 번역하는 기능이 추가 됩니다. (현재 UI 변경됨)
  • API Gateway에서 Custom Domain을 적용하는 방법을 기술합니다.
  • X-Ray를 이용한 디버깅 기능 추가 방법을 기술 합니다. (기능 활성화만 포함)

2021-04-08 ver 2.2 업데이트

  • 아키텍처 다이어그램 아이콘 수정
  • 웹 콘솔 UI 변경 사항 업데이트
  • 내용 일부 수정

2019-07-31 ver 2.1 업데이트

  • 스크린샷을 7월 31일 기준에 맞게 새로 작성하였습니다. UI 변경된 부분이 반영되었습니다.
  • API Gateway CORS 설정을 기본값 그대로 변경했습니다.
  • API Gateway Tags 입력 부분이 변경되었습니다.
  • SNS Topic을 생성할 때 Tags 입력하는 부분이 업데이트 되었습니다.
  • Systems Manager에서 관리하는 Tags 정보를 Resource Groups 으로 변경하였습니다.

2019-03-06 ver 2.0 업데이트

  • UI 디자인을 변경했습니다. (Semantic-UI 적용)

...

draw.io Diagram
bordertrue
viewerToolbartrue
fitWindowfalse
diagramNameServerless101HOL
simpleViewerfalse
width
diagramWidth11821200
revision35

이 애플리케이션은 크게 세 가지 서비스를 제공합니다.

...

리전을 서울(우측 상단)로 선택하고, 언어는 영어로 진행(좌측 하단)

Image RemovedImage Added


2. DynamoDB 테이블 만들기

DynamoDB는 게시물 정보와 생성된 MP3의 URL 메타 정보를 저장합니다.

  1. DynamoDB 서비스로 이동합니다.
    Image Removed(자주 사용하는 서비스는 즐겨찾기(별)로 등록 가능합니다.)
    Image Added
  2. Create Table 버튼을 클릭합니다.
    Image RemovedImage Added
  3. DynamoDB 콘솔에서  NewsTable  라고 하는 단일 테이블을 만듭니다. 기본 키  id 는 String이고, PostNews Lambda 함수에 의해 새 레코드는 NewsTable  에 추가 생성합니다.
    실습에 사용하는 서비스들을 관리하기 위한 목적으로 Tag를 추가합니다. Key는 Name 을 추가하고, Value는 NewsApp 을 추가합니다.
    Image RemovedImage Added
  4. NoSQL인 DynamoDB를 사용하므로 스키마를 사전에 정의하지 않고, 사용하게 될 속성 값이 어떤 것이 있는지 살펴 보겠습니다.

    keyvalue
    id게시물 ID (UUID로 자동 생성)
    voice오디오 파일을 생성하는데 사용된 Amazon Polly 음성
    pollyStatus처리 상태에 따라서 PROCESSING 또는 UPDATED로 구분
    originText원문 텍스트
    RequestCharacters요청한 문자 개수
    mp3UrlPolly에 의해서 생성된 mp3 접근 URL
    updateDate수정된 시간
    timbre음색 (소리의 파형)
    pitch음조 ( 소리의 높낮이)

    5. 테이블 생성 확인
    Image RemovedImage Added


3. SNS Topic 만들기

...

두 번째 이유는 Lambda 함수는 15분 동안 실행할 수 있습니다. 이는 게시물을 변환하기 위해 충분한 시간입니다. 미래에 더 큰 것을 변화시키고 자 할 경우 Lambda 대신 AWS Batch를 사용하고자 할 수 있습니다. 애플리케이션의 이 두 부분을 분리하면 이 변경 작업이 훨씬 쉬워집니다. 위와 같이 두 개의 컴포넌트(여기서는 Lambda 함수 두 개)가 있을 때 이를 통합할 수 있습니다. 즉, 두 번째 컴포넌트가 언제 시작할지 알아야 합니다. 여러 가지 방법으로 이 작업을 수행 할 수 있습니다. 이 경우 Amazon Polly가 작업이 완료되면, Amazon SNS를 트리거 하도록 합니다. 

  1. 그렇기에 간단한 SNS 주제를 만들어 보겠습니다. 서비스 검색창에서도 서비스를 찾을 수 있습니다. SNS 서비스로 서비스를 찾아서 이동합니다.
    Image RemovedImage Added
  2. 좌측 메뉴의 Topics 메뉴를 클릭한 후, 우측 상단의 Create topic 메뉴를 눌러서 Topic을 생성합니다. 또는 아래와 같이 Topics 메뉴를 클릭한 후에 Create topic을 합니다.
    Image Removed Image Added
  3. 아래와 같이 같이 Standard 를 선택하고, NewsTopic  이라는 새로운 Topic Name과 Display name을 생성합니다. 하단에는 Key는 Name 으로, Value는 NewsApp 을 Tag로 추가하고, Create topic 버튼을 클릭합니다.
    Image RemovedImage Added
    Image Added
  4. 생성된 SNS는 Amazon Polly가 작업이 완료되면 알려주기 위해서 해당 Topic을 호출해야 합니다. 따라서 생성된 Topic에 대한 아마존 고유 리소스 이름(ARN)을 알아야 합니다.

    정보

    아래와 같이 생성된 Topic의 ARN을 복사하여 메모장 에 기록해 둡니다. (사용자 별로 다르게 나옵니다. 본인의 ARN 을 복사합니다.)
    Topic ARN 복사 하기: 

    Image RemovedImage Added

4. mp3 저장을 위한 S3 버킷 만들기

응용 프로그램에서 생성한 모든 오디오 파일을 저장하는 S3 버킷을 만들어야합니다.

  1. 아래 그림처럼 S3 서비스로 이동합니다.
    Image RemovedImage Added
  2. 기존에 만들어진 S3 버킷이 있다면, 해당 버킷을 볼 수 있습니다. 버킷을 새로 생성하기 위하여, Create bucket 버튼을 클릭합니다.
    Image Removed Image Added

  3. 팝업창에서 Bucket name을 적습니다. 아래 예제에서는  polly-mp3.awsdemo.kr 이라는 버킷 이름으로 작성하지만, 실습에서는 전 세계적으로  고유한 다른 이름으로 작성 해야 합니다. 작성후 Next 버튼을 클릭 아래 Tag에서 Key에 Name 을 Value에 NewsApp 을 입력하고, 하단의 Create Bucket 버튼을 클릭 합니다.
    Image Added

  4. 외부에서 퍼블릭하게 접속해서 mp3 재생이 되도록 체크 박스를 모두 해지  상태로 변경하고 하단의 경고 상자에 체크박스를 선택 합니다.
    Image RemovedImage Added
  5. (옵션) Tags 정보에 Key에는 Name 을 Value에는 NewsApp 을 추가하고 Next Create bucket 버튼을 클릭합니다. 서비스별로 Tags 정보를 입력하면, 태그 정보를 기반으로 어느 프로젝트에 서비스가 어떤 것이 할당 되어 있고, 비용이 얼마가 나오는지 산정을 할 수 있습니다. 
    Image Removed
  6. 외부에서 퍼블릭하게 접속해서 mp3 재생이 되도록 체크 박스를 모두 해지   상태로 변경하고 Next 버튼을 클릭합니다. (기본은 체크되어 안전하게 막혀 있음)
    Image Removed
  7. Image Added

  8. 버킷이 생성된 것을 확인합니다.
    Image Added모든 설정이 완료되면 Create Bucket 버튼을 클릭하고 S3 버킷을 생성합니다.
    Image Removed


5. IAM 역할 만들기

Lambda 함수를 만들기 전에 함수에 대한 IAM 역할을 만들어야 합니다. 역할은 함수가 상호 작용할 수 있는 AWS 서비스(API)를 지정합니다. 세 가지 Lambda 함수 모두에 대해 하나의 역할을 만듭니다. (원래 기능별로 역할을 만들지만, 예제 구현을 위해 하나로 만듭니다.)
역할을 생성하기 위해서 역할에 부여될 정책을 JSON 포맷으로 생성하고, 생성한 정책을 해당 역할에 부여합니다.

  1. IAM 서비스로 이동
    Image RemovedImage Added

  2. Lambda를 위한 Role을 만들기 위해서 좌측 메뉴의 Roles 를 클릭 하고, 화면에서  Create role 버튼을 클릭합니다.
    Image RemovedImage Added

  3. 이 역할을 사용하는 주체는 AWS Service Lambda  를 선택하고,  Next: Permissions 버큰을 클릭 합니다.
    Image Added
    Image RemovedImage Added

  4. Create policy 버튼을 클릭하여 정책을 새로 만듭니다. 새 탭(새 창)에 Create policy가 표시 됩니다.
    Image RemovedImage Added
  5. 탭 메뉴에 있는 Visual editor JSON 으로 변경하여 사전에 준비해둔 JSON 데이터를 넣습니다.
    Image RemovedImage Added
  6. 아래 리소스에 대한 접근 정책을 JSON으로 추가합니다.

    코드 블럭
    {
      "Version":"2012-10-17",
      "Statement":[ 
        { 
          "Effect":"Allow",
          "Action":[ 
            "logs:CreateLogGroup",
            "logs:CreateLogStream",
            "logs:PutLogEvents",
            "polly:StartSpeechSynthesisTask",
            "dynamodb:Query",
            "dynamodb:Scan",
            "dynamodb:PutItem",
            "dynamodb:UpdateItem",
            "dynamodb:DeleteItem",
            "sns:Publish",
            "s3:PutObject",
            "s3:PutObjectAcl",
            "s3:DeleteObject",
            "s3:GetBucketLocation"
          ],
          "Resource":[ 
            "*"
          ]
        }
      ]
    }


  7. 하단과 같이 JSON 데이터를 입력하고, 우측 하단의 Review policy Next: Tags 버튼을 클릭합니다.
    Image Added

  8. Tags 정보에 Key에는 Name 을 Value에는 NewsApp 을 추가하고 Next: Review 버튼을 클릭합니다.
    Image RemovedImage Added
  9. 정책 이름과 설명을  NewsPolicy  로 지정하고, 중앙에 어떤 서비스에 대한 권한을 주었는지 검토한 후, 하단 우측의 Create policy 버튼을 클릭합니다.
    Image RemovedImage Added

  10. 아래와 같이 NewsPolicy 정책이 만들어 진 것을 알 수 있습니다.
    Image Removed검색창에서 검색하면 만들어진 정책을 확인할 수 있습니다. 정책이 생성되면 새로 열린 웹 브라우저 탭을 닫거나 기존 Role 만드는 화면으로 넘어 갑니다.
    Image Added

  11. 원래 Role을 생성하는 탭(창)으로 돌아와서 NewsPolicy 를 검색합니다. 만약 보이지 않는다면, 우측 상단의 새로 고침 버튼을 클릭합니다. 좌측 체크 박스를 클릭  하고 태그를 입력하는 다음 단계로 이동합니다.
    Image RemovedImage Added

  12. (옵션) Role의 Tag를 입력합니다. 프로젝트로 NewsApp을 만들기 때문에 Key를 Name 으로 Value를 NewsApp 으로 정의합니다. 다음 작업을 위해 Next: Review 버튼을 클릭합니다.
    Image RemovedImage Added

  13. Role의 이름은  NewsRole 을 넣습니다. 우측 하단의 Create role 버튼을 클릭합니다.
    Image RemovedImage Added
  14. Role에서 방금 생성한 NewsRole을 검색할 수 있습니다. 해당 Role을 클릭하면,  NewsPolicy 정책이 할당되어 있는 NewsRole  이 생성된 것을 확인할 수 있습니다.
    Image RemovedImage Added


6. PostNews Lambda 함수 만들기

...

  1. AWS 관리 콘솔에서  Lambda  서비스로 이동합니다.
    Image RemovedImage Added

  2. Create a function 버튼을 클릭하여 Lambda 함수를 하나 만들겠습니다. 또는 좌측 메뉴를 열고,  Functions  Dashboard나 Functions 메뉴를 선택하고, 우측의 Create function 버튼을 클릭합니다.
    Image Removed Image Added
    Image Removed
  3. 새로운 함수의 Name은  PostNews  라고 만듭니다. Runtime은  Python 23.78  을 선택합니다. Role은  Choose an existing role  을 선택하고, 위에서 생성한 IAM Role인  NewsRole  을 선택합니다. 그리고 우측 하단의 Create function   버튼을 클릭합니다.
    Image Removed Image Added

  4. Lambda 함수가 정상적으로 만들어진 것을 확인할 수 있습니다. Lambda의 실행 구조는 Designer Function Overview 메뉴 에서 볼 수 있습니다. 트리거 되면, PostNews가 실행되고, 코드 안에서 특정 서비스로 접근하기 위한 권한을 Role을 통해서 할당 받은 것을 알 수 있습니다.
    Image RemovedImage Added

  5. Designer 탭을 클릭해서 접으면, 아래 Function Code를 볼 수 있습니다. Lambda 함수 코드 편집기는  AWS Cloud9  IDE가 내장되어 있어서 코드 편집을 웹 브라우저에서도 쉽게 할 수 있는 환경을 제공합니다. Runtime으로 Python 2.7이 선택되어져 있는 것을 볼 수 있습니다. Handler는 함수가 시작하기 위한 파일의 위치와 함수의 이름을 의미합니다.

  6. 아래 코드를 이 Lambda 함수의 코드로 변경합니다. 해당 함수의 로직은 Polly에 TTS 작업을 요청하고, 요청 작업에 대한 ID 값을 DynamoDB에 등록합니다.

    코드 블럭
    # -*- coding: utf-8 -*-
    from __future__ import print_function
      
    import boto3
    import os
    import json
    import uuid
    import datetime
    import re
     
    def lambda_handler(event, context):
        if "body" in event:
            parmas = json.loads(event['body'])
         
        voice = parmas["voice"]
        originText = parmas["text"]
        timbre = parmas["timbre"]
        pitch = parmas["pitch"]
        updateDate = datetime.datetime.now().strftime("%Y%m%d")
      
        polly = boto3.client('polly')
        removeBrackets = re.sub(r'\([^)]*\)', '', originText)
        repTextBlock = re.sub('[·…]', '<break time="100ms"/>', removeBrackets)
        ssmlBlock = "<speak><amazon:effect vocal-tract-length=\"" + timbre + "\"><prosody pitch=\"" + pitch + "\">" + repTextBlock + "</prosody></amazon:effect></speak>"
        ssmlBlock = ssmlBlock.replace('철수', '<amazon:effect vocal-tract-length="+80%"><prosody pitch="-70%">안녕하세요? 저는 서연 친구 철수에요.</prosody></amazon:effect>')
        ssmlBlock = ssmlBlock.replace('귀신', '<amazon:effect name="whispered"><amazon:effect vocal-tract-length="-30%"><prosody volume="loud">나 꿍꼬또, 기싱꿍꼬또</prosody></amazon:effect></amazon:effect>')
        print (ssmlBlock)
          
        response = polly.start_speech_synthesis_task(
            OutputFormat= 'mp3',
            OutputS3BucketName= os.environ['BUCKET_NAME'],
            # OutputS3KeyPrefix='polly/',
            SampleRate='22050',
            SnsTopicArn=os.environ['SNS_TOPIC'],
            Text=ssmlBlock,
            TextType='ssml',
            VoiceId=voice
        )
        print (response)
        data = response['SynthesisTask']
          
        # Creating new record in DynamoDB table
        dynamodb = boto3.resource('dynamodb')
        table = dynamodb.Table(os.environ['DB_TABLE_NAME'])
        table.put_item(
            Item = {
                'id' : data['TaskId'],
                'updateDate': data['CreationTime'].strftime("%Y-%m-%d %H:%M:%S"),
                'voice' : voice,
                'originText': originText,
                'pollyStatus' : data['TaskStatus'],
                'timbre': timbre,
                'pitch': pitch,
                'mp3Url': data['OutputUri'],
                'RequestCharacters': data['RequestCharacters']
            }
        )
         
        result = {
            'statusCode': 200,
            'body': json.dumps({'recordId': data['TaskId']}),
            'headers': {
                'Content-Type': 'application/json',
                'Access-Control-Allow-Origin': '*'
            }
        }
          
        return result


  7. 아래와 같이 함수 코드를 변경하고 나면 우측 상단의 Save 버튼을 눌러서 환경을 저장합니다.
  8. PostNews Lambda 함수에는 환경 변수 값을 넣을 수 있습니다. 메타 데이터가 저장될 DynamoDB 테이블( DB_TABLE_NAME ), Polly가 작업을 완료하면 다음 Lambda 함수를 트리거 시키기 위한 SNS Topic( SNS_TOPIC ), Polly에 의해서 만들어지는 mp3가 저장될 S3의 버켓( BUCKET_NAME )의 이름을 지정해야 합니다. 이 값을 환경 변수로 함수에 전달할 수 있는 기능을 사용하기 위하여 Environment variables를 사용할 수 있습니다. 아래와 같이 Lamba Function Code 하단으로 스크롤을 내려서, S3 버킷 이름( polly-mp3.studydev.com )과, NewsTopic 의 ARN 값( , DynamoDB 테이블의 NewsTable 값을 아래와 같이 입력합니다.
    추가로 하단의 Basic settings에서 Lambda의 실행 시간을 지정할 수 있습니다. Timeout 값을 1 min 으로 수정합니다. Tags에는 Key 값으로 Name 을 Value 값을 NewsApp  을 입력하고, 우측 상단의 Save   버튼을 클릭하여 환경을 저장합니다.

...