Как скачать с AWS S3 с помощью golang
Я пишу функцию go для загрузки файла из корзины AWS S3.
func DownloadFromS3Bucket() {
bucket := "cellery-runtime-installation"
item := "hello-world.txt"
file, err := os.Create(item)
if err != nil {
fmt.Println(err)
}
defer file.Close()
// Initialize a session in us-west-2 that the SDK will use to load
// credentials from the shared credentials file ~/.aws/credentials.
sess, _ := session.NewSession(&aws.Config{
Region: aws.String("us-east-1")},
)
downloader := s3manager.NewDownloader(sess)
numBytes, err := downloader.Download(file,
&s3.GetObjectInput{
Bucket: aws.String(bucket),
Key: aws.String(item),
})
if err != nil {
fmt.Println(err)
}
fmt.Println("Downloaded", file.Name(), numBytes, "bytes")
}
Тем не менее я получаю сообщение об ошибке с запросом учетных данных.
NoCredentialProviders: в цепочке нет действительных поставщиков. Устаревшее. Подробные сообщения см. В разделе aws.Config.CredentialsChainVerboseErrors.
В документации конкретно не сказано, как установить учетные данные. (Идентификатор ключа доступа, Секретный ключ доступа)
Любая идея?
1 ответ
Есть несколько способов установить учетные данные. Для более подробной информации AWS / учетные данные.
Например, вы можете указать это, установив переменные среды:
AWS_ACCESS_KEY = <your_access_key>
AWS_SECRET_KEY = <your_secret_key>
Тогда просто используйте credentials.NewEnvCredentials()
в вашем экземпляре конфигурации:
sess, _ := session.NewSession(&aws.Config{
Region: aws.String("us-east-1"),
Credentials: credentials.NewEnvCredentials(),
})
Просто установите AWS_ACCESS_KEY
а также AWS_SECRET_KEY
переменные окружения (не нужно вызывать credentials.NewEnvCredentials()
как часть session.NewSession
- то, что вы сделали, идеально):
func DownloadFromS3Bucket() {
os.Setenv("AWS_ACCESS_KEY","my-key")
os.Setenv("AWS_SECRET_KEY","my-secret")
bucket := "cellery-runtime-installation"
item := "hello-world.txt"
file, err := os.Create(item)
if err != nil {
fmt.Println(err)
}
defer file.Close()
sess, _ := session.NewSession(&aws.Config{Region: aws.String("us-east-1")})
downloader := s3manager.NewDownloader(sess)
numBytes, err := downloader.Download(file,
&s3.GetObjectInput{
Bucket: aws.String(bucket),
Key: aws.String(item),
})
if err != nil {
fmt.Println(err)
}
fmt.Println("Downloaded", file.Name(), numBytes, "bytes")
}
Это полный пример из AWS Go SDK: https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/go/example_code/s3/s3_download_object.go
Я написал сообщение в блоге о том, как протестировать загрузчик S3, и создал тестируемый сканер ведра S3, который перечисляет все файлы ведра и временно загружает каждый файл, см. https://medium.com/@tufin/a-testable-go-aws-s3-scanner-e54de0c26197
Здесь вы можете найти код: https://github.com/Tufin/blog/tree/master/s3-scanner