このモジュールでは、AWS Lambda と Amazon DynamoDB を使用して、ウェブアプリケーションのリクエストを処理するためのバックエンドプロセスを構築します。最初のモジュールにデプロイしたブラウザアプリケーションを使用すると、ユーザーはユニコーンを自分の好きな場所に送信するように要求できます。​これらのリクエストを満たすには、ブラウザで実行されている JavaScript がクラウドで実行されているサービスを呼び出す必要があります。​

Serverless_Web_App_LP_assets-04

​ユーザーがユニコーンを要求するたびに呼び出される Lambda 関数を実装します。​この関数は、フリートからユニコーンを選択し、その要求を DynamoDB テーブルに記録してから、ディスパッチされているユニコーンに関する詳細を使用して、フロントエンドアプリケーションに応答します。

この関数は、Amazon API Gateway を使用してブラウザから呼び出されます。次のモジュールでその接続を実装します。このモジュールでは、お使いの関数を単独でテストするだけです。​

モジュールの所要時間: 30 分

使用されたサービス: AWS Lambda、Amazon DynamoDB


以下に示すステップごとの詳細な手順に従い、サーバーレスバックエンドプロセスを作成します。各ステップの番号をクリックして、セクションを展開してください。

  • ステップ 1: Amazon DynamoDB テーブルを作成する

    Amazon DynamoDB コンソールを使用して、新しい DynamoDB テーブルを作成します。テーブルに Rides という名前を付け、文字列型の RideId というパーティションキーを提供します。テーブル名とパーティションキーでは、大文字と小文字が区別されます。提供された ID を正確に使用してください。その他の設定にはすべてデフォルトを使用します。

    テーブルを作成したら、次のステップで使用する ARN を書き留めます。


    1. AWS マネジメントコンソールで、[サービス] を選択してから、「データベース」の下にある [DynamoDB] を選択します。

    2. [Create table] を選択します。

    3. テーブル名の「Rides」を入力します。 このフィールドでは、大文字と小文字が区別されます。

    4. [パーティションキー] に「RideId」と入力し、キータイプに [文字列] を選択します。このフィールドでは、大文字と小文字が区別されます。

    5. [デフォルト設定の使用] チェックボックスをオンにし、[作成] を選択します。

    6. 新しいテーブルの [概要] セクションの下部までスクロールして、ARN をメモします。これは次のセクションで使用します。

  • ステップ 2: Lambda 関数の IAM ロールを作成する

    すべての Lambda 関数には、それに関連付けられた IAM ロールがあります。このロールは、その関数が他のどの AWS のサービスとやり取りできるかを定義します。このワークショップの目的のために、ログを Amazon CloudWatch Logs に書き込むアクセス許可と、項目を DynamoDB テーブルに書き込むアクセス許可を付与する Lambda 関数を IAM ロールを作成する必要があります。

    IAM コンソールを使用して新しいロールを作成します。それに WildRydesLambda という名前を付け、ロールタイプとして [AWS Lambda] を選択します。Amazon CloudWatch Logs に書き込む許可をユーザーの関数に与え、DynamoDB テーブルに項目を入力するポリシーを追加する必要があります。

    このロールに AWSLambdaBasicExecutionRole という管理ポリシーをアタッチし、必要な CloudWatch Logs のアクセス許可を付与します。また、前のセクションで作成したテーブルに対して ddb:PutItem アクションを可能にするロールのカスタムインラインポリシーを作成します。


    1. AWS マネジメントコンソールで [Services (サービス)] をクリックし、「Security, Identity & Compliance」の項で [IAM] を選択します。

    2. 左のナビゲーションバーで [Roles (ロール)] を選択し、続いて [Create New Role (新しいロールの選択)] を選択します。

    3. [AWS service (AWS のサービス)] グループからロールタイプとして [Lambda] を選択し、[Next: Permissions (次: アクセス許可)] をクリックします。

      注: ロールタイプを選択すると、AWS のサービスがお客様に代わってこのロールを引き受けることを許可する、お客様のロールの信頼ポリシーが自動的に作成されます。CLI、AWS CloudFormation、またはその他のメカニズムを使用してこのロールを作成している場合は、信頼ポリシーを直接指定します。

    4. [フィルター] テキストボックスに「AWSLambdaBasicExecutionRole」と入力し、そのロールの隣にあるチェックボックスをオンにします。

    5. [Next Step] を選択します。

    6. [ロール名] に「WildRydesLambda」と入力します。

    7. [ロールの作成] を選択します。

    8. [ロール] ページのフィルターボックスに「WildRydesLambda」と入力し、先ほど作成したロールを選択します。

    9. [Permissions (アクセス許可)] タブで、右下隅にある [Add inline policy (インラインポリシーを追加)] リンクを選択して新しいインラインポリシーを作成します。

    10. [Choose a service (サービスの選択)] を選択します。

    11. [Find a service (サービスを検索)] という検索ボックスに「DynamoDB」と入力し始め、表示されたら [DynamoDB] を選択します。

    12. [アクションの選択] を選択します。

    13. [Filter actions (フィルターアクション)] という検索ボックスに「PutItem」と入力し始め、表示されたら [PutItem] の隣のチェックボックスをオンにします。

    14. [Resources (リソース)] セクションを選択します。 

    15. [Specific (特定)] オプションを選択した状態で、[table (テーブル)] セクションで [Add ARN (ARN を追加)] リンクを選択します。

    16. 先ほど作成したテーブルの ARN を [Specify ARN for table (テーブルの ARN を指定)] フィールドに貼り付け、[Add (追加)] を選択します。

    17. [ポリシーの確認] を選択します。

    18. ポリシー名に「DynamoDBWriteAccess」と入力し、[ポリシーの作成] を選択します。

  • ステップ 3: リクエスト処理のための Lambda 関数の作成

    AWS Lambda は、HTTP リクエストなどのイベントに応答してコードを実行します。このステップでは、ウェブアプリケーションからの API リクエストを処理してユニコーンをディスパッチするコア機能を構築します。次のモジュールでは、Amazon API Gateway を使用して、ユーザーのブラウザから呼び出すことができる HTTP エンドポイントを公開する RESTful API を作成します。次に、このステップで作成した Lambda 関数をその API に接続して、ウェブアプリケーション用の完全に機能的なバックエンドを作成します。​

    AWS Lambda コンソールを使用して、API リクエストを処理する RequestUnicorn という名前の新しい Lambda 関数を作成します。提供されている関数コードの requestUnicorn.js サンプル実装を使用してください。そのファイルから AWS Lambda コンソールのエディタにコピーして貼り付けるだけです。

    前のセクションで作成した WildRydesLambda IAM ロールを使用するように関数が設定されていることを確認します。


    1. [Services (サービス)] を選択し、次に [Compute (コンピューティング)] セクションで [Lambda] を選択します。

    2. [関数の作成] をクリックします。

    3. デフォルトの [Author from scratch] カードを選択したままにします。

    4. [名前] フィールドに「RequestUnicorn」と入力します。

    5. [ランタイム] で [Node.js 6.10] を選択します。

    6. [ロール] ドロップダウンで [Choose an existing role (既存のロールを選択)] が選択されていることを確認します。

    7. [Existing Role (既存のロール)] ドロップダウンで [WildRydesLambda] を選択します。

    8. [Create function (関数を作成)] をクリックします。

    9. [Function code (関数のコード)] セクションまで下にスクロールし、index.js コードエディタの既存のコードを requestUnicorn.js の内容に置き換えます。

    10. ページの右上にある [Save (保存)] をクリックします。

  • ステップ 4: 実装をテストする

    このモジュールでは、AWS Lambda コンソールを使用して構築した機能をテストします。次のモジュールでは、API Gateway を使用して REST API を追加するので、最初のモジュールでデプロイしたブラウザベースのアプリケーションから関数を呼び出すことができます。


    1. 関数のメイン編集画面で [Select a test event... (テストイベントの選択...)] ドロップダウンから [Configure test event (テストイベントの設定)] を選択します。

    2. [Create new test event (新しいテストイベントの作成)] を選択したままにします。

    3. [Event name (イベント名)] フィールドに「TestRequestEvent」と入力します。

    4. 以下のテストイベントをエディタにコピーして貼り付けます。

    {
        "path": "/ride",
        "httpMethod": "POST",
        "headers": {
            "Accept": "*/*",
            "Authorization": "eyJraWQiOiJLTzRVMWZs",
            "content-type": "application/json; charset=UTF-8"
        },
        "queryStringParameters": null,
        "pathParameters": null,
        "requestContext": {
            "authorizer": {
                "claims": {
                    "cognito:username": "the_username"
                }
            }
        },
        "body": "{\"PickupLocation\":{\"Latitude\":47.6174755835663,\"Longitude\":-122.28837066650185}}"
    }
    1. [Create (作成)] をクリックします。

    2. メイン関数の編集画面で、ドロップダウンから [TestRequestEvent] を選択した状態で [テスト] をクリックします。

    3. ページの上部までスクロールし、[Execution result (実行結果)] セクションの [Details (詳細)] セクションを展開します。

    4. 実行が成功したこと、および関数の結果が次のようになっていることを確認してください。

    {
        "statusCode": 201,
        "body": "{\"RideId\":\"SvLnijIAtg6inAFUBRT+Fg==\",\"Unicorn\":{\"Name\":\"Rocinante\",\"Color\":\"Yellow\",\"Gender\":\"Female\"},\"Eta\":\"30 seconds\"}",
        "headers": {
            "Access-Control-Allow-Origin": "*"
        }
    }