以下に示すステップバイステップの手順に従い、サーバーレスバックエンドを構築します。各ステップの番号をクリックして、セクションを展開してください。

  • ステップ 1:カスタム IAM ロールの IAM ポリシーを作成する

    ウェブサイトのバックエンドリクエストを処理するために Lambda の権限を付与するには、AWS のサービスに次のアクションを実行できる権限を付与するカスタム IAM ポリシーを作成します。

    • AppStream 2.0 でストリーミング URL を作成します。ユーザーが Example Corp. のウェブサイトにサインインすると、このストリーミング URL にリダイレクトされます。
    • Amazon CloudWatch のログ記録が有効になります。
    カスタム IAM ポリシーを作成するには、次の手順を実行します。
     
    1. IAM コンソールを https://console.aws.amazon.com/iam/ で開きます。
    2. ナビゲーションペインで、[Policies] を選択します。
    3. [Policies] を初めて選択した場合、[Welcome to Managed Policies] ページが表示されます。[Get Started] を選択します。
    4. [Create policy] を選択します。
    5. [JSON] タブを選択します。
    6. 次の JSON ポリシーをコピーして、ポリシードキュメントのフィールドに貼り付けます。
    {
        "Version": "2012-10-17",
        "Statement": [{
                "Effect": "Allow",
                "Action": "appstream:CreateStreamingURL",
                "Resource": [
                    "arn:aws:appstream:REGION-CODE:ACCOUNT-ID-WITHOUT-HYPHENS:fleet/FLEET-NAME",
                    "arn:aws:appstream:REGION-CODE:ACCOUNT-ID-WITHOUT-HYPHENS:stack/STACK-NAME"
                ]
            },
            {
                "Effect": "Allow",
                "Action": [
                    "logs:CreateLogGroup",
                    "logs:CreateLogStream",
                    "logs:PutLogEvents"
                ],
                "Resource": "*"
            }
        ]
    }
    

    7.AppStream 2.0 のスタックとフリートがある AWS Region を表す REGION-CODE の値を選択します。ACCOUNT-ID-WITHOUT-HYPHENS は自身の AWS アカウント ID に置き換えます。STACK-NAMEFLEET-NAME は、スタック名とフリート名に置き換えます。
    8.完了したら、[Get Started] をクリックします。
    9.[Name] には、新しいポリシーの名前として examplecorp_lambda_saas_policy と入力します。
    10.[Create policy] を選択します。

  • ステップ 2:IAM サービスロールを作成し、Lambda 関数で AWS のサービスを呼び出せるようにする

    Lambda がユーザーに代わって他のサービスのリソースにアクセスできるようにするには、IAM サービスロールが必要です。次の手順を実行して IAM サービスロールを作成し、作成したポリシーをこのロールにアタッチします。

    1. IAM コンソールを https://console.aws.amazon.com/iam/ で開きます。
    2. ナビゲーションペインで [Roles] をクリックしてから [Create role] をクリックします。
    3. [Select type of trusted entity] では、[AWS service] を選択したままにします。
    4. [Lambda] を選択してから [Next: Permissions] をクリックします。
    5. [Filter policies] 検索ボックスに、examplecorp_lambda_saas_policyと入力します。該当するポリシーがリストに表示されたら、ポリシー名の横のチェックボックスをオンにします。
    6. [Next: Tags] を選択します。ここではポリシーのタグを指定できますが、この例では不要です。
    7. [Next: Review] を選択します。
    8. ロール名に examplecorp_lambda_saas_role と入力します。
    9. [Create role] を選択します。

  • ステップ 3:Lambda 関数を作成および設定する

    以下の手順を実行して Lambda 関数を作成します。

    1.Lambda コンソールを https://console.aws.amazon.com/lambda/ で開きます。
    2.以下のいずれかを行います。
        • 初めて Lambda 関数を作成する場合、[Getting Started] ページが表示されます。[Getting Started] の [Create a function] をクリックします。
        • Lambda 関数を作成したことがある場合、[Functions] ページの右上隅にある [Create a function] をクリックします。
    3.[Create a function] ページでは、[Author from scratch] が選択されていることを確認します。
    4.[Basic information] で以下を実行します。
        • [Name] には examplecorp_lambda_saas_function と入力します。
        • [Runtime] で [Node.js 8.10] を選択します。
    5.[Permissions] で、[Choose or create an execution role] の横のアイコンをクリックします。次に、以下を実行します。
        • [Execution role] で [Use an existing role] を選択します。
        • [Existing role] で、リストから [examplecorp_lambda_saas_role] を選択します。
    6.[Create function] を選択します。
    7.[Function code] セクションの [index.js] タブに、プレースホルダーコードが表示されます。プレースホルダーコードを削除し、次のコードをコピーしてタブに貼り付けます。

    // Copyright 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved.
    // SPDX-License-Identifier: Apache-2.0
    
    const AWS = require('aws-sdk');
    const appstream = new AWS.AppStream;
    
    exports.handler = (event, context, callback) => {
        if (!event.requestContext.authorizer) { //checks to see if Cognito Authorization has been configured 
            errorResponse('Authorization has not been configured, please configure an authorizer in API Gateway', context.awsRequestId, callback);
            return;
        }
        const username = event.requestContext.authorizer.claims['cognito:username'];
        
        var params = {
            FleetName: '<Fleet-Name>', /* required */
            StackName: '<Stack-Name>', /* required */
            UserId: username,
            Validity: 5
    
        };
    
        createas2streamingurl(params, context.awsRequestId, callback);
    
    };
    
    function errorResponse(errorMessage, awsRequestId, callback) { //Function for handling error messaging back to client
        callback(null, {
            statusCode: 500,
            body: JSON.stringify({
                Error: errorMessage,
                Reference: awsRequestId,
            }),
            headers: {
                'Access-Control-Allow-Origin': '<origin-domain>', //This should be the domain of the website that originated the request, example: amazonaws.com 
            },
        });
    }
    
    function createas2streamingurl(params, awsRequestId, callback) {
        var request = appstream.createStreamingURL(params);
        request.
            on('success', function (response) {
                console.log("Success. AS2 Streaming URL created.");
                var url = response.data.StreamingURL;
                callback(null, {
                    statusCode: 201,
                    body: JSON.stringify({
                        Message: url,
                        Reference: awsRequestId,
                    }),
                    headers: {
                        'Access-Control-Allow-Origin': '<origin-domain>', //This should be the domain of the website that originated the request, example: amazonaws.com
                    },
                });
            }).
            on('error', function (response) {
                console.log("Error: " + JSON.stringify(response.message));
                errorResponse('Error creating AS2 streaming URL.', awsRequestId, callback);
    
            }).
            send();
    }

    8.以下の変数を独自の値に置き換えます。

        • <Stack-Name>
        • <Fleet-Name>
        • <origin-domain>

    各パラメータの意味は次のとおりです。

    • <Stack-Name> は、ストリーミング URL を作ろうとしているスタックの名前です。
    • <Fleet-Name> は、この関数でストリーミング URL を作成しようとしているスタックに関連するフリートの名前です。
    • <origin-domain> は、API ゲートウェイにリクエストを送るウェブサイトのドメインです。ここでは、このプロジェクト用に設定した S3 ウェブサイトのフル URL (http://bucket-name.s3-website.region.amazonaws.com) になります。

    9.関数を保存して Lambda コンソールを閉じます。