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
- 设置
SecretId
和VersionId
输出:
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
谈到 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
- 设置
SecretId
和VersionId
输出:
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