Estoy buscando integrar un cubo S3 con una API que estoy desarrollando, me encuentro con este error donde quiera que vaya:
SignatureDoesNotMatch: The request signature we calculated does not match the signature you provided. Check your key and signing method. status code: 403he hecho lo siguiente
Estoy probando tratando de enumerar cubos, aquí está el código tomado directamente de la documentación de AWS:
sess := session.Must(session.NewSessionWithOptions(session.Options{ <--- DEBUGGER SET HERE SharedConfigState: session.SharedConfigEnable, })) svc := s3.New(sess) result, err := svc.ListBuckets(nil) if err != nil { exitErrorf("Unable to list buckets, %v", err) } for _, b := range result.Buckets { fmt.Printf("* %s created on %s\n", aws.StringValue(b.Name), aws.TimeValue(b.CreationDate)) }Usando el depurador, puedo ver los archivos de configuración de las sesiones mientras se ejecuta el programa, el problema está potencialmente aquí
config - -> credentials -> creds -> v -> Access Key = "" -> Secret Access Key = "" -> Token = "" -> provider ->value -> Access Key With Value -> Secret Access Key With Value -> Token With ValuePersonalmente, no puedo encontrar ninguna documentación sobre "creds" / "v", y no sé si esto está causando el problema. Como mencioné, puedo usar la CLI de AWS para cargar en el depósito, e incluso cuando codifico mi clave de acceso, etc. en el SDK de Go, recibo este error.
Gracias por cualquier pensamiento, muy apreciado.
Acabo de compilar su código y se está ejecutando correctamente... una de las muchas formas de proporcionar credenciales a su binario es completar estos valores de entorno.
export AWS_ACCESS_KEY_ID=AKfoobarT2IJEAU4 export AWS_SECRET_ACCESS_KEY=oa6oT0Xxt4foobarbambazdWFCb export AWS_REGION=us-west-2eso es todo lo que necesita cuando usa el enfoque env var (sus valores están disponibles usando el navegador de la consola aws)
el panorama general es crear un script de shell contenedor ( bash ) que contenga las tres líneas anteriores para llenar los vars env para proporcionar credenciales y luego, en el mismo script de shell, ejecutar el binario golang (normalmente compila el golang en algún proceso preliminar) ... en mi caso, almaceno los valores de mis tres env vars en archivos cifrados que el script de shell descifra justo antes de llamar a los comandos de exportación anteriores
a veces es útil dejar caer y simplemente usar los comandos equivalentes de la línea de comandos de aws para entrar en el estadio de béisbol... desde una ejecución de terminal
aws s3 ls s3://cairo-mombasa-zaire --region us-west-2que también puede usar esos mismos env vars que se muestran arriba
para completar, aquí está su código con repetitivo agregado ... esto funciona bien y enumera los cubos
package main import ( "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/aws/session" "github.com/aws/aws-sdk-go/service/s3" // "github.com/aws/aws-sdk-go/service/s3/s3manager" "fmt" "os" ) func exitErrorf(msg string, args ...interface{}) { fmt.Fprintf(os.Stderr, msg+"\n", args...) os.Exit(1) } func main() { region_env_var := "AWS_REGION" curr_region := os.Getenv(region_env_var) if curr_region == "" { exitErrorf("ERROR - failed to get region from env var %v", region_env_var) } fmt.Println("here is region ", curr_region) // Load session from shared config sess := session.Must(session.NewSessionWithOptions(session.Options{ SharedConfigState: session.SharedConfigEnable, })) svc := s3.New(sess) result, err := svc.ListBuckets(nil) if err != nil { exitErrorf("Unable to list buckets, %v", err) } for _, b := range result.Buckets { fmt.Printf("* %s created on %s\n", aws.StringValue(b.Name), aws.TimeValue(b.CreationDate)) } } numBytes, err := downloader.Download(tempFile, &s3.GetObjectInput{ Bucket: aws.String(bucket), Key: aws.String(fileName), }, )En mi caso, el valor del depósito era incorrecto, falta el literal "/" al final. Agregar eso soluciona mi problema.
Recibí un error: err: SignatureDoesNotMatch: la firma de solicitud que calculamos no coincide con la firma que proporcionó. Verifique su clave y método de firma. código de estado: 403,
Si alguien más tiene este problema,
El problema era con respecto a las variables ambientales, como Scott sugirió anteriormente, sin embargo, se debió a la falta de
export AWS_SDK_LOAD_CONFIG="true"Si esta variable de entorno no está presente, el SDK de Golang no buscará un archivo de credenciales, junto con esto, instalé variables de entorno para mis dos claves, lo que permitió que la conexión se realizara correctamente.
Recordar