【问题标题】:python urllib3 lambda Error: LocationParseError Failed to parsepython urllib3 lambda 错误:LocationParseError 无法解析
【发布时间】:2021-02-20 19:34:18
【问题描述】:

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

我的 webhook url 以 https 开头,看起来像这样“https://outlook.office.com/webhook/.......”。在执行 lambda 函数时,出现如下错误LocationParseError Failed to parse:

代码

import urllib3 

http = urllib3.PoolManager() 

MSTEAMS_WEBHOOK_SECRET_NAME = os.getenv('MSTEAMS_WEBHOOK_SECRET_NAME') 
HOOK_URL = get_secret(MSTEAMS_WEBHOOK_SECRET_NAME,"eu-west-1") 

def get_secret(secret_name, region_name):

    # Create a Secrets Manager client
    session = boto3.session.Session()
    client = session.client(
        service_name='secretsmanager',
        region_name=region_name
    )
        get_secret_value_response = client.get_secret_value(
            SecretId=secret_name,
            VersionStage="AWSCURRENT"
        )
        if 'SecretString' in get_secret_value_response:
            secret = get_secret_value_response['SecretString']
            return secret
        else:
            decoded_binary_secret = base64.b64decode(get_secret_value_response['SecretBinary'])
            return decoded_binary_secret


def lambda_handler(event, context):
 message = {
      "@context": "https://schema.org/extensions",
      "@type": "MessageCard",
      "themeColor": data["colour"],
      "title": title,
      "text": "accountId:\n"  + account_id + " <br/>\n" 
    }
 
    webhook_encoded_body = json.dumps(message).encode('utf-8')
    response = http.request('POST',HOOK_URL, body=webhook_encoded_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",
      ""
    ]
  ]
}

【问题讨论】:

  • get_secret 函数似乎正在返回一个字典(你们中的第二行错误消息暗示如此)
  • @yorodm 我添加了 get_secret() 的功能,您能否再给我一些指点?
  • @yorodm Noob 错误,我将秘密存储为键/值对。改成纯文本

标签: python lambda microsoft-teams urllib3 aws-secrets-manager


【解决方案1】:

我是这样解决的

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-12
    • 1970-01-01
    • 1970-01-01
    • 2015-04-19
    • 1970-01-01
    • 2021-03-29
    • 1970-01-01
    相关资源
    最近更新 更多