AWS 入門
建立基本 Web 應用程式
部署 Web 應用程式,以 API 和資料庫新增互動性
單元 4:建立資料表
在本單元中,您將建立 DynamoDB 資料表,並啟用您的 Lambda 函式以在其中儲存資料。
簡介
在本單元中,我們將使用 Amazon DynamoDB 建立資料表以保留資料。DynamoDB 是鍵值資料庫服務,因此我們不需要為資料建立結構描述。在任何規模之下皆提供一致效能,同時使用時沒有伺服器需要管理。
此外,我們會使用 AWS Identity and Access Management (IAM) 服務安全地給我們的服務所需的許可,以彼此互動。尤其我們會使用 IAM 政策,讓在第二單元中建立的 Lambda 函式寫入至我們新建立的 DynamoDB 資料表。為了這麼做,我們會從 Lambda 函式使用 AWS SDK (Python、JavaScript 或 Java)。
您將學到的內容
- 使用 AWS 管理主控台建立 DynamoDB 資料表
- 使用 IAM 建立角色及管理許可
- 使用 AWS SDK (Python、JavaScript 或 Java) 寫入至 DynamoDB 資料表
主要概念
保留資料儲存資料,使我們日後能從程式執行獨立地加以存取。
非關聯式資料庫非關聯式資料庫不使用列和欄組成的表格式結構描述。而是使用針對所儲存資料類型的特定要求,經過優化的儲存模型。
鍵值資料庫一種非關聯式資料庫,將資料存放為鍵值組集合,而其中的鍵做為唯一識別碼。
主索引鍵識別 DynamoDB 資料表中每一片段資料的值。此值也會用於分割資料表,使其可擴展。
結構描述資料的組織,作為資料庫應如何建構的藍圖。
AWS SDK SDK 代表「軟體開發套件」。 AWS SDK 提供一組工具、庫、文件、程式碼範例、程序和指南,允許開發人員在特定平台上建立軟體應用程式。
IAM 政策一份文件,其定義實體 (例如,服務、使用者、群組) 能存取哪些 AWS 資源。
完成時間
10 分鐘
使用的服務
實作
-
建立 DynamoDB 資料表
- 登入 Amazon DynamoDB 主控台。
- 確定您記下建立函式所在的區域。您可在頁面頂部看到此資訊,就在帳戶名稱旁邊。
- 按一下藍色的「建立資料表」按鈕。
- 在「資料表名稱」旁,輸入 HelloWorldDatabase。
- 在「主索引鍵」欄位,輸入 ID。
- 按一下藍色的「建立」按鈕。
- 從右手邊的面板複製資料表的「Amazon Resource Name (ARN)」 (您在此單元的後段會需要)。
-
建立並新增 IAM 政策至 Lambda 函式
- 現在我們有了資料表,讓我們編輯 Lambda 函式,以便寫入資料到其中。在新的瀏覽器視窗中,開啟 AWS Lambda 主控台。
- 按一下我們在第二單元中建立的函式 (若您已在使用我們的範例,則其名稱為 "HelloWorldFunction")。
- 我們會加入許可至我們的函式中,以便其能使用 DynamoDB 服務,屆時會使用 AWS Identity and Access Management (IAM) 來完成。
- 按一下「許可」標籤。
- 在「執行角色」方塊,按一下角色。會開啟新的瀏覽器標籤。
- 按一下「許可政策」方塊右側的「新增內嵌政策」。
- 按一下「JSON」標籤。
- 將以下政策貼到文字區內,小心地取代資料表「資源」欄位的 ARN (位於字行 15):
{ "Version": "2012-10-17", "Statement": [ { "Sid": "VisualEditor0", "Effect": "Allow", "Action": [ "dynamodb:PutItem", "dynamodb:DeleteItem", "dynamodb:GetItem", "dynamodb:Scan", "dynamodb:Query", "dynamodb:UpdateItem" ], "Resource": "YOUR-TABLE-ARN" } ] }
9.此政策將允許我們的 Lambda 函式讀取、編輯或刪除項目,但以我們建立的資料表為限。
10.按一下藍色的「檢閱政策」按鈕。
11.在「名稱」旁邊,輸入 HelloWorldDynamoPolicy。
12.按一下藍色的「建立政策」按鈕。
13.現在您可以關閉此瀏覽器標籤,返回 Lambda 函式的標籤。
-
修改 Lambda 函式以寫入 DynamoDB 資料表
-
Python
-
JavaScript
-
Java
-
Python
-
- 按一下「組態」標籤
- 將您函式的程式碼取代為以下內容:
# import the json utility package since we will be working with a JSON object import json # import the AWS SDK (for Python the package name is boto3) import boto3 # import two packages to help us with dates and date formatting from time import gmtime, strftime # create a DynamoDB object using the AWS SDK dynamodb = boto3.resource('dynamodb') # use the DynamoDB object to select our table table = dynamodb.Table('HelloWorldDatabase') # store the current time in a human readable format in a variable now = strftime("%a, %d %b %Y %H:%M:%S +0000", gmtime()) # define the handler function that the Lambda service will use as an entry point def lambda_handler(event, context): # extract values from the event object we got from the Lambda service and store in a variable name = event['firstName'] +' '+ event['lastName'] # write name and time to the DynamoDB table using the object we instantiated and save response in a variable response = table.put_item( Item={ 'ID': name, 'LatestGreetingTime':now }) # return a properly formatted JSON object return { 'statusCode': 200, 'body': json.dumps('Hello from Lambda, ' + name) }
3.按一下頁面頂部橘色的「儲存」按鈕。
-
JavaScript
-
- 按一下「組態」標籤
- 將您函式的程式碼取代為以下內容:
// Include the AWS SDK module const AWS = require('aws-sdk'); // Instantiate a DynamoDB document client with the SDK let dynamodb = new AWS.DynamoDB.DocumentClient(); // Use built-in module to get current date & time let date = new Date(); // Store date and time in human-readable format in a variable let now = date.toISOString(); // Define handler function, the entry point to our code for the Lambda service // We receive the object that triggers the function as a parameter exports.handler = async (event) => { // Extract values from event and format as strings let name = JSON.stringify(`Hello from Lambda, ${event.firstName} ${event.lastName}`); // Create JSON object with parameters for DynamoDB and store in a variable let params = { TableName:'HelloWorldDatabase', Item: { 'ID': name, 'LatestGreetingTime': now } }; // Using await, make sure object writes to DynamoDB table before continuing execution await dynamodb.put(params).promise(); // Create a JSON object with our response and store it in a constant const response = { statusCode: 200, body: name }; // Return the response constant return response; };
3.按一下頁面頂部橘色的「儲存」按鈕。
-
Java
-
- 按一下「組態」標籤
- 移至「函式程式碼」,上傳以下的 JAR 檔。(針對本教學的目的,我們將跳過部署套件的建立。)
- 將 "Handler" 上傳至 com.example.app.SavePersonHandler::handleRequest。
- 按一下頁面頂部橘色的「儲存」按鈕。
-
-
測試變更效果
- 按一下白色的「測試」按鈕。
- 應該會顯示底色為綠的訊息「執行結果:成功」。
- 在新增瀏覽器標籤中,開啟 DynamoDB 主控台。
- 在左側的瀏覽列,按一下「資料表」。
- 按一下我們在此單元前段建立的 HelloWorldDatabase。
- 按一下右側的「項目」標籤。
- 此處應該會顯示出與您的測試事件相符的項目。若您已曾使用過我們的範例,項目 ID 會是 "Ada Lovelace"。
- 每回您的 Lambda 函式執行,您的 DynamoDB 資料表都會更新。若使用同一個名稱,則只會變更時間戳記。