python urllib3 lambda Hatası: LocationParseError ayrıştırılamadı

Nov 08 2020

Lambda'da urllib3 kitaplığı ve MSTeams'in web kancası url'sini AWS Secret Manager'dan alan ve bir bildirim yayınlamak için bir http gönderi isteği gönderen python3 kodunu kullanıyorum.

Webhook url'im https ile başlıyor ve "https: //outlook.office.com/webhook / ......." şeklinde görünüyor. Lambda işlevini çalıştırırken aşağıda gösterildiği gibi bir hata alıyorumLocationParseError Failed to parse:

Kodu

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)

hata mesajı

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

Yanıtlar

StarJedi Nov 08 2020 at 21:43

İşte nasıl çözdüm

  • Lambda zip dosyasını aynı klasörde istekler, urllib3 gibi doğru bağımlılıklar ile tekrar dağıttı
  • Görünüşe göre sırrı AWS Gizli yöneticisinde anahtar / değer çifti olarak saklamaya çalışıyordum, bu yüzden bir sözlüğü ayrıştıramadı. Gizli türü düz metin olarak değiştirdim