【问题标题】:How to access context.identity from a Python AWS Lambda function?如何从 Python AWS Lambda 函数访问 context.identity?
【发布时间】:2019-09-22 06:51:14
【问题描述】:

我的 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 填充?

从 AWS API Gateway 构建的类中的 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 Gateway -> AWS Lambda 不会免费设置身份 - 我缺少一些配置 - 可能是映射模板。

【问题讨论】:

  • 您是否通过 AWS 移动开发工具包调用 Lambda 函数?
  • 我正在使用 API Gateway 调用 Lambda 函数。但它应该如何调用它应该没有区别。我只需要对象记录
  • 文档在您链接的页面上:docs.aws.amazon.com/lambda/latest/dg/python-context-object.htmlidentity “通过 AWS 移动开发工具包调用时有关 Amazon Cognito 身份提供商的信息。它可以为空。”
  • 我读了那页。在我的情况下,该值不为空。那么如何从我的 context.identity 对象中获取字段呢?
  • @mark b 你在写 Python lambda 函数吗?

标签: python amazon-web-services aws-lambda


【解决方案1】:

评论太长了...

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

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

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

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

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

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

【讨论】:

  • 顺便说一句,我查看了 API Gateway 文档,看起来它不知道如何与 Cognito 对话,即 Cognito 身份不能放入 HTTP 标头或类似的东西中。 API 网关很可能用于公共和匿名接口。
  • 感谢@Rohit Chatterjee。 context.identity 是否有值且 cognito_identity_id 为 None?
  • 这个 Python 语法是否正确 context.identity.cognito_identity_pool_id
  • 语法是正确的。您可以在 Lambda 开发人员指南 (docs.aws.amazon.com/lambda/latest/dg/lambda-dg.pdf) 的第 54 页找到它。我发现这些开发者指南比任何在线文档/博客/教程等都好。
  • 回答你的第一个问题,context.identity 在你询问的情况下确实是非空的,有两个空成员(身份 ID 和身份池 ID)
【解决方案2】:

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

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

改用 POST。 对于 POST 的集成请求,选择“使用调用者凭据调用”并创建一个映射模板。模板必须是“application/json”,模板内容为{ "identity": "$input.params('identity')" }

通过这些添加,当调用 lambda 函数时,其 `context.identity' 参数将填充调用者的认知标识符池和 id 的值。

您的 Lambda 函数中的 Python 务必使用 context.identity 而不是 context[identity] 访问

【讨论】:

    【解决方案3】:

    我找到了以下解决方案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]
    

    【讨论】:

      猜你喜欢
      • 2020-08-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-05
      • 2021-11-24
      • 2019-09-21
      • 2016-04-08
      • 1970-01-01
      相关资源
      最近更新 更多