如何允許 API Gateway REST API 使用者利用 Amazon Cognito 使用者集區群組的執行角色來執行 Lambda?

2 分的閱讀內容
0

我的 Amazon API Gateway REST API 具 AWS Lambda 代理整合且擁有 Amazon Cognito 使用者集區驗證。如何允許使用者利用其使用者集區群組的 AWS Identity and Access Management (IAM) 角色來執行 Lambda 函數?

解決方法

**注意:**除了 Amazon Cognito 使用者集區之外,您也可設定身分池來授予 API 存取權。如需詳細資訊,請參閱角色型存取控制權

在設定使用者利用其 Amazon Cognito 角色執行 Lambda 之前,請確定您已設定下列項目:

若要允許使用者利用其 Amazon Cognito 權限執行 Lambda,請依照下列步驟執行:

1.    利用 API 閘道主控台建立 Amazon Cognito 使用者集區作為授權方。接著指派 Amazon Cognito 使用者集區作為 API 方法的授權方。如需指示,請參閱整合 REST API 與 Amazon Cognito 使用者集區

2.    開啟 AWS Lambda 主控台

3.    選擇設定為 API 代理資源的 Lambda 函數。

4.    設定 Lambda 函數,並新增下列程式碼片段。此程式碼片段會從事件詳細資料取得 Amazon Cognito 角色,然後擔任該角色。

**注意:**若要執行此程式碼片段,Lambda IAM 角色需有權限存取 Amazon CloudWatch Logs。角色還需具有 AssumeRole API 呼叫才能執行 assume_role 命令。

import boto3
client = boto3.client('sts')
def lambda_handler(event, context):
    role=event['requestContext']['authorizer']['claims']['cognito:roles']
    response = client.assume_role(
        RoleArn=role,
        RoleSessionName='APIrole'
    )
    print(response)
    response2api = {"statusCode": 200,"headers": { },"body": "Success"}
    return response2api

使用者可屬於多個 Amazon Cognito 使用者集區群組,且每個群組可具不同 IAM 角色。如果使用者屬於兩個以上群組,則 cognito:roles 宣告會傳回角色清單。使用者 ID 權杖的 cognito:preferred_role 宣告會針對具最高優先順序 (最低優先順序值) 的群組繼承其 IAM 角色。如需詳細資訊,請參閱角色型存取控制權

若要取得 cognito:preferred_role,請使用以下程式碼片段:

role = event['requestContext']['authorizer']['claims']['cognito:preferred_role']

若要驗證使用者可利用其 Amazon Cognito 角色執行 Lambda,請依照下列步驟執行:

1.    開啟用戶端應用程式,然後在 Amazon Cognito 使用者集區以使用者身分登入。

2.    利用登入後收到的 ID 權杖來呼叫 API。
**注意:**請確認您使用的是來自傳回權杖的 id\ _token 值。

3.    請確認您所存取的資源同於 Amazon Cognito 使用者集區角色定義的資源。

4.    您也可檢查 CloudWatch Logs,確認 assume_role 命令是否成功。

**注意:**如果您要使用 API Gateway Lambda 授權方授予 API 存取權,請使用經授權方驗證的使用者集區權杖。在擔任該權杖的角色之前,必須驗證權杖。


相關資訊

利用 Amazon Cognito 使用者集區作為授權方,以便控制 REST API 存取權限

利用 Lambda 整合建置 API Gateway REST API

AWS Lambda 執行角色

AWS 官方
AWS 官方已更新 1 年前