如何从 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_id
和 context.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_id
和 cognito_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]
进行访问
所以从事件来看
UserPoolId = event['identity']['claims']['iss'].rsplit('/', 1)[-1]
我的 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_id
和 context.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_id
和 cognito_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]
所以从事件来看
UserPoolId = event['identity']['claims']['iss'].rsplit('/', 1)[-1]