AWS lambda:将数据从自定义授权程序传递到业务lambda

时间:2017-02-16 14:57:47

标签: amazon-web-services aws-lambda aws-api-gateway

我正在使用自定义身份验证(使用自定义授权程序)来访问AWS lambda。授权过程正常。但是我在授权者lambda和业务lambda之间传输数据(ex principalId)时遇到了问题。我所有的lambdas都是用JS开发的。 正如AWS doc中的解释,在授权器lambda中,我在Auth响应的上下文字段中添加了几个简单的字段(下面的代码中的principalId)。但在我的业务lambda中,我无法获得这些领域。 AWS文档讨论了$ context变量。

首先,如果 $ context 变量是另一个变量或与JS函数参数中收到的 context 变量相同的变量,您能解释一下吗?

第二,你能解释一下如何让我的业务lambda获得授权人提供的数据字段(例如:principalId)吗?

的Seb

4 个答案:

答案 0 :(得分:2)

我猜您引用的$context变量是API网关映射模板中可用的变量。它不等同于业务Lambda的context参数。

但是,使用映射模板及其$context变量,您可以构建业务Lambda的event参数。

如果API端点的映射模板如下所示:

{
  "principalId" : "$context.authorizer.principalId"
}

您应该检索Lambda的principalId参数中的event

使用 passthrough 选项,principalId中应该有event.context['authorizer-principal-id']。这是创建端点时的默认行为。

有关doc:

中的映射模板的参考资料

答案 1 :(得分:1)

授权者的策略文档可以使用可放入自定义数据的上下文进行充实。该数据将通过该事件提供给企业lambda。

以下是政策文件的示例:

const policy = {
    context: {
        customKey: 'payload data',
      },
    policyDocument: {
        Statement: [{
            Action: 'execute-api:Invoke',
            Effect: effect,
            Resource: resource,
        }],
        Version: '2012-10-17',
    },
    principalId: sub,
};

上下文包含带有负载数据作为字符串的“ customKey”。

您的API的映射模板应如下所示:

{
  "customKey": "$context.authorizer.customKey"
}

最后,您可以在事件中通过事件访问customKey的值:

exports.handler = async (event, context) => {

console.log(event.customKey);

.
.
.
};

根据我的示例,这应该记录“ customValue”。

请注意,您无法根据documentation

将JSON对象或数组设置为上下文映射中任何键的有效值。

答案 2 :(得分:0)

除了Alexis的回答,principalId - 目前是唯一可以从自定义授权器传递给Lambda的param(截至今天)。但是,传递自定义参数的解决方法是将JSON参数字符串化为principleId。关于这个问题的讨论是here

答案 3 :(得分:0)

AWS APIGateway 在 API 定义中有以下标签。

1. End point name, method type
2. parameters
3. responses
4. x-amazon-apigateway-integration => under this "requestParameters" will be populatested with mapping data or any data with key value pair.

link 肯定会帮助您。