如何从 Python AWS Lambda 函数访问 context.identity?

How to access context.identity from a Python AWS Lambda function?

我的 lambda 函数正在接收上下文。

def lambda_handler(event, context):
    logger.info(context.function_name)
    logger.info(context.identity)
    logger.info(context.cognito_identity_id)
    logger.info(context.identity.cognito_identity_id)
    return 'hello world'

日志收到function_name,并记录context.identity的内存地址。但是 context.cognito_identity_idcontext.identity.cognito_identity_pool_id 被报告为 None.

如何 cognito_identity_id 填充?

从 class 由 AWS API 网关构建的 Xcode 调试器中,我可以看到私有变量 `_configuration._credentialsProvider._identityId 设置正确。但是这个值没有传递到我的 AWS Lambda 函数。

我找不到如何通过。我已经阅读了这个 page 我希望它被涵盖的地方。

进一步: 我从 Lambda 函数注销 dir(context.identity) 给出 ['__class__', '__delattr__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__slots__', '__str__', '__subclasshook__', 'cognito_identity_id', 'cognito_identity_pool_id']

这表明 cognito_identity_idcognito_identity_id 确实存在。

我认为 AWS 网关 -> AWS Lambda 没有免费设置身份 - 我缺少一些配置 - 可能是一个映射模板。

评论太长了...

您需要查看 API 网关文档。我知道 Cognito 身份 ID 是 None 如果你

(a) 使用 CLI 以 (access key id,secret key) 作为凭据调用 lambda,

(b) 使用 boto 使用 (access key id,secret key) 凭据调用 lambda,

(c) 从 AWS 控制台调用 lambda。

我使用 Cognito 凭据调用我的 Lambda,并且在我的上下文对象中获得了一个非 None 身份 ID。要设置 Cognito 凭证,您需要设置一个身份池,其中包含一个有权调用该函数的角色(简单设置:创建一个未经授权的角色并为其授予 lambda:invokeFunction 权限你的功能)。

我可以提供 Python 或 JavaScript 代码来执行此操作,但它不会回答您的问题,因为您专门询问了来自 API 网关的调用。但如果你想要它,请告诉我。

这就是我取得进步的方式。

放弃 GET 方法 - 它不支持将 Cognito 身份传递给 Lambda。

改用POST。 对于 POST 的集成请求 select "Invoke with caller credentials" 并创建映射模板。模板需要 "application/json",模板内容 { "identity": "$input.params('identity')" }

添加这些内容后,当调用 lambda 函数时,其“context.identity”参数将填充调用者认知标识符池和 ID 的值。

从您的 Lambda 函数中的 Python 确保使用 context.identity 而不是 context[identity]

进行访问

我找到了以下解决方案https://docs.aws.amazon.com/cognito/latest/developerguide/amazon-cognito-user-pools-using-tokens-with-identity-providers.html

所以从事件来看

UserPoolId = event['identity']['claims']['iss'].rsplit('/', 1)[-1]