从 Lambda 函数调用 AWS 机密管理器时出现 CORS 问题

CORS issues when calling AWS secrets manager from Lambda function

我有一个用 python/chalice 编写的 API 部署为从 Web 应用程序调用的 Lambda。我以为我已经解决了常见的 CORS 问题,至少,一切都没有问题,并且已经做了一段时间。作为一个好孩子,我决定是时候将一些硬编码凭证从代码中移到 AWS Secrets Manager 中了。一切在我的本地环境中仍然运行良好(可能是因为 API 和应用程序都在本地主机上)并且从 Secrets Manager 中正确提取了凭据。但是,当我部署 API 时,Web 应用程序现在报告 CORS 错误:

Access to XMLHttpRequest at 'https://api' from origin 'https://webapp' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.

我已将问题的根源追溯到我对 boto3.session.Session().client().get_secret_value() 的调用。如果我不进行此调用 - 没有 CORS 错误。

这是我的 API 代码的相关片段:

@app.route('/get/table', methods=['GET'], cors=True)
def GetTable():

    session = boto3.session.Session()
    client = session.client(
        service_name='secretsmanager',
        region_name="eu-west-2"
    )
    get_secret_value_response = client.get_secret_value(SecretId="prod/xxxx")

那么,出了什么问题?我错过了一些简单的东西吗?

我终于到了。根本原因不是 CORS,而是 Lambda 使用 VPC 这一事实。它在本地工作的事实(不确定如何 - 也许与我为数据库访问设置的 ssh 隧道有关)只是增加了混乱的迷雾!

我的头在键盘上敲了很多次之后,这就是它起作用的原因:

  • 为 VPC 的 Secrets Manager 设置 VPC 端点
  • 向 VPC 安全组添加入站规则:安全组的所有 TCP(也许可以合理化,但我不知道该怎么做)
  • 修改 Lamdba 角色的 IAM 权限以添加 Secrets Manager。

-- 编辑

哦,好戏还在继续。以上工作正常......直到我用圣杯部署新版本的 Lambda。看起来,默认情况下,Chalice 正在为每个部署生成一个新策略,即使它在 IAM 控制台中看起来正确(存在 Secrets Manager 策略)它不起作用!

我不得不从该角色复制 IAM 策略摘要(当它工作时)并在我的本地 .chalice 文件夹中创建一个新的 policy.json 文件。部署时,要么指定 chalice deploy --no-autogen-policy 或将 "autogen_policy": false 添加到 .chalice/config.json 似乎终于解决了问题。