我有一个前端应用程序,该应用程序将使用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?解决方案不必在lambda中,也许我可以在cloudfront中使用某些东西,当前没有子域api.example.com指向lambda。
答案 0 :(得分:1)
找到了我真正喜欢的解决方案,不确定我以前怎么没想到。
在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网关->服务->资源策略中设置该策略。我敢肯定,如果某些lambda /端点允许不同/完全访问,那么您可以添加多个IP,这样,根据部署阶段,我也可以拥有不同的IP。