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-Type
PUT リクエストの場合、ヘッダーに同じ値を使用する必要があります
。4) PUT リクエストが Go コードから送信される場合は、Content-Length
ヘッダーを手動で設定する必要があります。