...
- Cloud9을 이용하여 서버리스 애플리케이션을 SAM(Serverless Application Model) 기반으로 개발/테스트/배포 할 수 있습니다.
- Cloud9, SAM, IAM
- SAM을 이해하고 서버리스 서비스에 필요한 서비스를 직접 기술 할 수 있습니다.
- API Gateway, Lambda, DynamoDB, S3, SNS, Polly
- 서버리스 애플리케이션을 AWS Code 시리즈를 이용하여 배포 프로세스를 제작할 수 있습니다.
- CodePipeline, CodeCommit, CodeBuild, CloudFormation(SAM), CodeDeploy
실습 비용
Service | Sub Service | Unit | Pricing |
---|
Use | free tier | etc | |
---|---|---|---|
Cloud9 | EC2 - t2.micro | 1 hour | $0.0116/Hour |
t2. |
micro 2hour | 750hour/month | |
EBS - 8GB | 1 month | $0.1/GB |
8GB 2hour | 30GB/month | ||
Lambda | - | 128MB | $0.000000208/100ms |
1,000번 이하 | 100만번 요청 400GB-초 | 1년 후 지속 제공 | |
API Gateway | - | 1백만 API 호출당 |
$3.50 |
처음 10TB에 대해 |
$0.09 |
/GB | 1,000번 이하 | 호출 100만건 | |
DynamoDB | - |
구축하고자 하는 서버리스 웹 애플리케이션에 대한 소개
아래 다이어그램은 실습에서 구축하고자 하는 서버리스 웹 애플리케이션의 아키텍처 입니다. 서버리스 서비스를 이용하기 때문에, 프로비저닝, 패치, 확장에 대해 고민할 필요가 없으며, 사용한 만큼은 비용을 지불할 수 있습니다.
또한, AWS 완전 관리형 서비스이기 때문에 AWS가 이를 관리하기 때문에 우리는 애플리케이션 개발에만 집중할 수 있습니다.
...
이 애플리케이션은 다섯 가지 영역으로 나뉘어서 제작할 수 있습니다.
- 첫 번째는 HTML, CSS, Javascript 및 이미지를 S3를 이용하여 정적 웹 페이지로 호스팅 합니다.
- 두 번째는 새로운 게시물에 대한 텍스트 정보를 등록하고, 비동기 처리를 위해서 SNS에 DynamoDB에 등록한 id 값을 Publish 합니다.
- 세 번째는 SNS에 의해서 트리거된 ConvertToAudio 함수에 의하여 DynamoDB에 등록된 텍스트를 수집하고, Polly를 이용하여 MP3 파일로 변환하고 S3 버켓에 파일을 업로드 하고, 최종 결과를 DynamoDB에 업데이트 합니다.
- 네 번째는 게시물에 대한 정보(S3 버킷에 저장된 MP3 파일에 대한 링크 포함)를 검색하는 것입니다.
- 다섯 번째는 사전에 등록한 게시물과 생성한 MP3 파일을 삭제하는 것입니다.
News 등록/수집/삭제는 Amazon API Gateway를 통해 RESTful API 서비스로 제공됩니다. 로직은 Lambda 서비스를 통해서 구현되며 애플리케이션이 어떻게 상호 작용 하는지 살펴 보겠습니다.
정적 웹페이지 구현
- 이 시나리오는 Amazon S3(Simple Storage Service)에서 호스팅되는 정적 웹 페이지를 기반으로 실행합니다.
새로운 뉴스를 등록
- MP3로 생성할 텍스트 정보는 Amazon API Gateway에 의해 노출된 RESTful API로 수신합니다.
- Amazon API Gateway는 MP3 파일 생성 프로세스를 초기화하는 전용 Lambda 함수인 "New Post"를 설정합니다.
- "New Post" Lambda 함수는 News에 대한 메타 정보를 DynamoDB 테이블에 저장합니다.
- TTS 변환 프로세스를 비동기적으로 실행하기 위해 Amazon SNS의 Topic(NewsTopic)에 DynamoDB(NewsTable)에 등록한 새로운 id 값을 Publish 합니다.
텍스트를 MP3로 변환
- Amazon SNS Topic에 의해서 텍스트를 오디오 파일로 변환하기 위한 Lambda 함수인 "ConvertAudio"는 에서 트리거 되도록 설정합니다.
- "ConvertAudio" Lambda 함수는 Amazon Polly를 사용하여 텍스트를 지정된 언어의 음성을 이용하여 오디오 파일로 변환합니다.
- 생성된 오디오 파일인 MP3 파일은 전용 S3 버킷에 저장합니다.
- 텍스트가 MP3로 변환된 S3 버킷에 대한 참조 URL 정보 및 해당 게시물 처리 상태에 대한 정보는 DynamoDB 테이블에 업데이트 합니다.
등록된 뉴스 정보 검색
- RESTful 웹 서비스는 Amazon API Gateway를 사용하여 배포합니다. Amazon API Gateway는 게시물에 대한 정보를 검색하는 방법을 제공합니다.
이 방법은 게시물의 텍스트와 MP3 파일이 저장되는 S3 버킷에 대한 링크가 포함됩니다. 이 시나리오에서 이 웹 서비스는 Amazon S3에서 호스팅되는 정적 웹 페이지에서 호출됩니다. - Amazon API Gateway는 뉴스를 검색하는 Lambda 함수인 "GetNews"를 호출합니다.
- "Get Post" Lambda 함수는 DynamoDB 테이블에서 게시물에 대한 정보(Amazon S3에 대한 참조 URL을 포함)를 검색합니다.
기존 뉴스 삭제
- RESTful API의 Delete 메서드를 이용하여 삭제를 요청합니다.
- API Gateway는 뉴스 데이터를 삭제하는 Lambda 함수인 "DeleteNews"를 호출합니다.
실습
이 예제는 Cloud9이 존재하는 Singapore 리전에서 English 언어로 진행합니다.
실습은 다음과 같은 순서로 진행됩니다.
Lab1. Cloud 9을 이용한 웹 애플리케이션 구축 실습
- Cloud9 IDE 환경 생성
- Application 및 "PostNews" Lambda 함수 생성
- SAM(template.yml)에 DynamoDB, SNS, S3(Web, Mp3) 리소스 추가하기
- "ConvertAudio" Lambda 함수 생성
- "GetNews" Lambda 함수 생성
- "DeleteNews" Lambda 함수 생성
- SAM의 Output 설정
- 정적 웹 호스팅을 위한 파일 업로드하기
- 서비스 동작 테스트
- SAM을 CloudFormation 스택에 직접 반영하기
Lab2. 서버리스 서비스의 CI/CD 배포 프로세스 구축 실습
- 소스 리포지토리를 위해서 CodeCommit 생성
- CodeBuiild를 위한 buildspec.yaml 파일 생성
- CodePipeline 구축하기
- 소스 리포티토리에 코드 체크인하기
- 배포 결과 확인 (S3 정적 웹 페이지는 다루지 않습니다.)
- API를 이용해서 결과 확인
- Canary 배포를 위한 설정하기
- CloudFormation에서 CodeDeploy 할 수 있도록 IAM 정책 설정 적용
- 코드를 변경하여 배포하고 CodeDeploy 중에 API를 호출하여 적용되는지 확인하기
- 기존 배포 버전으로 롤백하기
Lab1. Cloud9을 이용한 웹 애플리케이션 구축 실습
1. Cloud9 IDE 환경 생성
2. Application 및 "PostNews" Lambda 함수 생성
...
language | py |
---|---|
theme | RDark |
title | PostNews |
linenumbers | true |
...
WCU당 최소 $0.47 RCU당 최소 $0.09 GB당 최소 $0.25 | WCU 5 RCU 5 스토리지 100M 이하 | 매달 2억건 요청 | 1년 후 지속 제공 | |||
SNS | - | 처음 1GB/월 $0.000 GB당 최대 10TB/월 $0.090 GB당 | 100M 이하 | 매달 15GB의 데이터 전송 | ||
Polly | - | 1백만 문자당 $4 | 1,000 문자 이하 | 매달 문자 500만개 | ||
CodeStar | CodePipeline | 월별 활성 파이프라인*당 $1 | 1개 | 매월 무료 활성 파이프라인 1개 | ||
CodeCommit | 최초 5명 초과시 월별 $1 GB당 $0.06/월 (10GB/월 초과) Git 요청당 $0.001 (1000회/월 초과) | 1개 | 최초 5명까지 매달 50GB의 스토리지 매달 10,000건의 Git 요청 | 1년 후 지속 제공 | ||
CodeBuild | build.general1.small $0.005/분 | 30분 | 매월 100 빌드 분의 build.general1.small | 1년 후 지속 제공 | ||
CodeDeploy | EC2 또는 Lambda에 배포 무료 | 30회 | - | |||
CloudFormation(SAM) | - | - | - | |||
s3 | - | PUT, COPY, POST 또는 LIST 요청 $0.005/1,000건 GET, SELECT 및 기타 모든 요청 $0.0004/1,000건 처음 50TB/월 $0.023/GB | Put 100번 내외 GET 2,000번 내외 | 매달 5GB 스토리지 Get 요청 20,000건 Put 요청 2,000건 |
실습 종료 후 리소스 삭제
실습이 종료되고 나면 리소스를 삭제해야 합니다. 해당 핸즈온은 CloudFormation 기반으로 진행됩니다. 배포 Stack을 삭제하고, 실습에 사용한 Cloud9과 같은 Stack을 삭제하면, 배포되어 있는 리소스도 함께 삭제가 됩니다.
반드시 상단에 게시된 리소스에 대해서 삭제가 이루어졌는지 확인 후 실습을 종료합니다.
구축하고자 하는 서버리스 웹 애플리케이션에 대한 소개
아래 다이어그램은 실습에서 구축하고자 하는 서버리스 웹 애플리케이션의 아키텍처 입니다. 서버리스 서비스를 이용하기 때문에, 프로비저닝, 패치, 확장에 대해 고민할 필요가 없으며, 사용한 만큼은 비용을 지불할 수 있습니다.
또한, AWS 완전 관리형 서비스이기 때문에 AWS가 이를 관리하기 때문에 우리는 애플리케이션 개발에만 집중할 수 있습니다.
draw.io Diagram | ||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
이 애플리케이션은 다섯 가지 영역으로 나뉘어서 제작할 수 있습니다.
- 첫 번째는 HTML, CSS, Javascript 및 이미지를 S3를 이용하여 정적 웹 페이지로 호스팅 합니다.
- 두 번째는 새로운 게시물에 대한 텍스트 정보를 등록하고, 비동기 처리를 위해서 SNS에 DynamoDB에 등록한 id 값을 Publish 합니다.
- 세 번째는 SNS에 의해서 트리거된 ConvertToAudio 함수에 의하여 DynamoDB에 등록된 텍스트를 수집하고, Polly를 이용하여 MP3 파일로 변환하고 S3 버켓에 파일을 업로드 하고, 최종 결과를 DynamoDB에 업데이트 합니다.
- 네 번째는 게시물에 대한 정보(S3 버킷에 저장된 MP3 파일에 대한 링크 포함)를 검색하는 것입니다.
- 다섯 번째는 사전에 등록한 게시물과 생성한 MP3 파일을 삭제하는 것입니다.
News 등록/수집/삭제는 Amazon API Gateway를 통해 RESTful API 서비스로 제공됩니다. 로직은 Lambda 서비스를 통해서 구현되며 애플리케이션이 어떻게 상호 작용 하는지 살펴 보겠습니다.
정적 웹페이지 구현
- 이 시나리오는 Amazon S3(Simple Storage Service)에서 호스팅되는 정적 웹 페이지를 기반으로 실행합니다.
새로운 뉴스를 등록
- MP3로 생성할 텍스트 정보는 Amazon API Gateway에 의해 노출된 RESTful API로 수신합니다.
- Amazon API Gateway는 MP3 파일 생성 프로세스를 초기화하는 전용 Lambda 함수인 "New Post"를 설정합니다.
- "New Post" Lambda 함수는 News에 대한 메타 정보를 DynamoDB 테이블에 저장합니다.
- TTS 변환 프로세스를 비동기적으로 실행하기 위해 Amazon SNS의 Topic(NewsTopic)에 DynamoDB(NewsTable)에 등록한 새로운 id 값을 Publish 합니다.
텍스트를 MP3로 변환
- Amazon SNS Topic에 의해서 텍스트를 오디오 파일로 변환하기 위한 Lambda 함수인 "ConvertAudio"는 에서 트리거 되도록 설정합니다.
- "ConvertAudio" Lambda 함수는 Amazon Polly를 사용하여 텍스트를 지정된 언어의 음성을 이용하여 오디오 파일로 변환합니다.
- 생성된 오디오 파일인 MP3 파일은 전용 S3 버킷에 저장합니다.
- 텍스트가 MP3로 변환된 S3 버킷에 대한 참조 URL 정보 및 해당 게시물 처리 상태에 대한 정보는 DynamoDB 테이블에 업데이트 합니다.
등록된 뉴스 정보 검색
- RESTful 웹 서비스는 Amazon API Gateway를 사용하여 배포합니다. Amazon API Gateway는 게시물에 대한 정보를 검색하는 방법을 제공합니다.
이 방법은 게시물의 텍스트와 MP3 파일이 저장되는 S3 버킷에 대한 링크가 포함됩니다. 이 시나리오에서 이 웹 서비스는 Amazon S3에서 호스팅되는 정적 웹 페이지에서 호출됩니다. - Amazon API Gateway는 뉴스를 검색하는 Lambda 함수인 "GetNews"를 호출합니다.
- "Get Post" Lambda 함수는 DynamoDB 테이블에서 게시물에 대한 정보(Amazon S3에 대한 참조 URL을 포함)를 검색합니다.
기존 뉴스 삭제
- RESTful API의 Delete 메서드를 이용하여 삭제를 요청합니다.
- API Gateway는 뉴스 데이터를 삭제하는 Lambda 함수인 "DeleteNews"를 호출합니다.
실습
이 예제는 Cloud9이 존재하는 Singapore 리전에서 English 언어로 진행합니다.
실습은 다음과 같은 순서로 진행됩니다.
Lab1. Cloud 9을 이용한 웹 애플리케이션 구축 실습
- Cloud9 IDE 환경 생성
- Application 및 "PostNews" Lambda 함수 생성
- SAM(template.yml)에 DynamoDB, SNS, S3(Web, Mp3) 리소스 추가하기
- "ConvertAudio" Lambda 함수 생성
- "GetNews" Lambda 함수 생성
- "DeleteNews" Lambda 함수 생성
- SAM의 Output 설정
- 정적 웹 호스팅을 위한 파일 업로드하기
- 서비스 동작 테스트
- SAM을 CloudFormation 스택에 직접 반영하기
Lab2. 서버리스 서비스의 CI/CD 배포 프로세스 구축 실습
- 소스 리포지토리를 위해서 CodeCommit 생성
- CodeBuiild를 위한 buildspec.yaml 파일 생성
- CodePipeline 구축하기
- 소스 리포티토리에 코드 체크인하기
- 배포 결과 확인 (S3 정적 웹 페이지는 다루지 않습니다.)
- API를 이용해서 결과 확인
- Canary 배포를 위한 설정하기
- CloudFormation에서 CodeDeploy 할 수 있도록 IAM 정책 설정 적용
- 코드를 변경하여 배포하고 CodeDeploy 중에 API를 호출하여 적용되는지 확인하기
- 기존 배포 버전으로 롤백하기
Lab1. Cloud9을 이용한 웹 애플리케이션 구축 실습
Cloud9 IDE 환경 생성
- Cloud9 서비스로 이동합니다.
- Cloud9 서비스 환경을 생성합니다.
- Cloud9 이름을 생성합니다.
- Cloud9의 환경을 설정합니다. t2.micro를 선택하면 프리티어 범위를 사용할 수 있습니다.
- 가나다
- 가나다
- 가나다
Application 및 "PostNews" Lambda 함수 생성
- 새로운 애플리케이션 및 람다 함수 생성합니다. Cloud9 IDE 우측 네비게이션의 AWS Resources 탭을 클릭하고, Lambda 아이콘을 클릭하면 새로운 함수를 생성할 수 있습니다.
- Application name에는 WebApp을 Function name에는 PostNews를 입력하고 Next 버튼을 클릭합니다.
- Runtime은 Python 2.7을 선택하고, Blueprint는 hello-world-python을 선택하고 Next 버튼을 클릭합니다.
- 가나다
- 가나다
- 가나다
- 가나다
가나다
코드 블럭 language py theme RDark title PostNews linenumbers true # -*- coding: utf-8 -*- from __future__ import print_function import boto3 import os import json import uuid import datetime def lambda_handler(event, context): if "body" in event: event = json.loads(event['body']) print (event) recordId = str(uuid.uuid4()) voice = event["voice"] originText = event["text"] timbre = event["timbre"] pitch = event["pitch"] updateDate = datetime.datetime.now().strftime("%Y%m%d") print('Generating new DynamoDB record, with ID: ' + recordId) # Create the item in DynamoDB table dynamodb = boto3.resource('dynamodb') table = dynamodb.Table(os.environ['DB_TABLE_NAME']) table.put_item( Item={ 'id' : recordId, 'originText': originText, 'postDate': int(updateDate), 'pollyVoice' : voice, 'pollyStatus' : "PROCESSING", 'pollyTimbre': timbre, 'pollyPitch': pitch } ) # Sending notification about new post to SNS client = boto3.client('sns') client.publish( TopicArn = os.environ['SNS_TOPIC'], Message = recordId ) response = { 'statusCode': 200, 'body': json.dumps({'recordId': recordId}), 'headers': { 'Content-Type': 'application/json', 'Access-Control-Allow-Origin': '*' } } return response
- 가나다
가나다
코드 블럭 language yml theme RDark title PostNewsTemplate_01 linenumbers true AWSTemplateFormatVersion: '2010-09-09' Transform: 'AWS::Serverless-2016-10-31' Description: >- Building Serverless development environment and CI/CD process for DevOps based on Cloud9 Globals: Function: Runtime: python2.7 Handler: lambda_function.lambda_handler MemorySize: 128 Timeout: 60 Resources: PostNews: Type: 'AWS::Serverless::Function' Properties: CodeUri: PostNews Description: Post news text to convert from text to speech Events: PostNewsApi: Type: Api Properties: Path: /news Method: POST Policies: - Version: '2012-10-17' Statement: - Effect: Allow Action: - 'logs:PutLogEvents' - 'logs:CreateLogStream' - 'dynamodb:PutItem' - 'sns:Publish' Resource: '*'
...
- 배포하기
필수 리소스를 SAM에 추가하고 리소스 확인
가나다
코드 블럭 language yml theme RDark title PostNewsTemplate_02 linenumbers true AWSTemplateFormatVersion: '2010-09-09' Transform: 'AWS::Serverless-2016-10-31' Description: >- Building Serverless development environment and CI/CD process for DevOps based on Cloud9 Globals: Function: Runtime: python2.7 Handler: lambda_function.lambda_handler MemorySize: 128 Timeout: 60 Environment: Variables: DB_TABLE_NAME: Ref: NewsTable SNS_TOPIC: Ref: NewsTopic BUCKET_NAME: Ref: PollyMp3Bucket Resources: NewsTable: Type: 'AWS::Serverless::SimpleTable' Properties: PrimaryKey: Name: id Type: String ProvisionedThroughput: ReadCapacityUnits: 5 WriteCapacityUnits: 5 NewsTopic: Type: 'AWS::SNS::Topic' Properties: DisplayName: NewsTopic PollyMp3Bucket: Type: 'AWS::S3::Bucket' StaticWebBucket: Type: 'AWS::S3::Bucket' Properties: AccessControl: PublicRead WebsiteConfiguration: IndexDocument: index.html ErrorDocument: error.html PostNews: Type: 'AWS::Serverless::Function' Properties: CodeUri: PostNews Description: Post news text to convert from text to speech Events: PostNewsApi: Type: Api Properties: Path: /news Method: POST Policies: - Version: '2012-10-17
...
' Statement: - Effect: Allow Action: - 'logs:PutLogEvents' - 'logs:CreateLogStream' - 'dynamodb:PutItem'
...
- 'sns:Publish' Resource: '*'
- 가나다
- 가나다
"ConvertAudio" Lambda 함수 생성
- 가나다
- 가나다
- 가나다
- 가나다
- 가나다
- 가나다
- 가나다
"GetNews" Lambda 함수 생성
- 가나다
- 가나다
- 가나다
"DeleteNews" Lambda 함수 생성
- 가나다
- 가나다
- 가나다
S3 정적 컨텐츠 업로드
- 가나다
정적 웹 호스팅 파일 다운로드 받기
코드 블럭 language bash theme RDark linenumbers true wget https://s3.ap-
...
northeast-2.amazonaws.com/polly.awsdemokr.com/301_static_web.zip
압축 풀고 폴더 이동
코드 블럭 language bash theme RDark linenumbers true unzip 301_static_web.zip cd 301_static_web
Cloud9에서 scripts.js 파일 열어서 CloudFormation Stack에 배포된 Output의 APIEndpointURL 값을 소스코드에 반영 (WebsiteURL이 아니므로 주의)
코드 블럭 language js theme RDark linenumbers true var API_ENDPOINT = "https://xxxxxxxxxx.execute-api.ap-southeast-1.amazonaws.com/Prod/news/"; if (API_ENDPOINT === "") { alert("scripts.js 파일의 상단에 API Gateway에 배포한 URL을 등록하고
...
실행하세요."); }
정적 웹 포스팅하고자 하는 S3 버킷에 public-read 권한으로 파일을 업로드 (CloudFormation Stack에 배포된 Output의 S3WebBucket 값을 아래에 대체)
코드 블럭 language bash theme RDark linenumbers true aws s3 sync . s3://cloud9-webapp-staticwebbucket-xxxxxxxxxxxx --acl public-read
- 웹 브라우저로 정적 웹 페이지에 접속 (CloudFormation Stack에 배포된 Output의 WebsiteURL 값을 웹 브라우저 주소창에 입력)
Lab2. CodePipeline을 생성하여 CI/CD 프로세스 만들기
- CodeCommit 생성
- CoudBuild를 위한 nuildspec.yml 만들기
- CodePipeline 생성하기
- CodeDeploy 배포 (카나리 배포)
- 롤백하기 (Lambda - API Gateway)
코드 블럭 | ||||||||
---|---|---|---|---|---|---|---|---|
| ||||||||
# -*- coding: utf-8 -*- from __future__ import print_function import boto3 import os from contextlib import closing from boto3.dynamodb.conditions import Key, Attr import re def lambda_handler(event, context): postId = event["Records"][0]["Sns"]["Message"] print ("Text to Speech function. Post ID in DynamoDB: ", postId) # Retrieving information about the post from DynamoDB table dynamodb = boto3.resource('dynamodb') table = dynamodb.Table(os.environ['DB_TABLE_NAME']) postItem = table.query( KeyConditionExpression=Key('id').eq(postId) ) text = postItem["Items"][0]["originText"] voice = postItem["Items"][0]["pollyVoice"] timbre = postItem["Items"][0]["pollyTimbre"] pitch = postItem["Items"][0]["pollyPitch"] rest = text # Because single invocation of the polly synthesize_speech api can # transform text with about 3,000 characters, we are dividing the # post into blocks of approximately 2,900 characters. textBlocks = [] while (len(rest) > 3000): begin = 0 end = rest.find(".", 2900) if (end == -1): end = rest.find(" ", 2900) textBlock = rest[begin:end] rest = rest[end:] textBlocks.append(textBlock) textBlocks.append(rest) #For each block, invoke Polly API, which will transform text into audio polly = boto3.client('polly') for textBlock in textBlocks: removeBrackets = re.sub(r'\([^)]*\)', '', textBlock) repTextBlock = re.sub('[·…]', '<break time="100ms"/>', removeBrackets) #repTextBlock = re.sub('["·\'…]', '<break time="100ms"/>', removeBrackets) ssmlBlock = "<speak><amazon:effect vocal-tract-length=\"" + timbre + "\"><prosody pitch=\"" + pitch + "\">" + repTextBlock + "</prosody></amazon:effect></speak>" #print (ssmlBlock) response = polly.synthesize_speech(OutputFormat='mp3', Text = ssmlBlock, VoiceId = voice, TextType = 'ssml') #Save the audio stream returned by Amazon Polly on Lambda's temp # directory. If there are multiple text blocks, the audio stream # will be combined into a single file. if "AudioStream" in response: with closing(response["AudioStream"]) as stream: output = os.path.join("/tmp/", postId) with open(output, "a") as file: file.write(stream.read()) s3 = boto3.client('s3') s3.upload_file('/tmp/' + postId, os.environ['BUCKET_NAME'], postId + ".mp3") s3.put_object_acl(ACL='public-read', Bucket=os.environ['BUCKET_NAME'], Key= postId + ".mp3") location = s3.get_bucket_location(Bucket=os.environ['BUCKET_NAME']) region = location['LocationConstraint'] if region is None: url_begining = "https://s3.amazonaws.com/" else: url_begining = "https://s3-" + str(region) + ".amazonaws.com/" \ url = url_begining \ + str(os.environ['BUCKET_NAME']) \ + "/" \ + str(postId) \ + ".mp3" #Updating the item in DynamoDB response = table.update_item( Key={'id':postId}, UpdateExpression= "SET #statusAtt = :statusValue, #urlAtt = :urlValue", ExpressionAttributeValues= {':statusValue': 'UPDATED', ':urlValue': url}, ExpressionAttributeNames= {'#statusAtt': 'pollyStatus', '#urlAtt': 'mp3Url'}, ) return |
...
이 글은 Tomasz Stachlewski가 작성한 Build Your Own Text-to-Speech Applications with Amazon Polly 의 블로그를 한국어 콘솔에 맞게 번역 및 편집 하였습니다. - 김현수 솔루션스 아키텍트는 회사가 디지털 변환을 가속화 할 수 있게 해주는 서버리스(serverless) 아키텍처와 같은 혁신적인 기술과 인공지능(AI/ML)에 관심이 많습니다. |
기타 자료
- 가나다