組み込み分析

(Amazon QuickSight を利用)

モジュール 4: Lambda 関数

このモジュールでは、コンピューティングインフラストラクチャをセットアップしてウェブポータルを起動します。

はじめに

このモジュールでは、コンピューティングインフラストラクチャをセットアップしてウェブポータルを起動します。AWS Lambda を使用しますが、ウェブポータルまたはアプリケーションが実行されている既存のコンピューティングインフラストラクチャを使用できます。

学習内容

  • Lambda 実行ロールを作成する
  • ダッシュボード組み込み用の組み込み URL Lambda を作成する - QuickSight API を実行してダッシュボード/セッションの組み込み URL を生成するアクセス許可を持つロールを継承します。
  • セッション組み込み用の組み込み URL Lambda を作成する - QuickSight API を実行してダッシュボード/セッションの組み込み URL を生成するアクセス許可を持つロールを継承します。

 所要時間

20 分

 使用するサービス

実装

  • Lambda 実行ロールを作成する

    Lambda 実行で使用するロールの作成手順は以下のとおりです

    1.IAM を起動し、左パネルから [Roles (ロール)] を選択します。

    79-1

    2.[Create role (ロールの作成)] をクリックします。

    80-2

    2.[Lambda] をクリックして、[Next: 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 を作成する (ダッシュボード組み込み用)

    セッションの組み込みを試している場合は、この手順をスキップします。
    ここで、動的な組み込み URL を生成する Lambda 関数を作成します。

    1.Lambda を起動して、[Create function (関数の作成)] をクリックします。

    92-1
    2.次の項目を選択します。
    [Author from scratch (一から作成)] を選択します。
    関数名: 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 を作成する (セッション組み込み用)

    ダッシュボードの組み込みを試している場合は、次のセクションに進みます。
    ここで、動的な組み込み URL を生成する Lambda 関数を作成します。

    1.Lambda を起動して、[Create function (関数の作成)] をクリックします。

    103-1

    2.次の項目を選択します。
    [Author from scratch (一から作成)] を選択します。
    関数名: 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

まとめ

モジュール 4 を修了しました。 次に、モジュール 5 で API Gateway と静的ウェブページを作成します。

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

API Gateway と静的ウェブページ