AWS SDK для Go
AWS SDK для Go
Подготовка к работе
- Создайте сервисный аккаунт.
- Назначьте сервисному аккаунту роли, которые нужны для вашего проекта, например storage.editor на бакет — для работы с конкретным бакетом, или на каталог — для работы со всеми бакетами в каталоге. Подробнее о ролях см. на странице Управление доступом с помощью Yandex Identity and Access Management.
- Создайте статический ключ доступа.
Примечание
Сервисный аккаунт может просматривать список бакетов только в том каталоге, в котором он был создан.
Сервисный аккаунт может выполнять действия с объектами в бакетах, которые созданы в каталогах, отличных от каталога сервисного аккаунта. Для этого назначьте сервисному аккаунту роли на нужный каталог или бакет в нем.
Установка
Для установки AWS SDK для Go воспользуйтесь инструкцией
Настройка
Настройка директории для аутентификационных данных
-
Создайте директорию для хранения аутентификационных данных и перейдите в нее:
Для macOS и Linux:
mkdir ~/.aws/
Для Windows:
mkdir C:\Users\<имя_пользователя>\.aws\
-
В директории
.aws
создайте файлcredentials
с аутентификационными данными для Object Storage и скопируйте в него следующую информацию:[default] aws_access_key_id = <идентификатор_статического_ключа> aws_secret_access_key = <секретный_ключ>
-
Создайте файл
config
с параметрами региона по умолчанию и скопируйте в него следующую информацию:[default] region = ru-central1 endpoint_url = https://storage.yandexcloud.net
Примечание
Некоторые приложения, предназначенные для работы с Amazon S3, не позволяют указывать регион, поэтому Object Storage принимает также значение
us-east-1
.
Для доступа к Object Storage используйте эндпоинт https://storage.yandexcloud.net
.
Использование переменных окружения
AWS SDK для Go по умолчанию использует аутентификационные данные из переменных окружения, если они заданы. Эти переменные имеют приоритет над аутентификационными данными, которые указаны в файле .aws/credentials
.
Поддерживаются следующие переменные окружения:
AWS_ACCESS_KEY_ID
— идентификатор статического ключа;AWS_SECRET_ACCESS_KEY
— секретный ключ;AWS_SESSION_TOKEN
— (опционально) токен сессии. Подробнее см. Доступ в бакет с помощью Security Token Service.
Чтобы задать переменные окружения, выполните следующие действия в зависимости от вашей операционной системы:
В терминале выполните команду:
export AWS_ACCESS_KEY_ID=<идентификатор_статического_ключа>
export AWS_SECRET_ACCESS_KEY=<секретный_ключ>
export AWS_SESSION_TOKEN=<опциональный_токен_сессии>
В PowerShell выполните команду:
$Env:AWS_ACCESS_KEY_ID=<идентификатор_статического_ключа>
$Env:AWS_SECRET_ACCESS_KEY=<секретный_ключ>
$Env:AWS_SESSION_TOKEN=<опциональный_токен_сессии>
Примеры кода
Развитие AWS SDK v.1
Получение списка имен бакетов
package main
import (
"context"
"log"
"github.com/aws/aws-sdk-go-v2/aws"
"github.com/aws/aws-sdk-go-v2/config"
"github.com/aws/aws-sdk-go-v2/service/s3"
)
func main() {
// Подгружаем конфигурацию из ~/.aws/*
cfg, err := config.LoadDefaultConfig(context.TODO())
if err != nil {
log.Fatal(err)
}
// Создаем клиента для доступа к хранилищу S3
client := s3.NewFromConfig(cfg)
// Запрашиваем список бакетов
result, err := client.ListBuckets(context.TODO(), &s3.ListBucketsInput{})
if err != nil {
log.Fatal(err)
}
for _, bucket := range result.Buckets {
log.Printf("bucket=%s creation time=%s", aws.ToString(bucket.Name), bucket.CreationDate.Local().Format("2006-01-02 15:04:05 Monday"))
}
}
package main
import (
"context"
"fmt"
"log"
"github.com/aws/aws-sdk-go-v2/aws"
"github.com/aws/aws-sdk-go-v2/config"
"github.com/aws/aws-sdk-go-v2/service/s3"
)
func main() {
// Создаем кастомный обработчик эндпоинтов, который для сервиса S3 и региона ru-central1 выдаст корректный URL
customResolver := aws.EndpointResolverWithOptionsFunc(func(service, region string, options ...interface{}) (aws.Endpoint, error) {
if service == s3.ServiceID && region == "ru-central1" {
return aws.Endpoint{
PartitionID: "yc",
URL: "https://storage.yandexcloud.net",
SigningRegion: "ru-central1",
}, nil
}
return aws.Endpoint{}, fmt.Errorf("unknown endpoint requested")
})
// Подгружаем конфигурацию из ~/.aws/*
cfg, err := config.LoadDefaultConfig(context.TODO(), config.WithEndpointResolverWithOptions(customResolver))
if err != nil {
log.Fatal(err)
}
// Создаем клиента для доступа к хранилищу S3
client := s3.NewFromConfig(cfg)
// Запрашиваем список бакетов
result, err := client.ListBuckets(context.TODO(), &s3.ListBucketsInput{})
if err != nil {
log.Fatal(err)
}
for _, bucket := range result.Buckets {
log.Printf("bucket=%s creation time=%s", aws.ToString(bucket.Name), bucket.CreationDate.Format("2006-01-02 15:04:05 Monday"))
}
}
Получение списка объектов в бакете
Чтобы получить список объектов в бакете, передайте его имя в параметре командной строки -b
.
package main
import (
"context"
"flag"
"fmt"
"log"
"github.com/aws/aws-sdk-go-v2/aws"
"github.com/aws/aws-sdk-go-v2/config"
"github.com/aws/aws-sdk-go-v2/service/s3"
)
func main() {
// Получаем имя бакета из аргумента командной строки
bucketName := flag.String("b", "", "The name of the bucket")
flag.Parse()
if *bucketName == "" {
fmt.Println("You must supply the name of a bucket (-b BUCKET)")
return
}
// Подгружаем конфигурацию из ~/.aws/*
cfg, err := config.LoadDefaultConfig(context.TODO())
if err != nil {
log.Fatal(err)
}
// Создаем клиента для доступа к хранилищу S3
client := s3.NewFromConfig(cfg)
// Запрашиваем список всех файлов в бакете
result, err := client.ListObjectsV2(context.TODO(), &s3.ListObjectsV2Input{
Bucket: aws.String(*bucketName),
})
if err != nil {
log.Fatal(err)
}
for _, object := range result.Contents {
log.Printf("object=%s size=%d Bytes last modified=%s", aws.ToString(object.Key), aws.ToInt64(object.Size), object.LastModified.Local().Format("2006-01-02 15:04:05 Monday"))
}
}
package main
import (
"context"
"fmt"
"log"
"flag"
"github.com/aws/aws-sdk-go-v2/aws"
"github.com/aws/aws-sdk-go-v2/config"
"github.com/aws/aws-sdk-go-v2/service/s3"
)
func main() {
// Получаем имя бакета из аргумента командной строки
bucketName := flag.String("b", "", "The name of the bucket")
flag.Parse()
if *bucketName == "" {
fmt.Println("You must supply the name of a bucket (-b BUCKET)")
return
}
// Создаем кастомный обработчик эндпоинтов, который для сервиса S3 и региона ru-central1 выдаст корректный URL
customResolver := aws.EndpointResolverWithOptionsFunc(func(service, region string, options ...interface{}) (aws.Endpoint, error) {
if service == s3.ServiceID && region == "ru-central1" {
return aws.Endpoint{
PartitionID: "yc",
URL: "https://storage.yandexcloud.net",
SigningRegion: "ru-central1",
}, nil
}
return aws.Endpoint{}, fmt.Errorf("unknown endpoint requested")
})
// Подгружаем конфигурацию из ~/.aws/*
cfg, err := config.LoadDefaultConfig(context.TODO(), config.WithEndpointResolverWithOptions(customResolver))
if err != nil {
log.Fatal(err)
}
// Создаем клиента для доступа к хранилищу S3
client := s3.NewFromConfig(cfg)
// Запрашиваем список всех файлов в бакете
result, err := client.ListObjectsV2(context.TODO(), &s3.ListObjectsV2Input{
Bucket: aws.String(*bucketName),
})
if err != nil {
log.Fatal(err)
}
for _, object := range result.Contents {
log.Printf("object=%s size=%d Bytes last modified=%s", aws.ToString(object.Key), object.Size, object.LastModified.Format("2006-01-02 15:04:05 Monday"))
}
}
Также см. примеры кода