yandex-cloud / go-sdk

Yandex.Cloud Go SDK
MIT License
82 stars 15 forks source link

Добавить в README разные примеры авторизации #18

Open konstesting opened 1 year ago

konstesting commented 1 year ago

Не у всех есть возможность использовать персональный 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)
    }
SergeyNarozhny commented 8 months ago

С доками все так плохо, что пост @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
    }
}