Почему разные ошибки при использовании другого сетевого подключения для помещения файла в корзину s3 с Sign v4? - PullRequest
0 голосов
/ 17 июня 2019

Вот мой код:

Первый скрипт драйвера

#!/usr/bin/env python
import os
import sys
from gen_url import sign
import requests
import uuid

def upload_me(file_path, key=None, secret=None):
    access_key = 'ABC' if key is None else key
    secret_key = 'EDF' if secret is None else secret
    s3_bucket = 'my-work-bucket'
    object_name = '1-2-{uuid}.jpeg'.format(uuid=uuid.uuid4())
    mime_type = 'image/jpeg'
    expires = 24 * 60 * 60 # link expiry in sec
    os.environ['AWS_ACCESS_KEY_ID'] = access_key
    os.environ['AWS_SECRET_ACCESS_KEY'] = secret_key
    region = 'us-west-2'
    url = sign(key, secret, s3_bucket, object_name, mime_type, expires, region)
    with open(file_path, 'r') as f:
        resp = requests.post(url, data=f)
        print resp.content


if __name__ == '__main__':
    argc = len(sys.argv)
    key = secret = None
    if argc == 2 or argc == 4:
        file_path = sys.argv[1]
        if argc == 4:
            key = sys.argv[2]
            secret = sys.argv[3]
    else:
        raise Exception('Expect 1 or 3 arguments')
    upload_me(file_path, key, secret)

Код функции sign в gen_url модуле

import sys
import boto3
from botocore.client import Config
from datetime import datetime, date, time

def sign(access_key, secret_key, s3_bucket, object_name, mime_type, expires, region):
    s3_client = boto3.client('s3',
                             region_name=region,
                             aws_access_key_id=access_key,
                             aws_secret_access_key=secret_key)

    # Don't include content type
    #    'ContentType': mime_type
    params = {
        'Bucket': s3_bucket,
        'Key': object_name,
        }

    response = s3_client.generate_presigned_url('put_object',
                                                Params=params,
                                                ExpiresIn=expires)

    return response

Когда яЯ использую интернет-соединение дома, это ошибка, которую я получил:

requests.exceptions.ConnectionError: ('Connection aborted.', error(32, 'Broken pipe'))

Но я использую модем с моим iphone, команда выдает другую ошибку:

<Error><Code>SignatureDoesNotMatch</Code><Message>The request signature we calculated does not match the signature you provided. Check your key and signing method.</Message>

Почему полностьюразный выход при разных сетях?

1 Ответ

0 голосов
/ 17 июня 2019

Получается, что последние три строки скрипта драйвера должны быть:

with open(file_path, 'rb') as f:
    resp = requests.put(url, data=f)
    print resp.content

Тогда нет проблем ни с одним из соединений.

(error(32, 'Broken pipe') может быть просто совпадением, что с моим провайдером возникла проблема с подключением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...