python urllib3 람다 오류 : LocationParseError 구문 분석에 실패했습니다.
Nov 08 2020
저는 Lambda에서 urllib3 라이브러리를 사용하고 있으며 AWS Secret Manager에서 MSTeams의 웹훅 URL을 가져오고 알림을 게시하기 위해 http post 요청을 보내는 python3 코드를 사용하고 있습니다.
내 웹훅 URL은 https로 시작하며 "https : //outlook.office.com/webhook / ......."과 같습니다. 람다 함수를 실행할 때 아래와 같은 오류가 발생합니다.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",
""
]
]
}
답변
StarJedi Nov 08 2020 at 21:43
해결 방법은 다음과 같습니다.
- 동일한 폴더에 요청, urllib3과 같은 올바른 종속성을 사용하여 람다 zip 파일을 다시 배포했습니다.
- 분명히 암호를 AWS Secret Manager에 키 / 값 쌍으로 저장하려고했기 때문에 사전을 구문 분석 할 수 없었습니다. 비밀 유형을 일반 텍스트로 변경했습니다.