Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

235
Views
AWS S3 - SDK de Golang - SignatureDoesNotMatch

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: 403

he hecho lo siguiente

  1. SDK y AWS CLI instalados, y AWS configurado
  2. Verificación doble (triple) de la ortografía de la clave y la clave secreta y los permisos de depósito
  3. Intenté con el documento de credenciales, .env e incluso codificando los valores directamente
  4. Probado con AWS CLI (ESTO FUNCIONA), por lo que creo que puedo descartar permisos, claves, en su conjunto.

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 Value

Personalmente, 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.

over 4 years ago · Santiago Trujillo
3 answers
Answer question

0

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-2

eso 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-2

que 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)) } }
over 4 years ago · Santiago Trujillo Report

0

 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,

over 4 years ago · Santiago Trujillo Report

0

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

  • si está intentando usar la carpeta de credenciales compartidas, debe usar la variable de entorno mencionada anteriormente para habilitarla.
  • Si está utilizando variables de entorno, no debería verse afectado por este problema.
over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!