# 無伺æœå™¨åƒè€ƒæž¶æ§‹ï¼šè¡Œå‹•後端 ## 簡介 行動後端åƒè€ƒæž¶æ§‹ ([示æ„圖](https://s3.amazonaws.com/awslambda-reference-architectures/mobile-backend/lambda-refarch-mobilebackend.pdf)) 展示如何使用 [AWS Lambda](http://aws.amazon.com/lambda/) åŠå…¶ä»–æœå‹™ï¼Œç‚ºè¡Œå‹•應用程å¼å»ºç«‹ç„¡éœ€ä¼ºæœå™¨çš„後端。æ¤å„²å˜åº«æä¾›çš„具體範例應用程å¼å¯è®“使用者分別使用 Amazon Simple Storage Service (Amazon S3) 與 Amazon API Gateway 上傳照片與ç†è¨˜ã€‚這些ç†è¨˜å˜æ”¾æ–¼ Amazon DynamoDB,並利用 DynamoDB streams 與 Lambda 功能以éžåŒæ¥æ–¹å¼è™•ç†ï¼Œå°‡å®ƒå€‘新增至 Amazon CloudSearch 網域。除了 Lambda 功能的原始碼之外,æ¤å„²å˜åº«é‚„包å«å¯æä¾›ç¯„例,並說明如何使用 iOS çš„ AWS Mobile SDK 連接架構ä¸å®šç¾©çš„後端資æºçš„原型 iOS 應用程å¼ã€‚ ## 執行範例 è‹¥è¦åŸ·è¡Œå®Œæ•´çš„範例應用程å¼ï¼Œæ‚¨å¿…é ˆå…ˆéƒ¨ç½²å¾Œç«¯è³‡æºï¼Œç„¶å¾Œç·¨è¯ä¸¦åŸ·è¡Œç¯„例 iOS 應用程å¼ã€‚ ### 部署後端 系統æä¾›çš„ AWS CloudFormation 範本將建立æ¤ç¯„例所需的大多數後端資æºï¼Œä½†æ‚¨ä»éœ€å»ºç«‹ Amazon CloudSearch 網域ã€API Gateway REST APIï¼Œä»¥åŠ AWS CloudFormation 外部的 Cognito Identity Pool。 #### æ¥é©Ÿ 1:建立 CloudSearch 網域 1.使用 [AWS CLI](https://aws.amazon.com/cli/) 建立新的 CloudSearch 網域並æä¾›æ‚¨é¸æ“‡çš„網域å稱。 ``` aws cloudsearch create-domain --domain-name [YOUR_DOMAIN_NAME] ``` 1.請記下輸出文件ä¸çš„æ–°ç¶²åŸŸçš„ ARN,您將在啟動 CloudFormation å †ç–Šæ™‚ä½¿ç”¨å®ƒåšç‚ºè¼¸å…¥ã€‚ 1.定義「headlineã€èˆ‡ã€Œnote_textã€æ¬„ä½çš„索引。 ``` aws cloudsearch define-index-field --name headline --type text --domain-name [YOUR_DOMAIN_NAME] aws cloudsearch define-index-field --name note_text --type text --domain-name [YOUR_DOMAIN_NAME] ``` ``` aws cloudsearch index-documents --domain-name [YOUR_DOMAIN_NAME] ``` #### æ¥é©Ÿ 2:建立 API Gateway REST API 1.使用 [AWS CLI](https://aws.amazon.com/cli/) 建立新的 API 並æä¾›æ‚¨é¸æ“‡çš„å稱。 ``` aws apigateway create-rest-api --name [YOUR_API_NAME] ``` 1.è«‹è¨˜ä¸‹è¼¸å‡ºæ–‡ä»¶ä¸æä¾›çš„ã€ŒAPI IDã€ï¼Œæ‚¨å°‡åœ¨å•Ÿå‹• CloudFormation å †ç–Šæ™‚ä½¿ç”¨å®ƒåšç‚ºè¼¸å…¥ã€‚ #### æ¥é©Ÿ 3:建立 Amazon Cognito Identity Pool 1.使用 [AWS CLI](https://aws.amazon.com/cli/) 建立新的 Identity Pool 並æä¾›æ‚¨é¸æ“‡çš„å稱。 ``` aws cognito-identity create-identity-pool --allow-unauthenticated-identities --identity-pool-name [YOUR_POOL_NAME] ``` 1.è«‹è¨˜ä¸‹è¼¸å‡ºæ–‡ä»¶ä¸æä¾›çš„ã€ŒIdentityPoolIdã€ï¼Œæ‚¨å°‡åœ¨å•Ÿå‹• CloudFormation å †ç–Šæ™‚ä½¿ç”¨å®ƒåšç‚ºåƒæ•¸ã€‚ #### æ¥é©Ÿ 4:啟動 CloudFormation 範本 您å¯ä»¥ä½¿ç”¨ç³»çµ±æä¾›çš„ CloudFormation 範本與 S3 儲å˜è²¯é«”,在 us-east-1 å€åŸŸéƒ¨ç½²æ•´å€‹ç¯„例。如果您想在ä¸åŒçš„å€åŸŸéƒ¨ç½²æ¤ç¯„ä¾‹ï¼Œæ‚¨å¿…é ˆåœ¨è©²å€åŸŸå»ºç«‹ Amazon S3 儲å˜è²¯é«”,然後將範本與 Lambda 功能定義複製至該儲å˜è²¯é«”。 鏿“‡ **Launch Stack** 以啟動您帳戶的 us-east-1 å€åŸŸä¸çš„範本。 [](https://console.aws.amazon.com/cloudformation/home?region=us-east-1#/stacks/new?stackName=lambda-mobile-backend&templateURL=https://s3.amazonaws.com/awslambda-reference-architectures/mobile-backend/mobile-backend.template) 收到æç¤ºæ™‚ï¼Œè¼¸å…¥æ‚¨åœ¨å…ˆå‰æ¥é©Ÿå»ºç«‹çš„ CloudSearch 網域ã€API Gateway REST API åŠ Amazon Cognito Identity Pool ç‰è³‡æºçš„åƒæ•¸å€¼ã€‚ 本文件的 *CloudFormation 範本資æº* ç« ç¯€ä¸æœ‰æä¾›é—œæ–¼æ¤ç¯„例所建立資æºçš„詳細資訊。 #### æ¥é©Ÿ 5:更新您的 API Gateway REST API 在您建立 CloudFormation å †ç–Šä¹‹å¾Œï¼Œæ‚¨å¿…é ˆæ›´æ–°å…ˆå‰å»ºç«‹çš„ API,æ‰èƒ½ä½¿ç”¨æ–°å»ºç«‹çš„「NotesApiFunctionã€ã€‚ 1.在 [Amazon API Gateway Console](https://console.aws.amazon.com/apigateway/home?region=us-east-1#/apis) ä¸é¸æ“‡æ‚¨çš„ API。 1.鏿“‡ **Create Resource** 在 / 之下建立新的å資æºã€‚ 1.輸入「notesã€åšç‚ºæ¤è³‡æºçš„å稱,輸入「/notesã€åšç‚ºæ¤è³‡æºçš„路徑。 1.鏿“‡ **Create Resource**。 1.在已é¸å–新的「/notesã€è³‡æºçš„æƒ…æ³ä¸‹ï¼Œé¸æ“‡ **建立方法**。 1.鏿“‡ã€ŒPOSTã€ï¼Œç„¶å¾Œé¸æ“‡è©²æ ¸å–方塊。 1.鏿“‡ **Lambda 功能** åšç‚ºæ•´åˆé¡žåž‹ï¼Œç„¶å¾Œé¸æ“‡æ‚¨å•Ÿå‹• CloudFormation å †ç–Šçš„å€åŸŸåšç‚º Lambda å€åŸŸã€‚ 1.在 **Lambda 功能** ä¸è¼¸å…¥ **`NotesApiFunction`**ï¼Œç„¶å¾Œé¸æ“‡ CloudFormation å †ç–Šå»ºç«‹çš„åŠŸèƒ½ã€‚ 1.鏿“‡ **儲å˜** 並授與 API Gateway 執行 Lambda 功能的許å¯ã€‚ 1.鏿“‡ **方法請求** 以編輯請求組態。 1.在 **授權類型** é …ç›®ä¸é¸æ“‡ã€ŒAWS_IAMã€ã€‚ 1.在 **éœ€è¦ API 金鑰** é …ç›®ä¸é¸æ“‡ã€Œtrueã€ã€‚ 1.鏿“‡ **部署 API**。 1.在 **部署階段** é …ç›®ä¸é¸æ“‡ã€Œæ–°éšŽæ®µã€ï¼Œç„¶å¾Œåœ¨ **階段å稱** ä¸è¼¸å…¥ä¸€å€‹å稱。 1.請記下新階段的 **å‘¼å« URL**,您將在執行範例 iOS æ‡‰ç”¨ç¨‹å¼æ™‚ä½¿ç”¨æ¤æ•¸å€¼ã€‚ #### æ¥é©Ÿ 6:建立 API 金鑰 1.在 [Amazon API Gateway Console](https://console.aws.amazon.com/apigateway/home?region=us-east-1#/apis) ä¸é¸æ“‡ **APIs**ï¼Œç„¶å¾Œé¸æ“‡ **API 金鑰**。 1.鏿“‡ **建立 API 金鑰**。 1.輸入金鑰的åç¨±ï¼Œç„¶å¾Œé¸æ“‡ **已啟用**。 1.鏿“‡ **儲å˜** 1.在 **API 階段關è¯** 倿®µä¸ï¼Œé¸æ“‡æ‚¨çš„ APIï¼Œç„¶å¾Œé¸æ“‡æ‚¨åœ¨å…ˆå‰çš„æ¥é©Ÿä¸å»ºç«‹çš„階段。 1.鏿“‡ **新增**。 1.請記下 **API 金鑰**ï¼Œæ‚¨å°‡åœ¨åŸ·è¡Œè¡Œå‹•æ‡‰ç”¨ç¨‹å¼æ™‚使用它。 #### æ¥é©Ÿ 7:更新您的 Amazon Cognito Identity Pool 1.在 [Amazon Cognito Console](https://console.aws.amazon.com/cognito/home?region=us-east-1) ä¸é¸æ“‡æ‚¨çš„ Identity Pool。 1.鏿“‡ **編輯 Identity Pool**。 1.在 **未授權的角色** 與 **已授權的角色** é …ç›®ä¸é¸æ“‡ç”± CloudFormation å †ç–Šå»ºç«‹çš„ **MobileClientRole**ã€‚å †ç–Šçš„è¼¸å‡ºä¸æœ‰æä¾›è©²è§’色的完整 ARN。 1.鏿“‡ **儲å˜è®Šæ›´**。 ### 執行範例 iOS æ‡‰ç”¨ç¨‹å¼ #### å¿…è¦æ¢ä»¶ è‹¥è¦åŸ·è¡Œç³»çµ±æä¾›çš„ iOS 範例應用程å¼ï¼Œæ‚¨å¿…é ˆåŸ·è¡Œ Mac OS X 10.10 (Yosemite) æˆ–æ›´æ–°çš„ç‰ˆæœ¬ã€‚æ‚¨é‚„å¿…é ˆå®‰è£æœ€æ–°ç‰ˆçš„ [Xcode](https://itunes.apple.com/us/app/xcode/id497799835) 與 [Cocoa Pods](https://cocoapods.org/)。 #### å»ºç«‹èˆ‡åŸ·è¡Œæ‡‰ç”¨ç¨‹å¼ 1.查看或下載儲å˜åº«ä¸çš„ **ios-sample** 的原始碼。 1.使用您的後端部署的數值更新「MobileBackendIOS/Constants.swiftã€ã€‚大多數的數值皆å¯åœ¨ CloudFormation å †ç–Šçš„è¼¸å‡ºä¸æ‰¾åˆ°ã€‚在 AWS 管ç†ä¸»æŽ§å°ä¸çš„æ‚¨çš„ API 詳細資訊ä¸ï¼Œå¯æ‰¾åˆ° API Gateway 金鑰與終端節點 URL 數值。 1.從「ios-sampleã€æ ¹ç›®éŒ„執行 Cocoa Pods。 ``` pod install ``` 1.在 Xcode ä¸é–‹å•Ÿæ‰€ç”¢ç”Ÿçš„「MobileBackendIOS.xcworkspaceã€æª”案。 ``` open -a Xcode MobileBackendIOS.xcworkspace ``` 1.按一下 Xcode è¦–çª—æœ€ä¸Šæ–¹çš„æ’æ”¾æŒ‰éˆ•以建立並執行專案。 ## æ¸¬è©¦æ‡‰ç”¨ç¨‹å¼ æ¤ç¯„ä¾‹æ‡‰ç”¨ç¨‹å¼æä¾›å…©å€‹åŠŸèƒ½ï¼šä¸Šå‚³åœ–ç‰‡èˆ‡å¼µè²¼ç†è¨˜ã€‚ ### 上傳圖片 1.在應用程å¼ä¸é¸æ“‡ **上傳圖片**。 1.鏿“‡ç›¸æ©Ÿåœ–示,從相簿ä¸é¸æ“‡ä¸€å¼µåœ–ç‰‡å¾Œé¸æ“‡ **鏿“‡**。 1.鏿“‡ **上傳** 按鈕。 #### é©—è‰åœ–片是å¦å·²ç¶“上傳 您應該會在 Xcode çš„è¼¸å‡ºçª—æ ¼ä¸çœ‹åˆ°ä¸€ç†æœ‰é—œåœ–片已上傳至 Amazon S3 çš„è¨˜éŒ„é …ç›®ã€‚ 您也å¯ä»¥ä½¿ç”¨ AWS 管ç†ä¸»æŽ§å°ç€è¦½ CloudFormation å †ç–Šå»ºç«‹çš„å„²å˜è²¯é«”,以確èªåœ–片已æ£ç¢ºä¸Šå‚³ã€‚ ### 張貼ç†è¨˜ 1.鏿“‡ **張貼ç†è¨˜**。 1.在ç†è¨˜ä¸è¼¸å…¥æ¨™é¡Œèˆ‡æ–‡å—。 1.鏿“‡ **儲å˜ç†è¨˜**。 #### é©—è‰ç†è¨˜æ˜¯å¦å·²ç¶“張貼 您應該會在 Xcode çš„è¼¸å‡ºçª—æ ¼ä¸çœ‹åˆ°ä¸€ç†æœ‰é—œç†è¨˜å·²æˆåŠŸå„²å˜çš„è¨˜éŒ„é …ç›®ã€‚ ç•¶ç†è¨˜ä¸Šå‚³æ™‚,行動應用程å¼å°‡æœƒå‘¼å«ã€ŒNotesApiFunctionã€ã€‚您å¯ä»¥åœ¨ Amazon CloudWatch 䏿ª¢è¦–æ¤åŠŸèƒ½çš„è¨˜éŒ„ã€‚ ç•¶æˆåŠŸå‘¼å«æ¤åŠŸèƒ½æ™‚ï¼Œå®ƒæœƒåœ¨ CloudFormation å †ç–Šå»ºç«‹çš„ DynamoDB è³‡æ–™è¡¨ä¸æ–°å¢žä¸€ç†è³‡æ–™é …目。您å¯ä»¥ç¢ºèªæ‚¨åœ¨æ‡‰ç”¨ç¨‹å¼ä¸å¼µè²¼çš„ç†è¨˜å·²æŒçºŒå˜åœ¨æ‰€å»ºç«‹çš„資料表ä¸ã€‚ 最後,當ç†è¨˜æŒçºŒå˜åœ¨æ–¼ DynamoDB 資料表時,將有一ç†è¨˜éŒ„新增至該資料表的 Stream ä¸ï¼Œç„¶å¾Œç”±ã€ŒDynamoStreamHandlerFunctionã€é€²è¡Œè™•ç†ã€‚您å¯ä»¥åœ¨ CloudWatch 䏿ª¢è¦–æ¤åŠŸèƒ½çš„é€™ç†è¨˜éŒ„ï¼Œç„¶å¾Œç¢ºèªæ–°çš„æ–‡ä»¶æ˜¯å¦å·²æ–°å¢žè‡³æ‚¨å»ºç«‹çš„ CloudSearch 網域。 ## 清除應用程å¼è³‡æº è‹¥è¦ç§»é™¤æ¤ç¯„例建立的所有資æºï¼Œè«‹åŸ·è¡Œä»¥ä¸‹å‹•作: 1.刪除 CloudFormation å †ç–Šå»ºç«‹çš„ S3 儲å˜è²¯é«”ä¸çš„æ‰€æœ‰ç‰©ä»¶ã€‚ 1.刪除 CloudFormation å †ç–Šã€‚ 1.刪除 Amazon Cognito Identity Poolã€API Gateway åŠ CloudSearch 網域。 1.刪除與 CloudFormation å †ç–Šæ‰€å»ºç«‹çš„ Lambda 功能相關è¯çš„ CloudWatch 記錄群組。 ## CloudFormation ç¯„æœ¬è³‡æº ### Lambda 功能 - **NotesApiFunction** - 處ç†å¾žè¡Œå‹•應用程å¼é€éŽ API Gateway 所張貼ç†è¨˜çš„功能。 - **SearchApiFunction** - 利用 CloudSearch ç¶²åŸŸä¾æ“šæœå°‹è©žå½™æœå°‹å·²ç´¢å¼•çš„ç†è¨˜çš„功能。 - **DynamoStreamHandlerFunction** - 便“šã€ŒPhotoNotesTableã€Stream ä¸çš„記錄,將已索引的文件新增至系統æä¾›çš„ CloudSearch 網域的功能。 ### AWS Identity and Access Management (IAM) 角色 - **NotesApiRole** - 用於「NotesApiFunctionã€çš„角色。æ¤è§’色授與許å¯ä»¥è¨˜éŒ„與使用「PhotoNotesTableã€ä¸çš„é …ç›®ã€‚ - **SearchApiRole** - 用於「SearchApiFunctionã€çš„角色。æ¤è§’色授與許å¯ä»¥è¨˜éŒ„åŠæœå°‹æ‰€æä¾›çš„ CloudSearch 網域。 - **DynamoStreamHandlerRole** - 用於 DynamoStreamHandlerFunction 的角色。æ¤è§’色授與許å¯ä»¥è¨˜éŒ„åŠæ–°å¢žæ–‡ä»¶è‡³æ‰€æä¾›çš„ CloudSearch 網域。 - **MobileClientRole** - ç”± Amazon Cognito Identity Pool 用於未授權與已授權使用者的角色。æ¤è§’色æä¾›å˜å–所æä¾› API Gateway REST APIï¼Œä»¥åŠæŽˆèˆ‡è¨±å¯å°‡ç‰©ä»¶æ”¾å…¥ã€ŒMobileUploadsBucketã€ã€‚ ### å…¶ä»–è³‡æº - **MobileUploadsBucket** - ç”¨æ–¼å˜æ”¾ä½¿ç”¨è€…上傳的照片的 S3 儲å˜è²¯é«”。 - **CloudFrontDistribution** -「MobileUploadsBucketã€è¨å®šç‚ºåŽŸå§‹çš„ CDN 分發。 - **PhotoNotesTable** - å˜æ”¾ä½¿ç”¨è€…從行動應用程å¼ä¸Šå‚³çš„ç†è¨˜çš„ DynamoDB 資料表。 ### 組態 - **ConfigTable** - å˜æ”¾å¯ä¾›å„種 Lambda 功能讀å–的組態值的 DynamoDB 資料表。æ¤è³‡æ–™è¡¨çš„å稱「MobileRefArchConfigã€å·²ç¡¬ç·¨ç¢¼è‡³å„個功能的程å¼ç¢¼ï¼Œè‹¥æœªæ›´æ–°è©²ç¨‹å¼ç¢¼ï¼Œå°‡ç„¡æ³•修改。 - **ConfigHelperStack** - 建立自訂資æºä»¥å°‡è³‡æ–™é …目寫入至「ConfigTableã€çš„åå †ç–Šã€‚æ¤å †ç–Šæœƒå»ºç«‹ Lambda 功能與執行角色以授與「ConfigTableã€çš„ UpdateItem 許å¯ã€‚ - **NotesTableConfig** - è˜åˆ¥ã€ŒPhotoNotesTableã€åç¨±çš„çµ„æ…‹é …ç›®ã€‚ - **SearchEndpointConfig** - è˜åˆ¥ CloudSearch 網域æœå°‹ç«¯é»žçš„çµ„æ…‹é …ç›®ï¼Œä»¥åƒæ•¸å‚³éžã€‚ - **DocumentEndpointConfig** - è˜åˆ¥ CloudSearch ç¶²åŸŸçš„æ–‡ä»¶çµ‚ç«¯ç¯€é»žçš„çµ„æ…‹é …ç›®ï¼Œä»¥åƒæ•¸å‚³éžã€‚ ## 授權 æ¤åƒè€ƒæž¶æ§‹ç¯„例便“š Apache 2.0 授權。