嵌入式分析

与 Amazon QuickSight 配合使用

模块 4:Lambda 函数

在本模块中,我们将设置计算基础设施以支持 Web 门户。

简介

在本模块中,我们将设置计算基础设施以支持 Web 门户。我们正在使用 AWS Lambda,但是您可以使用您的 Web 门户或应用程序已在运行的现有计算基础设施。

您将学到的内容

  • 创建 Lambda 执行角色
  • 为控制面板嵌入创建嵌入式 URL Lambda – 担任有权运行 QuickSight API 和生成控制面板/会话嵌入式 URL 的角色。
  • 为会话嵌入创建嵌入式 URL Lambda – 担任有权运行 QuickSight API 和生成控制面板/会话嵌入式 URL 的角色。

 完成时间

20 分钟

 使用的服务

实施

  • 创建 Lambda 执行角色

    创建用于 Lambda 执行的角色的步骤如下所示

    1.启动 IAM,然后从左侧面板中选择角色

    79-1

    2.单击创建角色按钮。

    80-2

    2.单击 Lambda下一步:权限按钮。

    81-2

    3.单击创建策略按钮。将会打开一个带有策略创建选项的新选项卡。

    82-3

    4.单击 JSON 选项卡,粘贴下列策略并单击查看策略按钮。

    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Sid": "VisualEditor0",
                "Effect": "Allow",
                "Action": [
                    "quicksight:DescribeUser",
                    "quicksight:UpdateUser",
                    "quicksight:CreateGroup",
                    "quicksight:CreateUser",
                    "quicksight:DeleteUser",
                    "quicksight:DeleteGroup",
                    "quicksight:DeleteGroupMembership",
                    "quicksight:UpdateDashboardPermissions",
                    "quicksight:CreateGroupMembership",
                    "quicksight:RegisterUser"
                ],
                "Resource": "*"
            }
        ]
    }
    83-4

    5.将策略命名为 QSInitialSetupTempPolicy,然后单击创建策略按钮。
    我们将使用此角色运行初始设置 Lambda 函数,然后将删除此 Temp 策略。

    84-5

    6.切换回创建角色选项卡。刷新策略列表,搜索 QSInitialSetupTempPolicy,然后选中选择框。

    85-6

    7.搜索 LambdaBasic,选择 AWSLambdaBasicExecutionRole,然后单击下一步:标签按钮。

    86-7

    8.单击下一步:查看

    87-8

    9.将角色命名为 QSLambdaBasicExecutionRole,然后单击创建角色按钮。

    88-9
  • 创建嵌入式 URL Lambda(用于控制面板嵌入)

    如果您要尝试进行会话嵌入,请跳过这一步。
    我们现在将创建 lambda 函数,该函数生成动态嵌入 URL。

    1.启动 Lambda,然后单击创建函数按钮。

    92-1
    2.做出以下选择。
    选择从头开始创作
    函数名称:QSGetEmbedUrl
    运行时:Python 3.8
    执行角色:使用现有角色从下拉菜单中选择 QSLambdaBasicExecutionRole。单击创建函数
    93-2
    94

    3.将以下 Python 代码复制到 Lambda 函数中,然后单击保存
     

    def lambda_handler(event, context):
        #Implementation
    
        import urllib, json, sys, os, base64, boto3, botocore
        
        #Read in environment variables
        awsAccountId = os.environ["AwsAccountId"]
        roleArn = os.environ["RoleArn"]
    
        #Read in the values passed to Lambda function
        openIdToken = event['queryStringParameters']['openIdToken']
        dashboardId = event['queryStringParameters']['dashboardId']
        dashboardRegion = event['queryStringParameters']['dashboardRegion']
        resetDisabled = True
        undoRedoDisabled = True
    
        userName = json.loads(base64.b64decode(openIdToken.split('.')[1]+ "========"))['cognito:username']
        #Assume role that has permissions on QuickSight
        sts = boto3.client('sts')
        assumedRole = sts.assume_role_with_web_identity(
            RoleArn = roleArn,
            RoleSessionName = userName,
            WebIdentityToken = openIdToken
        )
    
        assumedRoleSession = boto3.Session(
                aws_access_key_id = assumedRole['Credentials']['AccessKeyId'],
                aws_secret_access_key = assumedRole['Credentials']['SecretAccessKey'],
                aws_session_token = assumedRole['Credentials']['SessionToken'],
            )
    
        quickSight = assumedRoleSession.client('quicksight',region_name= dashboardRegion)
    
        #Generate Embed url
        response = quickSight.get_dashboard_embed_url(
                        AwsAccountId = awsAccountId,
                        DashboardId = dashboardId,
                        IdentityType = 'IAM',
                        SessionLifetimeInMinutes = 600,
                        UndoRedoDisabled = undoRedoDisabled,
                        ResetDisabled = resetDisabled
                    )
    
        return {
                'statusCode': 200,
                'headers': {"Access-Control-Allow-Origin": "*"},
                'body': json.dumps(response)
               }
    95-3

    4.向下滚动到“环境变量”部分,并单击管理环境变量

    96-4

    5.添加以下环境变量。
    AwsAccountId
    RoleArn – 保存在记事本中的 QSER 角色 Arn
    单击保存按钮。

    97-5

    6.向下滚动到基本设置,然后单击编辑按钮。

    98-6

    7.将超时值增加到 2 分钟,然后单击保存按钮

    99-7
  • 创建嵌入式 URL Lambda(用于会话嵌入)

    如果您正在尝试进行控制面板嵌入,请跳至下一部分。
    我们现在将创建 lambda 函数,该函数生成动态嵌入 URL。

    1.启动 Lambda,然后单击创建函数按钮。

    103-1

    2.做出以下选择。
    选择从头开始创作
    函数名称:QSGetEmbedUrl
    运行时:Python 3.8
    执行角色:使用现有角色从下拉菜单中选择 QSLambdaBasicExecutionRole。单击创建函数

    104
    105

    3.将以下 Python 代码复制到 Lambda 函数中,然后单击保存

    import json,sys,os,boto3,base64
    
    def lambda_handler(event, context):
            #Read in environment variables
            awsAccountId = os.environ["AwsAccountId"]
            roleArn = os.environ["RoleArn"]
            identityRegion = os.environ["QuickSightIdentityRegion"]
            roleName = roleArn.split('/')[1]
    
            #Read in the values passed to Lambda function
            openIdToken = event['queryStringParameters']['openIdToken']
            dashboardRegion = event['queryStringParameters']['dashboardRegion'] 
            
            userName = json.loads(base64.b64decode(openIdToken.split('.')[1]+ "========"))['cognito:username']
            
            #Assume role that has permissions on QuickSight
            sts = boto3.client('sts')
            assumedRole = sts.assume_role_with_web_identity(
                RoleArn = roleArn,
                RoleSessionName = userName,
                WebIdentityToken = openIdToken
            )
    
            assumedRoleSession = boto3.Session(
                    aws_access_key_id = assumedRole['Credentials']['AccessKeyId'],
                    aws_secret_access_key = assumedRole['Credentials']['SecretAccessKey'],
                    aws_session_token = assumedRole['Credentials']['SessionToken'],
                )
    
            quickSight = assumedRoleSession.client('quicksight', region_name = dashboardRegion)
            
            #Generate Session Embed url
            response = quickSight.get_session_embed_url(
                            AwsAccountId = awsAccountId,
                            UserArn = "arn:aws:quicksight:"+identityRegion+":"+awsAccountId+":user/default/"+roleName+"/"+userName
                        )
    
            return {
                    'statusCode': 200,
                    'headers': {"Access-Control-Allow-Origin": "*"},
                    'body': json.dumps(response)
                   }
    106

    4.向下滚动到“环境变量”部分,并单击管理环境变量

    107

    5.添加以下环境变量。
    AwsAccountId
    RoleArn – 保存在记事本中的 QSER 角色 Arn
    QuickSightIdentityRegion – 设置 QuickSight 身份的区域。
    单击保存按钮。

    108

    6.向下滚动到基本设置,然后单击编辑按钮。

    109

    7.将超时值增加到 2 分钟,然后单击保存按钮

    110

结论

您已成功完成模块 4 的学习! 接下来,让我们在模块 5 中创建 API 网关和静态网页。

此模块有帮助吗?

API 网关和静态网页