AppstreamでCognitoユーザープールを利用する際に使用するLambdaコードの最新化(2024年12月時点)

記事タイトルとURLをコピーする

はじめに

AppStreamの認証でCognitoを利用する方法がAWSハンズオンで公開されています。
ただし、公開されてから時間が経っているため、Lambdaのコードが古くてそのままでは動きません。
そこで、コードを最新化してみました。

AWSハンズオン

AWSハンズオンはこちらです。
aws.amazon.com

修正内容

Lambdaで現在利用できるNode.js v18~となっている

Node.jsで使用しているAWS SDK for JavaScriptのバージョンがv2からv3になるので、それに合わせた修正が必要。
Node.jsのファイル形式がjsからmjsに変更されたので、こちらでも修正が必要。

CognitoのユーザーIDの文字数がAppStreamのユーザー名の文字数制限に抵触

Cognitoでユーザーを作成するとユーザーIDが自動で生成されます。
CognitoのユーザーIDは40文字ぐらいあるのですが、AppStreamでストリーミングする際、ユーザー名は32文字以下にする必要があります。
そのため、LambdaでユーザーIDをハッシュ化し、文字数を減らしています。

コード

修正したコードは以下の通りです!

import { AppStream } from '@aws-sdk/client-appstream';
import crypto from 'crypto';

const appstream = new AppStream();

export const handler = async (event, context, callback) => {
    if (!event.requestContext.authorizer) {
        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'];

    const hashedUsername = crypto
        .createHash('md5')
        .update(username)
        .digest('hex');

    const params = {
        FleetName: '<Fleet-Name>',
        StackName: '<Stack-Name>',
        UserId: hashedUsername,
        Validity: 5
    };

    await createas2streamingurl(params, context.awsRequestId, callback);
};

function errorResponse(errorMessage, awsRequestId, callback) {
    callback(null, {
        statusCode: 500,
        body: JSON.stringify({
            Error: errorMessage,
            Reference: awsRequestId,
        }),
        headers: {
            'Access-Control-Allow-Origin': '<origin-domain>',
        },
    });
}

async function createas2streamingurl(params, awsRequestId, callback) {
    try {
        const response = await appstream.createStreamingURL(params);
        const url = response.StreamingURL;
        callback(null, {
            statusCode: 201,
            body: JSON.stringify({
                Message: url,
                Reference: awsRequestId,
            }),
            headers: {
                'Access-Control-Allow-Origin': '<origin-domain>',
            },
        });
    } catch (error) {
        console.log("Error: " + error.message);
        errorResponse('Error creating AS2 streaming URL.', awsRequestId, callback);
    }
}

おわりに

単純にAWS SDK for JavaScriptのバージョン変更(v2→v3)だけの対応では足りなかったので、少し苦労しました。 お役に立てれば幸いです。