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

Serverless_Web_App_LP_assets-04

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

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

モジュールを完了するための時間:30 分

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


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

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

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

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


    1. AWS マネジメントコンソールから、 [Services (サービス)] を選択し、次に [Databases (データベース) ] の下で、 [DynamoDB] を選択します。

    2. [Create table (テーブルを作成)] を選択します。

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

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

    5. [Use default settings (デフォルトの設定を使用)] ボックスにチェックマークを入れ、 [Create (作成)] を選択します。

    6. 新しいテーブルの [Overview (概要) ] セクションの下部にスクロールし、 [ARN] を書き留めてください 。次のセクションでこれを使用します。

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

    各 Lambda 関数には、それに関連付けられたIAM ロールがあります。このロールは、関数が、他のどんなAWSサービスと相互作用することができるかを定義します。このワークショップの目的のために、Lambda 関数に Amazon CloudWatch Logs にログを書く許可を与え、また DynamoDB テーブルにアイテムを書くアクセス許可を与える IAM ロールを作成する必要があります。

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

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


    1. AWS マネジメントコンソールから、 [Services (サービス)] をクリックし、次にセキュリティ、アイデンティティ、およびコンプライアンスのセクションで [IAM] を選択します。

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

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

      注意:ロールタイプを選択すると、AWS サービスが、ユーザーの代わりにこのロールを引き受けることができるロールの信頼ポリシーが自動的に作成されます。CLI、AWS CloudFormation または別のメカニズムを使用してこのロールを作成する場合は、直接信頼ポリシーを指定するようにします。

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

    5. [次のステップ] を選択します。

    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. [Review Policy (ポリシーを確認)] を選択します。

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

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

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

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

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


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

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

    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": "*"
        }
    }