Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

236
Vistas
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 Respuestas
Responde la pregunta

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 Denunciar

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 Denunciar

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 Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda