python urllib3 lambda错误:LocationParseError无法分析

python urllib3 lambda错误:LocationParseError无法分析,python,lambda,microsoft-teams,urllib3,aws-secrets-manager,Python,Lambda,Microsoft Teams,Urllib3,Aws Secrets Manager,我在Lambda和python3代码中使用urllib3库,它从AWS Secret Manager获取MSTeam的webhook url,并发送http post请求以发布通知 我的webhook url以https开头,如下所示“https://outlook.office.com/webhook/.......". 在执行lambda函数时,我得到一个错误,如下所示LocationParseError未能解析: 代码 导入urllib3 http=urllib3.PoolManager(

我在Lambda和python3代码中使用urllib3库,它从AWS Secret Manager获取MSTeam的webhook url,并发送http post请求以发布通知

我的webhook url以https开头,如下所示“https://outlook.office.com/webhook/.......". 在执行lambda函数时,我得到一个错误,如下所示
LocationParseError未能解析:

代码

导入urllib3
http=urllib3.PoolManager()
MSTEAMS\u WEBHOOK\u SECRET\u NAME=os.getenv('MSTEAMS\u WEBHOOK\u SECRET\u NAME'))
HOOK\u URL=get\u secret(MSTEAMS\u WEBHOOK\u secret\u NAME,“eu-west-1”)
def get_secret(secret_name,region_name):
#创建一个Secrets Manager客户端
session=boto3.session.session()
client=session.client(
服务\u name='secretsmanager',
地区名称=地区名称
)
get\u secret\u value\u response=client.get\u secret\u value(
SecretId=秘密名称,
VersionStage=“AWSCURRENT”
)
如果get\u secret\u value\u响应中的“SecretString”:
secret=get\u secret\u value\u响应['SecretString']
归还秘密
其他:
decoded_binary_secret=base64.b64解码(获取_secret_value_响应['SecretBinary'])
返回解码的二进制密码
def lambda_处理程序(事件、上下文):
消息={
“@context”:”https://schema.org/extensions",
“@type”:“MessageCard”,
“主题颜色”:数据[“颜色”],
“头衔”:头衔,
“文本”:“帐户id:\n”+帐户id+“
\n” } webhook_encoded_body=json.dumps(message.encode('utf-8')) response=http.request('POST',HOOK\u URL,body=webhook\u encoded\u body)
错误信息

{
  "errorMessage": "Failed to parse: {\"msteams-secret\":\"https://outlook.office.com/webhook/dxxxxxx@d779xxxxx-xxxxxx/IncomingWebhook/axxxxxx5/ca746326-bxxx-4xxx-8x-xxxxx\"}",
  "errorType": "LocationParseError",
  "stackTrace": [
    [
      "/var/task/lambda_function.py",
      145,
      "lambda_handler",
      "resp = http.request('POST',HOOK_URL, body=webhook_encoded_body)"
    ],
    [
      "/var/runtime/urllib3/request.py",
      80,
      "request",
      "method, url, fields=fields, headers=headers, **urlopen_kw"
    ],
    [
      "/var/runtime/urllib3/request.py",
      171,
      "request_encode_body",
      "return self.urlopen(method, url, **extra_kw)"
    ],
    [
      "/var/runtime/urllib3/poolmanager.py",
      324,
      "urlopen",
      "u = parse_url(url)"
    ],
    [
      "/var/runtime/urllib3/util/url.py",
      392,
      "parse_url",
      "return six.raise_from(LocationParseError(source_url), None)"
    ],
    [
      "<string>",
      3,
      "raise_from",
      ""
    ]
  ]
}
{
“errorMessage:”未能分析:{\“msteams secret\”:\”https://outlook.office.com/webhook/dxxxxxx@d779xxxxx-xxxxxx/IncomingWebhook/axxxxxx5/ca746326-bxxx-4xxx-8x-xxxxx\“}”,
“errorType”:“LocationParseError”,
“stackTrace”:[
[
“/var/task/lambda_function.py”,
145,
“lambda_handler”,
resp=http.request('POST',HOOK\u URL,body=webhook\u encoded\u body)
],
[
“/var/runtime/urllib3/request.py”,
80,
“请求”,
“方法,url,字段=字段,标题=标题,**urlopen\u kw”
],
[
“/var/runtime/urllib3/request.py”,
171,
“请求\编码\正文”,
返回self.urlopen(方法,url,**额外的)
],
[
“/var/runtime/urllib3/poolmanager.py”,
324,
“urlopen”,
“u=解析url(url)”
],
[
“/var/runtime/urllib3/util/url.py”,
392,
“解析url”,
返回六个。从(LocationParseError(source\u url),无)
],
[
"",
3.
“从……升起”,
""
]
]
}

以下是我如何解决它的

  • 再次部署lambda zip文件,并在同一文件夹中使用正确的依赖项(如请求、urllib3)
  • 显然,我试图在AWS secret manager中将机密存储为密钥/值对,因此它无法解析字典。我将秘密类型更改为纯文本

  • get_secret
    函数似乎返回了一个字典(您的错误消息的第二行暗示了这一点)@yorodm我添加了get_secret()函数,您能给我更多的指针吗?@yorodm Noob错了,我将秘密存储为密钥/值对。将其更改为纯文本
    {
      "errorMessage": "Failed to parse: {\"msteams-secret\":\"https://outlook.office.com/webhook/dxxxxxx@d779xxxxx-xxxxxx/IncomingWebhook/axxxxxx5/ca746326-bxxx-4xxx-8x-xxxxx\"}",
      "errorType": "LocationParseError",
      "stackTrace": [
        [
          "/var/task/lambda_function.py",
          145,
          "lambda_handler",
          "resp = http.request('POST',HOOK_URL, body=webhook_encoded_body)"
        ],
        [
          "/var/runtime/urllib3/request.py",
          80,
          "request",
          "method, url, fields=fields, headers=headers, **urlopen_kw"
        ],
        [
          "/var/runtime/urllib3/request.py",
          171,
          "request_encode_body",
          "return self.urlopen(method, url, **extra_kw)"
        ],
        [
          "/var/runtime/urllib3/poolmanager.py",
          324,
          "urlopen",
          "u = parse_url(url)"
        ],
        [
          "/var/runtime/urllib3/util/url.py",
          392,
          "parse_url",
          "return six.raise_from(LocationParseError(source_url), None)"
        ],
        [
          "<string>",
          3,
          "raise_from",
          ""
        ]
      ]
    }