繁体   English   中英

在S3存储桶触发器中获取AWS请求API密钥?

[英]Get AWS request API key in S3 bucket trigger?

作为异步内容处理系统的一部分,我们定义了绑定到S3集成服务的API网关方法,该方法将POST请求转发到S3存储桶。 然后,我们将S3事件触发器用于SQS队列的ObjectCreated事件,最终由Lambda函数使用以进行后续处理。

我们有一个新的处理要求,要求我们在SQS处理程序lambda中标识用于对原始APIGW请求进行身份验证的API密钥ID,但是我们没有提出一种方法。 我们正在寻找一种方法来传递客户端请求的Authorization标头作为处理lambda接收到的事件内容的一部分,但没有成功–我怀疑向S3传入的创建对象的请求很可能与该请求的上下文完全不同。 S3触发器(无论新对象来自何处都将触发)。 同样,我们还寻找了一种将Authorization标头(或映射的查询参数)映射到S3元数据的方法,这一点也不令人高兴。 AWS S3集成服务是一个带有黑端口的黑匣子,没有充分记录,因此我无法确定是否有这样做的方法

最坏的情况是,我们可能会使用RequestIdObjectCreated事件与某种日志条目相关联,但这比我想要的更脆弱。 如果可能的话,我宁愿将其作为代理集成配置的一部分。

有什么想法吗?

除非API网关中有一个“陷阱”使它无法按需使用,否则您可以在上传S3对象时通过向请求中注入正确的标头来向其添加标签。

S3的PUT Object REST方法支持请求标头X-Amz-Tagging ,它允许您指定一个或多个标记键和值,并且您应该能够将其注入到集成请求中-尽管我不确定是否API Gateway提供了足够的功能,可让您进行字符串连接并应用此标头期望的url编码。 除非API密钥中需要使用字符编码,而且可能没有任何此类字符,否则您可能不需要使用URL编码。

我还在对象标签和对象元数据之间的区别的答案中对此进行了讨论 ,这又是另外一个重点-标签可能适用于此,但元数据则不合适。 每次下载对象时,都会向客户端提供对象元数据,这可能会将那些API密钥显示给下载对象的不可信方。 标记不包含在下载中-有一个单独的子资源用于获取这些标记。 您的Lambda事件处理程序将需要调用S3来获取标签,如果事件处理程序中需要它们,或者如果您只是将其存档(以防万一),则标签中的存在可能就足够了。

遵循Michael的回答,APIGW确实支持构造的标头映射,尽管有点棘手。 事实证明,您可以使用映射模板设置标头和参数,而不仅仅是变换主体。 使用映射模板覆盖API的请求和响应参数以及状态代码涵盖了完整的解释,但是简要地说,我创建了一个具有以下内容的application/json集成请求映射模板:

#set($tags="submitter_api_key_id=$util.urlEncode($context.identity.apiKeyId)")
#set($context.requestOverride.header.x-amz-tagging = $tags)
$input.json("$")

请注意,设置x-amz-tagging标头是作为body转换的副作用完成的,它只是一个传递( $input.json("$")将整个主体作为JSON注入)。

唯一的其他更改是向API执行角色授予标记权限,

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:PutObjectTagging"
            ],
            "Resource": "arn:aws:s3:::<origin-bucket>/*"
        }
    ]
}

就是这样 现在我上传的S3对象与标签命名创建submitter_api_key_id ,其中包含与请求相关的API密钥的ID。 然后,我可以使用该密钥映射到实际提交者的身份并执行我们的业务策略。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM