一、架構圖
- 用戶通過前段網頁輸入文字,通過後臺一系列服務轉換成語音,並在前段展示,並提供下載功能,整個服務沒有使用一臺服務器!
- 用戶輸入文字進行提交;
- 頁面通過 API 代碼把信息傳遞給 Lamdba 函數 NewPost 寫入 DynamoDB,並把 postId 傳遞給 SNS;
- SNS 把 postId 傳遞給 Lambda 函數 Convert,函數 Convert 通過 postId 去 DynamoDB 查詢文本數據,並調用 Polly 進行語音合成;
- 函數 Convert 把合成的語音文件存入 S3 中,更更新數據庫狀態;
- 用戶就可以通過 GET 去獲取語音合成的相關信息。
二、服務部署
2.1、創建 DynamoDB 表
很簡單,寫個表名,寫個主鍵即可,其他默認。
Table name:posts
Primary key:id
2.2、創建 S3
我們創建兩個 S3 存儲桶,一個用來存放靜態網頁,一個用來存放語音合成的音頻。
2.2.1 靜態網頁存儲桶
- 名稱大家隨意確定,我這裏起的名字爲 pollywebsite;
- 打開公共訪問權限;
- 啓用靜態網站託管功能;
- 添加存儲桶策略,以便公共用戶可以訪問,策略如下:
{
"Version": "2012-10-17",
"Id": "Policy1562738599054",
"Statement": [
{
"Sid": "Stmt1562738571491",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::wz-pollywebsite/*"
}
]
}
2.2.2、音頻存儲桶
- 名字大家隨意定,我這裏起名字爲 pollyaudio;
- 打開公共訪問權限。
2.3、創建 SNS Topic
- 名稱大家隨意定,我這裏起名字爲 new_posts。
2.4、爲 Lambda 創建權限
從架構圖得知,我們的 Lambda 函數和多個組件進行交互,需要有相關的權限才行,我們通過 IAM 爲其創建一個 Role。
- 在選擇的服務使用此 Role 處選擇 Lambda;
- 先不用添加 Policy,先創建好 Role;
- 角色名大家可以隨意寫,我這裏起名爲 LamdbaPostsReaderRole;
- 爲 Role 添加 Inline Policy,策略規則如下:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": [
"s3:PutObject",
"polly:SynthesizeSpeech",
"logs:CreateLogStream",
"sns:Publish",
"dynamodb:PutItem",
"dynamodb:Scan",
"dynamodb:Query",
"dynamodb:UpdateItem",
"s3:GetBucketLocation",
"logs:CreateLogGroup",
"logs:PutLogEvents",
"s3:PutObjectAcl"
],
"Resource": "*"
}
]
}
2.5、創建 Lambda NewPost
- 函數名大家自己隨意寫,我這裏寫 wz_NewPost;
- 運行環境大家選擇 Python 3.7。
- 填寫好相關的 Python 代碼,並配置好代碼環境變量;
- 爲函數指定我們前面創建的角色。
2.6、創建 Lambda GetPosts
- 函數名大家自己隨意寫,我這裏寫 wz_GetPosts;
- 運行環境大家選擇 Python 3.7。
- 填寫好相關的 Python 代碼,並配置好代碼環境變量;
- 爲函數指定我們前面創建的角色。
2.7、創建 Lambda Convert
- 函數名大家自己隨意寫,我這裏寫 wz_ConvertToAudio;
- 運行環境大家選擇 Python 3.7。
- 填寫好相關的 Python 代碼,並配置好代碼環境變量;
- 爲函數指定我們前面創建的角色;
- 這個函數耗時比較長,可以把函數執行時間調整爲一分鐘;
- 添加我們創建的 SNS 爲觸發器。
2.8、創建 API Gateway
- API 名稱大家隨意寫,我這裏寫 PostReaderAPI,風格爲 REST;
- 創建一個 GET 方法,選擇
wz_GetPosts
函數,添加 URL Query String Parameters; - GET 方法啓用 CORS;
- 創建 Mapping Templates,類型爲 application/json,內容如下:
{
"postId" : "$input.params('postId')"
}
- 創建一個 POST 方法,選擇
wz_GetPosts
函數。
2.9、上傳前端代碼到 S3
2.10、創建域名解析
注意,如果域名別名解析到 S3 存儲桶,存儲桶的名稱必須和域名一致,所以我要修改一下存儲桶 website 的名稱。
三、驗證
測試地址: polly.wzlinux.com