首页 > 解决方案 > 在 S3 存储桶触发器中获取 AWS 请求 API 密钥?

问题描述

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

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

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

有什么想法吗?

标签: amazon-web-servicesauthenticationamazon-s3metadataaws-api-gateway

解决方案


跟进迈克尔的回答,APIGW 确实支持构造的标头映射,尽管它有点棘手。事实证明,您可以使用映射模板来设置标题和参数,而不仅仅是转换正文。完整的解释在Use a Mapping Template to Override an API's Request and Response Parameters and Status Codes中进行了介绍,但简而言之,我创建了一个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标头是作为主体转换的副作用完成的,这只是一个传递($input.json("$")将整个主体作为 JSON 注入)。

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

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

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


推荐阅读