amazon-web-services - 如何限制对 lambda 的访问
问题描述
我有一个前端应用程序,该应用程序将使用 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 存储桶中,存储桶链接到云端,云端链接到域(使用路由 53为域。
我的应用程序没有用户,我只是不希望那里提供的数据可以从 3rd 方服务访问。我考虑构建一个我在每个函数中导入的函数,如果状态为 prod,它将检查 IP,但我不确定这是否是一个好习惯。
我还能做些什么来保护这些 lambda?解决方案不必在 lambda 中,也许我可以使用 cloudfront 中的某些东西,目前没有指向 lambda 的子域 api.example.com。
解决方案
找到了一个我实际上喜欢的解决方案,不知道我以前是怎么想到的。
在 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 Gateway -> Your service -> Resource Policy。如果某些 lambdas/endpoints 应该允许不同/完全访问,我相信你可以添加多个,这样我也可以根据部署阶段拥有不同的 IP。
推荐阅读
- python - 无法在 macos 上安装 boost-python
- node.js - 无法通过节点驱动程序将 JSON 文件插入 MongoDB 的集合
- reactjs - 是什么为我的反应组件提供了历史对象?
- python - 由于 Pytorch 包与 Conda 冲突,无法从头开始在 Mac OS X 上安装 Pytorch - 如何修复?
- javascript - [field] 规则如何工作
- javascript - 可以在反应组件中调用函数吗?
- python - 尽管在 run_in_executor 中运行了阻塞方法,但我收到“正在执行的任务”通知
- chart.js - 在 ChartJS 的插件中抓取标题
- java - 带导航的 Android Studio ViewPager
- java - 如何在Android中打开特定的tiktok视频链接?