Erreur python urllib3 lambda: LocationParseError Échec de l'analyse

Nov 08 2020

J'utilise la bibliothèque urllib3 dans le code Lambda et python3 qui récupère l'URL du webhook de MSTeams à partir d'AWS Secret Manager et envoie une demande de publication http pour publier une notification.

Mon URL webhook commence par https et ressemble à ceci "https: //outlook.office.com/webhook / .......". Lors de l'exécution de la fonction lambda, j'obtiens une erreur comme indiqué ci-dessousLocationParseError Failed to parse:

Code

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)

Message d'erreur

{
  "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",
      ""
    ]
  ]
}

Réponses

StarJedi Nov 08 2020 at 21:43

Voici comment je l'ai résolu

  • Déploiement du fichier zip lambda à nouveau, avec les dépendances correctes telles que les requêtes, urllib3 dans le même dossier
  • Apparemment, j'essayais de stocker le secret en tant que paire clé / valeur dans AWS Secret Manager afin qu'il ne puisse pas analyser un dictionnaire. J'ai changé le type de secret en texte brut