Используйте AWS Go SDK с профилем

Можно ли использовать профиль из конфигурационных файлов aws (.aws и configuration) непосредственно в приложении Go без установки каких-либо переменных среды, таких как AWS_SDK_LOAD_CONFIG, AWS_PROFILE или любой другой переменной среды содержащие учетные данные в виде простого текста?

region := "xxxxxx"
profile := "xxxxxx"

  sess, err := session.NewSessionWithOptions(session.Options{
    Config: aws.Config{Region: aws.String(region),
              CredentialsChainVerboseErrors: aws.Bool(true)},
    Profile: profile,
})

Ответ таков:

NoCredentialProviders: нет действительных поставщиков в цепочке
причина: EnvAccessKeyNotFound: не удалось найти учетные данные в среде.
SharedCredsLoad: не удалось загрузить профиль, xxxxxxxxxx.
EC2RoleRequestError: нет роли экземпляра EC2. найдено
причина: Ошибка запроса: не удалось отправить запрос


person Matko Soric    schedule 09.02.2021    source источник


Ответы (2)


В соответствии с документацией да, вы можете указать profile при создании сеанса.

Порядок загрузки учетных данных и конфигурации

По умолчанию NewSession загружает учетные данные только из общего файла учетных данных (~/.aws/credentials). Если для переменной среды AWS_SDK_LOAD_CONFIG задано истинное значение, сеанс будет создан из значений конфигурации из общих файлов конфигурации (~/.aws/config) и общих учетных данных (~/.aws/credentials). Использование NewSessionWithOptions с SharedConfigState, для которого задано значение SharedConfigEnable, создаст сеанс, как если бы была установлена ​​переменная среды AWS_SDK_LOAD_CONFIG.

Переменные среды для учетных данных будут иметь приоритет над общей конфигурацией, даже если SharedConfig включен. Чтобы переопределить это поведение и использовать общие учетные данные конфигурации, вместо этого укажите session.Options.Profile (например, при использовании credential_source=Environment для принятия роли).

 sess, err := session.NewSessionWithOptions(session.Options{
      Profile: "myProfile",
  })

образец кода:

package main

import (
    "fmt"

    "github.com/aws/aws-sdk-go/aws"
    "github.com/aws/aws-sdk-go/aws/session"
    "github.com/aws/aws-sdk-go/service/s3"
)

func main() {
    region := "eu-central-1"
    profile := "myprofile"

    sess, err := session.NewSessionWithOptions(session.Options{
        Config: aws.Config{Region: aws.String(region),
            CredentialsChainVerboseErrors: aws.Bool(true)},
        Profile: profile,
    })
    if err != nil {
        fmt.Println(err)
    }
    svc := s3.New(sess)
    _, err = svc.CreateBucket(&s3.CreateBucketInput{
        Bucket: aws.String("myxplbukcet"),
    })
    if err != nil {
        fmt.Println(err.Error())
        return
    }
}
person samtoddler    schedule 09.02.2021
comment
Похоже, что либо AWS_SDK_LOAD_CONFIG должен быть установлен, либо для SharedConfigEnable должно быть установлено значение true, но без них предоставление профиля недостаточно для загрузки информации из файлов конфигурации aws. - person Matko Soric; 10.02.2021
comment
этого не хватало: SharedConfigState: session.SharedConfigEnable, - person Matko Soric; 10.02.2021
comment
@MatkoSoric выше, общий код был рабочим, я не устанавливал никакую другую переменную. По умолчанию NewSession будет загружать учетные данные только из файла общих учетных данных (~/.aws/credentials). Использование NewSessionWithOptions с SharedConfigState, установленным на SharedConfigEnable, создаст сеанс, как если бы была установлена ​​переменная среды AWS_SDK_LOAD_CONFIG - person samtoddler; 10.02.2021
comment
Итак, ваш AWS_SDK_LOAD_CONFIG пуст? - person Matko Soric; 10.02.2021
comment
@MatkoSoric да. Потому что у меня есть учетные данные внутри ~/.aws/credentials, и это место по умолчанию для поиска SDK. - person samtoddler; 10.02.2021

Похоже, Go пытается использовать общий файл учетных данных, но не может найти подходящий профиль. Можете ли вы проверить свой файл учетных данных и просмотреть доступные профили?

person Chris Pollard    schedule 09.02.2021
comment
файлы конфигурации в порядке, и профили присутствуют - person Matko Soric; 10.02.2021