OAuthアクセストークンを使ってAzure Storageにアクセスする
Posted: , Modified: Go Azure OAuth Qiita
本稿は Qiita 投稿記事 のバックアップです.
概要
OAuthアクセストークンを使ってMicrosoft Azureにアクセスするでは Swagger で生成したクライアントで OAuth アクセストークンを利用する方法を紹介したが, 本記事では,Azure Storage SDK for Go を利用する方法を紹介する.
API アクセスキー
Azure Storage SDK のクライアントはアクセストークンではなく,アクセスキーを必要とする. このアクセスキーは Storage API ではなく,Storage Accounts API 経由で取得する. また,Storage API は Azure Storage SDK からアクセスできるが,Storage Accounts API はアクセスできないので, 例によって Swagger を使って Azure REST API Specifications からバインディングを用意する必要がある.
$ swagger generate client \
-f https://raw.githubusercontent.com/Azure/azure-rest-api-specs/master/arm-storage/2016-12-01/swagger/storage.json \
-t storage
Storage Accounts API
生成されたソースコードを用いて,先ずは Storage Accounts API のクライアントを作成する NewStorageAccountsClient
関数を定義する.
import (
"context"
httptransport "github.com/go-openapi/runtime/client"
"github.com/go-openapi/strfmt"
// 以下は Swagger にて生成されたソースコードに合わせて修正する
client "github.com/jkawamoto/roadie/cloud/azure/storage/client"
"github.com/jkawamoto/roadie/cloud/azure/storage/client/storage_accounts"
)
const (
StorageAPIVersion = "2016-12-01"
)
func NewStorageAccountsClient(ctx context.Context, token string) *storage_accounts.Client{
manager := client.NewHTTPClient(strfmt.NewFormats())
switch transport := manager.Transport.(type) {
case *httptransport.Runtime:
transport.DefaultAuthentication = httptransport.BearerToken(token)
manager.StorageAccounts.SetTransport(transport)
}
return manager.StorageAccounts
}
次に,得られたクライアントの StorageAccountsListKeys
メソッドを使ってアクセスキーを取得する GetStorageKey
関数を定義する.
またこの関数はアクセスキーが見つからない場合 StorageAccountsRegenerateKey
関数を使って生成する.
const (
// サブスクリプション ID
SubscriptionID = ""
// リソースグループ名
ResourceGroupName = ""
)
func GetStorageKey(ctx context.Context, cli *storage_accounts.Client, account string) (key string, err error) {
keyList, err := cli.StorageAccountsListKeys(
storage_accounts.NewStorageAccountsListKeysParamsWithContext(ctx).
WithAPIVersion(StorageAPIVersion).
WithSubscriptionID(SubscriptionID).
WithResourceGroupName(ResourceGroupName).
WithAccountName(account)) // Storage アカウント名
if err != nil || len(keyList.Payload.Keys) == 0 {
res, err := cli.StorageAccountsRegenerateKey(
storage_accounts.NewStorageAccountsRegenerateKeyParamsWithContext(ctx).
WithAPIVersion(StorageAPIVersion).
WithSubscriptionID(SubscriptionID).
WithResourceGroupName(ResourceGroupName).
WithAccountName(account))
if err != nil {
return "", err
}
key = res.Payload.Keys[0].Value
} else {
key = keyList.Payload.Keys[0].Value
}
return
}
アクセスキーを使った Storage API のアクセス
最後に,得られたアクセスキーを使って Storage API のクライアントを作成する.
import (
storage "github.com/Azure/azure-storage-go"
)
func NewStorageClient(account, key string) (storage.Client, error) {
return storage.NewBasicClient(account, key)
}