內嵌式分析

搭配 Amazon QuickSight

第四單元︰Lambda 函數

在本單元中,我們將設定運算基礎架構以支援 Web 入口網站。

簡介

在本單元中,我們將設定運算基礎架構以支援 Web 入口網站。我們將使用 AWS Lambda,但是,您可以使用已在執行 Web 入口網站或應用程式的現有運算基礎架構。

您將學到的內容

  • 建立 Lambda 執行角色
  • 建立適用於儀表板內嵌的 Embed URL Lambda,承擔具有執行 QuickSight API 並產生儀表板/工作階段內嵌 URL 許可的角色。
  • 建立適用於工作階段內嵌的 Embed URL Lambda,承擔具有執行 QuickSight API 並產生儀表板/工作階段內嵌 URL 許可的角色。

 完成時間

20 分鐘

 使用的服務

實作

  • 建立 Lambda 執行角色

    下面提供的步驟可建立用於執行 Lambda 的角色

    1.啟動 IAM 並從左側面板選擇 Roles (角色)

    79-1

    2.按一下 Create role (建立角色) 按鈕。

    80-2

    2.按一下 LambdaNext: Permissions (下一步:許可) 按鈕。

    81-2

    3.按一下 Create Policy (建立政策) 按鈕。這將開啟新標籤,內含政策建立選項。

    82-3

    4.按一下 JSON 標籤,貼上下列政策,並按一下 Review policy (檢閱政策) 按鈕。

    {
        "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,然後按一下Create policy (建立政策) 按鈕。
    我們將使用此角色來執行初始設定 lambda 函數,然後移除此臨時政策。

    84-5

    6.切換回 create role (建立角色) 標籤。重新整理政策清單,搜尋 QSInitialSetupTempPolicy,然後勾選選取方塊。

    85-6

    7.搜尋 LambdaBasic,選擇 AWSLambdaBasicExecutionRole,然後按一下Next: Tags (下一步︰標籤) 按鈕。

    86-7

    8.按一下 Next: Review (下一步:檢閱)

    87-8

    9.將角色命名為 QSLambdaBasicExecutionRole,然後按一下 Create role (建立角色) 按鈕。

    88-9
  • 建立內嵌 URL Lambda (適用於儀表板內嵌)

    如果您正在嘗試工作階段嵌入,請跳過此步驟。
    現在,我們將建立一個 Lambda 函數來產生動態內嵌 URL。

    1.啟動 Lambda 並按一下 Create function (建立函數) 按鈕。

    92-1
    2.做出以下選擇。
    選擇從頭編寫
    函數名稱:QSGetEmbedUrl
    執行時間:Python 3.8
    執行角色:使用現有角色 從下列清單中選取 QSLambdaBasicExecutionRole。按一下 Create function (建立函數)​
    93-2
    94

    3.複製下列 Python 程式碼到 Lambda 函數並按一下 Save (儲存)
     

    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.向下捲動到環境變數部分並按一下 Manage environment variables (管理環境變數)

    96-4

    5.新增下列環境變數。
    AwsAccountId
    RoleArn - QSER Role Arn 已儲存在您的記事本。
    按一下 Save (儲存) 按鈕。

    97-5

    6.向下捲動至 Basic Settings (基本設定) 並按一下 Edit (編輯) 按鈕。

    98-6

    7.將 Timeout (逾時) 值增加至 2 分鐘並按一下 Save (儲存) 按鈕

    99-7
  • 建立內嵌 URL Lambda (適用於工作階段內嵌)

    如果您正在嘗試儀表板嵌入,請跳至下一部分
    現在,我們將建立一個 Lambda 函數來產生動態內嵌 URL。

    1.啟動 Lambda 並按一下 Create function (建立函數) 按鈕。

    103-1

    2.做出以下選擇。
    選擇從頭編寫
    函數名稱:QSGetEmbedUrl
    執行時間:Python 3.8
    執行角色:使用現有角色 從下列清單中選取 QSLambdaBasicExecutionRole。按一下 Create function (建立函數)​

    104
    105

    3.複製下列 Python 程式碼到 Lambda 函數並按一下 Save (儲存)

    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.向下捲動到環境變數部分並按一下 Manage environment variables (管理環境變數)

    107

    5.新增下列環境變數。
    AwsAccountId
    RoleArn - QSER Role Arn 已儲存在您的記事本。
    QuickSightIdentityRegion - 設定 QuickSight 身份的區域。
    按一下 Save (儲存) 按鈕。

    108

    6.向下捲動至 Basic Settings (基本設定) 並按一下 Edit (編輯) 按鈕。

    109

    7.將 Timeout (逾時) 值增加至 2 分鐘並按一下 Save (儲存) 按鈕

    110

結論

您已成功完成第四單元! 接下來,我們將在第五單元建立一個 API 閘道和靜態網頁。

這個單元對您是否有幫助?

API 閘道和靜態網頁