Загрузить файл на ферму устройств AWS

Я пытаюсь использовать python + boto3 для создания загрузки в ферме устройств (загрузка теста или приложения). Метод «create_upload» работает нормально, поскольку он возвращает адрес загрузки и URL-адрес для загрузки на него.

Когда я пытаюсь использовать запросы на загрузку файла по этому URL-адресу, я получаю сообщение об ошибке:

<Error><Code>SignatureDoesNotMatch</Code><Message>The request signature we calculated does not match the signature you provided. Check your key and signing method.</Message><AWSAccessKeyId>AKIAJV4C3CWPBUMBC3GA</AWSAccessKeyId><StringToSign>AWS4-HMAC-SHA256

Мой код:

response = client.create_upload(
  projectArn=df_project,
  name="test.zip",
  type="APPIUM_JAVA_TESTNG_TEST_PACKAGE",
  contentType='application/octet-stream'
)
test_url = response["upload"]["url"]
files = {'upload_file': open('/tmp/test.zip','rb')}
r = requests.post(test_url, files=files, data={})

Также я попытался использовать curl и request.post передать файл атрибуту данных:

r = requests.put(test_url, data=open("/tmp/test.zip", "rb").read())
print(r.text)

а также

cmd = "curl --request PUT --upload-file /tmp/test.zip \""+test_url+"\""
result = subprocess.call(cmd, shell=True)
print(result)

person Elheni Mokhles    schedule 21.09.2017    source источник


Ответы (2)


Я делал это раньше в прошлом проекте. Вот фрагмент кода того, как я это сделал:

создать новую загрузку

#http://boto3.readthedocs.io/en/latest/reference/services/devicefarm.html#DeviceFarm.Client.create_upload
print('Creating the upload presigned url')
response = client.create_upload(projectArn=args.projectARN,name=str(args.testPackageZip),type='APPIUM_WEB_JAVA_TESTNG_TEST_PACKAGE')
#create the s3 bucket to store the upload test suite
uploadArn = response['upload']['arn']
preSignedUrl = response['upload']['url']
print('uploadArn: ' + uploadArn + '\n')
print('pre-signed url: ' + preSignedUrl + '\n')

#print the status of the upload
#http://boto3.readthedocs.io/en/latest/reference/services/devicefarm.html#DeviceFarm.Client.get_upload
status = client.get_upload(arn=uploadArn)
print("S3 Upload Bucket Status: " + status['upload']['status'] + '\n')

print("Uploading file...")
#open the file and make payload
payload = {'file':open(args.testPackageZip,'rb')}
#try and perform the upload
r = requests.put(url = preSignedUrl,files = payload)
#print the response code back
print(r)

надеюсь, это поможет

person jmp    schedule 23.09.2017

Я работаю в AWS Device Farm. Эта проблема возникает, когда некоторые параметры запроса не соответствуют тому, что использовалось для подписи URL-адреса. Когда я сталкивался с этой проблемой, это было связано с типом контента. Я бы предложил не передавать его в запросе CreateUpload. Если вы передадите его, вам также нужно будет включить его в качестве заголовка запроса при вызове PUT.

person billy    schedule 22.09.2017