go-sdk
go-sdk copied to clipboard
Добавить в README разные примеры авторизации
Не у всех есть возможность использовать персональный oauth токен и приходится работать с Яндекс облаком через корпоративную (федеративную) учётную запись. В связи с этим прошу расширить пример авторизации в YandexCloud через SDK разными способами, чтобы другие люди могли сэкономить время.
Мой пример:
oauthToken := flag.String("oauth-token", "", "")
pathToServiceAccountKey := flag.String("path-to-service-account-key", "", "path/to/service-account-key.json")
iamToken := flag.String("iam-token", "", "")
flag.Parse()
var creds ycsdk.Credentials
if *oauthToken != "" {
creds = ycsdk.OAuthToken(*oauthToken)
} else if *iamToken != "" {
creds = ycsdk.NewIAMTokenCredentials(*iamToken)
} else if *pathToServiceAccountKey != "" {
bytes, err := ioutil.ReadFile(*pathToServiceAccountKey)
if err != nil {
return fmt.Errorf("cant find service account json file: %w", err)
}
var SAKey iamkey.Key
err = yaml.Unmarshal(bytes, &SAKey)
if err != nil {
return err
}
creds, err = ycsdk.ServiceAccountKey(&SAKey)
if err != nil {
return err
}
} else {
return fmt.Errorf("error: oauth or iam token is not provided")
}
sdk, err := ycsdk.Build(ctx, ycsdk.Config{
Credentials: creds,
})
if err != nil {
log.Fatal("build creds error:", err)
}
С доками все так плохо, что пост @konstesting гугглится наряду с описаниями YC API. Так что добавлю свой примерчик для случая с serviceAccountJson file:
import (
"context"
"github.com/yandex-cloud/go-genproto/yandex/cloud/compute/v1"
ycsdk "github.com/yandex-cloud/go-sdk"
"github.com/yandex-cloud/go-sdk/iamkey"
)
func ycsdkApiFetch(ctx context.Context, folderId string) {
serviceAccountKeyJson := "example.json"
key, err := iamkey.ReadFromJSONFile(serviceAccountKeyJson)
if err != nil {
return err
}
creds, err := ycsdk.ServiceAccountKey(key)
if err != nil {
return err
}
cfg := ycsdk.Config{
Credentials: creds,
}
sdk, err := ycsdk.Build(ctx, cfg)
if err != nil {
return err
}
result, err := sdk.Compute().Instance().List(ctx, &compute.ListInstancesRequest{
FolderId: folderId,
})
if err != nil {
return err
}
for _, inst := range result.GetInstances() {
// some code
}
}