AWS の開始方法

サーバーレスのウェブアプリケーションを構築する

AWS Lambda、Amazon API Gateway、AWS Amplify、Amazon DynamoDB、および Amazon Cognito を使用

サーバーレスのウェブアプリケーションを構築する

モジュール 3: サーバーレスサービスバックエンド

AWS Lambda と Amazon DynamoDB を使用して、ウェブアプリケーションのリクエストを処理するためのバックエンドプロセスを構築します

概要

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

アーキテクチャの概要

アーキテクチャの概要

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

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

 所要時間

30 分

 使用するサービス

実装

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

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

    a.AWS マネジメントコンソールで、[Services] (サービス) を選択してから、[Databases] (データベース) の下にある [DynamoDB] を選択します。
    b.[Create table] (テーブルを作成) を選択します。
    c.[Table name] (テーブル名) として Rides と入力します。 このフィールドでは、大文字と小文字が区別されます。
    d.[Partition key] (パーティションキー) として RideId と入力し、キータイプとして [String] (文字列) を選択します。このフィールドでは、大文字と小文字が区別されます。
    e.[Use default settings] (デフォルト設定の使用) チェックボックスをオンにし、[Create] (作成) を選択します。
    f.新しいテーブルの [Overview] (概要) セクションの下部までスクロールして、ARN をメモします。これは次のセクションで使用します。

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

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

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

    a.AWS マネジメントコンソールで [Services] (サービス) をクリックし、[Security, Identity & Compliance] (セキュリティ、アイデンティティ、コンプライアンス) のセクションで [IAM] を選択します。

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

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

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

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

    e.[Next Step] (次のステップ) をクリックします。

    f.[Role Name] (ロール名) で、WildRydesLambda と入力します。

    g.[Create Role] (ロールの作成) を選択します。

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

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

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

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

    l.[Select actions] (アクションの選択) を選択します。

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

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

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

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

    q.[Review Policy] (ポリシーの確認) を選択します。

    r.ポリシー名として DynamoDBWriteAccess と入力し、[Create policy] (ポリシーの作成) を選択します。

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

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

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

    a.[Services] (サービス) を選択し、[Compute] (コンピューティング) セクションで [Lambda] を選択します。
    b.[Create function] (関数の作成) をクリックします。
    c.デフォルトの [Author from scratch] (一から作成) カードを選択したままにします。
    d.[Name] (名前) フィールドで、RequestUnicorn と入力します。
    e.[Runtime] (ランタイム) として [Node.js 6.10] を選択します。
    f.[Role] (ロール) ドロップダウンで [Choose an existing role] (既存のロールを選択) が選択されていることを確認します。
    g.[Existing Role] (既存のロール) ドロップダウンから [WildRydesLambda] を選択します。
    h.[Create function] (関数を作成) をクリックします。
    i.[Function code] (関数コード) セクションまで下にスクロールし、index.js コードエディタの既存のコードを requestUnicorn.js の内容に置き換えます。
    j.ページの右上にある [Save] (保存) をクリックします。

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

    a.関数のメイン編集画面で [Select a test event...] (テストイベントの選択...) ドロップダウンから [Configure test event] (テストイベントの設定) を選択します。
    b.[Create new test event] (新しいテストイベントの作成) を選択したままにします。
    c.[Event name] (イベント名) フィールドで、TestRequestEvent と入力します。
    d.以下のテストイベントをエディタにコピーして貼り付けます。

    {
        "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}}"
    }

    e.[Create] (作成) をクリックします。
    f.メイン関数の編集画面で、ドロップダウンから [TestRequestEvent] を選択した状態で [Test] (テスト) をクリックします。
    g.ページの上部までスクロールし、[Execution result] (実行結果) セクションの [Details] (詳細) セクションを展開します。
    h.実行が成功したこと、および関数の結果が次のようになっていることを確認してください。

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

このモジュールはお役に立ちましたか?

RESTful API のデプロイ