问题描述
我有一个前端应用程序,该应用程序将使用lambda服务,端点启用CORS的方式如下:
// serverless.yml
functions:
test:
handler: functions/test.handler
events:
- http:
path: /test
method: get
cors: true
测试函数的处理程序具有如下标头:
// ./functions/test.js
headers: {
'Access-Control-Allow-Origin': 'https://example.com',
},
当我构建/部署无服务器项目时,我可以将生成的URL放在浏览器中并看到响应。ACAO头确实存在,我还没有尝试在站点上使用它,它可能在那里被阻止,但CORS是不够的--它只是基于浏览器,如果以其他方式请求,lambda响应仍然可见。
我要做的是限制对这些(生产)lambda函数的访问,除非请求来自我的应用程序,该应用程序(静态)托管在S3存储桶中,存储桶链接到CloudFront,CloudFront链接到域(使用该域的路由53。
我的应用程序不会有用户,我只是不希望在那里提供的数据可以从第三方服务访问。我考虑构建一个在每个函数中导入的函数,如果状态为Prod,它将检查IP,但我不确定这是否是一个好做法。
我还能做些什么来保护那些羔羊?解决方案不一定要在lambda中,也许CloudFront中有我可以使用的东西,目前没有一个子域api.example.com将指向lambda。
推荐答案
实际上找到了我喜欢的解决方案,不确定我以前怎么没有想到这个。
在serverless.yml中,资源策略如下所示:
provider:
name: aws
runtime: nodejs8.10
memorySize: 128
stage: dev
resourcePolicy:
- Effect: Allow
Principal: '*'
Action: execute-api:Invoke
Resource:
- execute-api:/*/*/*
Condition:
IpAddress:
aws:SourceIp:
- 'your ip here'
部署时,策略在API网关->您的服务->资源策略中设置。我相信,如果某些lambdas/端点应该允许不同/完全访问,您可以添加多个IP,这样我也可以根据部署阶段拥有不同的IP。