AWS SAM CLI 部署 - 解析开箱即用的问题 secret = get_secret_value_response['SecretString']

AWS SAM CLI DEPLOYMENT - Issues Parsing Out of the Box secret = get_secret_value_response['SecretString']

谈到 Python 时我很新手 - 对我来说太简单了。 使用 AWS 提供的开箱即用 Python3 示例代码 return 来自 AWS 的 'SecretString':Secrets Manager 服务。

没有问题..我得到了 returned 对象(注意我删除了一些细节)

{"username":"postgres","password":"XXXXXXXXX","engine":"postgres","host":"srdataset.XXXXXXXXX.ap-southeast-2.rds.amazonaws.com","port":5432,"dbInstanceIdentifier":"srdataset"}  

细节都正确。

然后我使用 json.loads() 将上面的内容解析到我的下一个函数中,这样我就可以像这样提取详细信息

    # request details
    login_details = get_secret("pg_srdataset_login_details")

    # load json
    y = json.loads(login_details)

    # extract result is a Python dictionary:
    print(y["username"])

这在我的 IDE (PyCharm) 中再次一切正常。我可以 运行 代码,在 Docker 容器中构建 .. 然后我使用 PyCharm AWS SAM CLI 将代码部署到云中 .. 没有问题。

然而,当我在 AWS 中测试函数时,代码在第 y = json.loads(login_details) 步出现错误。

错误是..

{
  "errorMessage": "Expecting value: line 1 column 1 (char 0)",
  "errorType": "JSONDecodeError",
  "stackTrace": [
    "  File \"/var/task/update_sp_changes.py\", line 229, in lambda_handler\n    y = json.loads(login_details)\n",
    "  File \"/var/lang/lib/python3.8/json/__init__.py\", line 357, in loads\n    return _default_decoder.decode(s)\n",
    "  File \"/var/lang/lib/python3.8/json/decoder.py\", line 337, in decode\n    obj, end = self.raw_decode(s, idx=_w(s, 0).end())\n",
    "  File \"/var/lang/lib/python3.8/json/decoder.py\", line 355, in raw_decode\n    raise JSONDecodeError(\"Expecting value\", s, err.value) from None\n"
  ]
}

为了测试这一点,我还从 AWS 复制了 JSON 'SecretString' returned,将其硬编码为变量,然后将此变量直接传递给 y = json.loads(login_details) step .再次测试,效果不错。

我做错了什么 - 我该如何解决这个问题。

作为参考,我会分享 Lambda 打印调试代码。

准备:

  • 从 Lambda-py38 初始状态,SecretsManagerReadWrite 策略附加到 Lamda
  • 设置SecretIdVersionId

输出:

  • json.loads() 适用于 plaintext
  • print() 输出几乎与 plain_text:str 和 secret_dict:dict 相同。 (不同之处在于引用:single/double。复制粘贴时被视为相同的字符串。)
import json
import boto3

def lambda_handler(event, context):

    client = boto3.client('secretsmanager')

    response = client.get_secret_value(
        SecretId='arn:aws:secretsmanager:xxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
        VersionId='xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
        VersionStage='AWSCURRENT'
    )

    print("type of response: ", type(response))
    print("response: ", response)

    plaintext = response['SecretString']
    print("type of plaintext: ", type(plaintext))
    print("plaintext: ", plaintext)

    secret_dict = json.loads(plaintext)
    print("type of secret_dict: ", type(secret_dict))
    print("secret_dict: ", secret_dict)

    return 200