我正在尝试使用 AWS SDK for Go 在 AWS Device Farm 中自动运行应用程序。但是任何使用 Go 版本 SDK 上传的应用程序都不会从“INITIALIZED”更改状态。如果我通过 AWS 控制台 Web 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"
}
}
随着时间的推移,状态永远不会从“INITIALIZED”改变。正如我所提到的,从 UI 调度运行的应用程序运行良好。
如何找出原因?
========================================
解决方案:
1)CreateUpload
需要在响应中使用预签名的 S3 链接上传文件后
2) 上传应通过 HTTP PUT 请求通过接收到的 URL 执行,文件内容在正文中
3) In&devicefarm.CreateUploadInput
应指定ContentType
参数。对于 PUT 请求,Content-Type
应使用相同的标头值
4) 如果 PUT 请求将从 Go 代码发送,Content-Length
则应手动设置标头