AWS の開始方法
基本的なウェブアプリケーションを構築する
ウェブアプリケーションをデプロイし、API やデータベースとの対話性を追加する
モジュール 4: データテーブルを作成する
このモジュールでは、DynamoDB テーブルを作成し、Lambda 関数がデータを格納できるようにします。
はじめに
このモジュールでは、Amazon DynamoDB を使用してデータを永続化するためのテーブルを作成します。DynamoDB は Key-Value データベースサービスであるため、データのスキーマを作成する必要はありません。あらゆる規模で一貫したパフォーマンスを発揮し、使用時に管理するサーバーはありません。
さらに、AWS Identity and Access Management (IAM) サービスを使用して、相互にやり取りするために必要なアクセス許可をサービスに安全に付与します。具体的には、モジュール 2 で作成した Lambda 関数が、IAM ポリシーを使用して、新しく作成された DynamoDB テーブルに書き込むことを許可します。これを行うには、Lambda 関数から AWS SDK (Python、JavaScript、または Java) を使用します。
学習内容
- AWS マネジメントコンソールで DynamoDB テーブルを作成する
- IAM でロールを作成し、アクセス許可を管理する
- AWS SDK (Python、JavaScript、または Java) を使用して DynamoDB テーブルに書き込む
主要な概念
データの永続化 プログラムの実行とは無関係に将来アクセスできるようにデータを保存します。
非リレーショナルデータベース 非リレーショナルデータベースは、行と列の表形式スキーマを使用しません。代わりに、格納されるデータの種類の特定の要件に合わせて最適化されたストレージモデルを使用します。
Key-Value データベース キー値のペアのコレクションとしてデータを格納する非リレーショナルデータベースの一種。ここでキーは、一意の識別子として機能します。
プライマリキー DynamoDB テーブル内の各データを識別する値。この値は、テーブルを分割してスケーラブルにするのにも役立ちます。
スキーマ データベースの構築方法の青写真として機能するデータの組織。
AWS SDK SDK は「ソフトウェア開発キット」を意味します。 AWS SDK は、一連のツール、ライブラリ、ドキュメント、コードサンプル、プロセス、およびガイドを提供し、開発者が特定のプラットフォームでソフトウェアアプリケーションを作成できるようにします。
IAM ポリシー エンティティ (サービス、ユーザー、グループなど) がアクセスできる AWS リソースを定義したドキュメント。
所要時間
10 分
使用するサービス
実装
-
DynamoDB テーブルを作成する
- Amazon DynamoDB コンソールにログインします。
- 必ず、関数を作成しているリージョンをメモしてください。これは、ページの最上部、アカウント名の横にあります。
- ブルーの [テーブルの作成] ボタンをクリックします。
- [テーブル名] の横に、HelloWorldDatabase と入力します。
- [プライマリキー] フィールドに、ID と入力します。
- ブルーの [作成] ボタンをクリックします。
- 右側のパネルからテーブルの「Amazon リソースネーム (ARN) 」をコピーします (後でこのモジュールで必要になります)。
-
IAM ポリシーを作成して Lambda 関数に追加する
- これでテーブルができたので、データを書き込めるように Lambda 関数を編集しましょう。新しいブラウザウィンドウで、AWS Lambda コンソールを開きます。
- モジュール 2 で作成した関数をクリックします (ここで紹介した例を使用している場合、「HelloWorldFunction」と呼ばれます)。
- DynamoDB サービスを使用できるように関数にアクセス許可を追加します。このために、AWS Identity and Access Management (IAM) を使用します。
- [アクセス許可] タブをクリックします。
- [実行ロール] ボックスで、ロールをクリックします。新しいブラウザタブが開きます。
- [アクセス許可ポリシー] ボックスの右側にある [インラインポリシーの追加] をクリックします。
- [JSON] タブをクリックします。
- テキスト領域に次のポリシーを貼り付けます。その際、15 行目の [リソース] フィールドのテーブルの ARN を置き換えることに注意してください。
{ "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 ファイルをアップロードします。(このチュートリアルでは、デプロイパッケージの作成はスキップします)。
- 「ハンドラー」を com.example.app.SavePersonHandler::handleRequest に更新します。
- ページの上部にあるオレンジの [保存] ボタンをクリックします。
-
-
変更をテストする
- 白の [テスト] ボタンをクリックします。
- グリーンの背景の「実行結果: 成功」メッセージが表示されます。
- 新しいブラウザタブで、DynamoDB コンソールを開きます。
- 左側のナビゲーションバーの [テーブル] をクリックします。
- このモジュールの前半で作成した HelloWorldDatabase をクリックします。
- 右側の [アイテム] タブをクリックします。
- テストイベントに一致するアイテムがここに表示されます。ここで紹介した例を使用している場合、アイテム ID は「Ada Lovelace」になります。
- Lambda 関数が実行されるたびに、DynamoDB テーブルが更新されます。同じ名前を使用すると、タイムスタンプのみが変更されます。