2

AWS SDK for Go を使用して、AWS Device Farm でのアプリの実行を自動化しようとしています。しかし、Go バージョンの SDK でアップロードされたアプリは、ステータスが "INITIALIZED" から変更されることはありませんでした。AWS コンソールのウェブ UI を介してアップロードすると、すべて問題ありません。

アップロードのコードの例: func uploadApp(client *devicefarm.DeviceFarm, appType, projectArn string) string { params := &devicefarm.CreateUploadInput{ Name: aws.String(*appName), ProjectArn: aws.String(projectArn), Type: aws.String(appType), } resp, err := client.CreateUpload(params) if err != nil { log.Fatal("Failed to upload an app because of: ", err.Error()) } log.Println("Upload ARN:", *resp.Upload.Arn) return *resp.Upload.Arn } 応答として、次のようなものを受け取りました:
{ Upload: { Arn: "arn:aws:devicefarm:us-west-2:091463382595:upload:c632e325-266b-4bda-a74d-0acec1e2a5ae/9fbbf140-e377-4de9-b7df-dd18a21b2bca", Created: 2016-01-15 14:27:31 +0000 UTC, Name: "app-debug-unaligned.apk", Status: "INITIALIZED", Type: "ANDROID_APP", Url: "bla-bla-bla" } }
With time status never changes from "INITIALIZED". 前述したように、UI からスケジュールされて実行されるアプリは問題なく動作します。

この理由を理解する方法は?

=======================================

解決:

1)CreateUpload応答で事前に署名された S3 リンクを使用してファイルをアップロードする必要がある後
2) アップロードは、受信した URL によって本文にファイル コンテンツを含む HTTP PUT 要求を介して実行する必要があります
3)パラメータ&devicefarm.CreateUploadInputを指定する必要がありContentTypeます。Content-TypePUT リクエストの場合、ヘッダーに同じ値を使用する必要があります
。4) PUT リクエストが Go コードから送信される場合は、Content-Lengthヘッダーを手動で設定する必要があります。

4

1 に答える 1

2

CreateUpload API を呼び出すと、Device Farm は「Url」フィールドを含む「アップロード」応答を返します。

{ Upload: { Arn: "arn:aws:devicefarm:us-west-2:....", Created: 2016-01-15 14:27:31 +0000 UTC, Name: "app-name.apk", Status: "INITIALIZED", Type: "ANDROID_APP", Url: "bla-bla-bla" } }

返された URL「bla-bla-bla」は、アプリケーションをアップロードするための署名済み S3 URL です。オブジェクトをアップロードするための署名付き URL の使用に関するドキュメント: http://docs.aws.amazon.com/AmazonS3/latest/dev/PresignedUrlUploadObject.html

アプリケーションがアップロードされると、アプリケーションが処理されます。アップロードのステータスが「PROCESSING」と「SUCCEEDED」(または何か問題がある場合は「FAILED」)に変わります。「SUCCEEDED」ステータスになったら、それを使用して実行をスケジュールできます。

于 2016-01-15T19:23:34.460 に答える