Go SDK を使用して OSS リクエストを行うには、アクセス認証情報を設定する必要があります。Alibaba Cloud はこの認証情報を使用して、お客様の ID とアクセス権限を検証します。シナリオの認証と権限付与の要件に基づいて、さまざまな種類のアクセス認証情報を選択できます。このトピックでは、一時的および長期的なアクセス認証情報を設定する方法について説明します。
前提条件
アクセス認証情報を設定する前に、Go SDK をインストールする必要があります。詳細については、「Go SDK V1 のインストール」をご参照ください。
認証情報プロバイダーの初期化
認証情報プロバイダーの選択
OSS は、認証情報プロバイダーを初期化するための複数の方法をサポートしています。シナリオの認証と権限付与の要件に基づいて方法を選択できます。
認証情報プロバイダーの初期化方法 | シナリオ | 既存の AccessKey ペアまたはセキュリティトークンサービスのトークンが必要か | 基盤となる認証情報の種類 | 認証情報の有効期間 | 認証情報のローテーションまたはリフレッシュ方法 |
安全で安定した環境で実行され、外部攻撃に対して脆弱ではなく、頻繁な認証情報のローテーションなしで Alibaba Cloud サービスへの長期アクセスを必要とするアプリケーション。 | はい | アクセスキー | 長期間 | 手動ローテーション | |
信頼できない環境で実行され、アクセスの有効期間と権限のコントロールを必要とするアプリケーション。 | はい | STS トークン | 一時的 | 手動リフレッシュ | |
クロスアカウントアクセスなど、Alibaba Cloud サービスへの権限付与されたアクセスを必要とするアプリケーション。 | はい | STS トークン | 一時的 | 自動リフレッシュ | |
Alibaba Cloud ECS インスタンス、ECI インスタンス、または Container Service for Kubernetes のワーカーノードで実行されるアプリケーション。 | いいえ | STS トークン | 一時的 | 自動リフレッシュ | |
Alibaba Cloud 上の Container Service for Kubernetes のワーカーノードで実行される信頼できないアプリケーション。 | いいえ | STS トークン | 一時的 | 自動リフレッシュ | |
Alibaba Cloud Function Compute で実行されるアプリケーションの関数。 | いいえ | STS トークン | 一時的 | リフレッシュ不要 | |
外部システムからアクセス認証情報を取得する必要があるアプリケーション。 | いいえ | STS トークン | 一時的 | 自動リフレッシュ | |
AccessKey ペアの漏洩リスクがある環境で実行され、Alibaba Cloud サービスへの長期アクセスのために頻繁な認証情報のローテーションを必要とするアプリケーション。 | いいえ | AccessKey ペア | 長期間 | 自動ローテーション | |
上記の方法のいずれも要件を満たさない場合は、認証情報の取得方法をカスタマイズできます。 | カスタム | カスタム | カスタム | カスタム |
方法 1:AccessKey ペアの使用
アプリケーションが安全で安定した環境で実行され、外部攻撃に対して脆弱ではなく、OSS への長期アクセスを必要とし、頻繁にローテーションされる認証情報を使用できない場合は、Alibaba Cloud アカウントまたは Resource Access Management (RAM) ユーザーの AccessKey ペア (AccessKey ID と AccessKey Secret) を使用して認証情報プロバイダーを初期化できます。この方法では、AccessKey ペアを手動でメンテナンスする必要があり、セキュリティリスクとメンテナンスの複雑さが増します。AccessKey ペアを取得するには、「CreateAccessKey - Alibaba Cloud アカウントまたは RAM ユーザーの AccessKey ペアの作成」をご参照ください。
環境変数
Alibaba Cloud アカウントは、そのリソースに対して完全な権限を持っています。AccessKey ペアが漏洩すると、システムに重大なセキュリティリスクをもたらします。Alibaba Cloud アカウントの AccessKey ペアを使用することは推奨しません。代わりに、必要最小限の権限を持つ RAM ユーザーの AccessKey ペアを使用してください。
AccessKey ペアを使用して環境変数を設定します。
Mac OS X/Linux/UNIX
export OSS_ACCESS_KEY_ID=<ALIBABA_CLOUD_ACCESS_KEY_ID> export OSS_ACCESS_KEY_SECRET=<ALIBABA_CLOUD_ACCESS_KEY_SECRET>Windows
set OSS_ACCESS_KEY_ID=<ALIBABA_CLOUD_ACCESS_KEY_ID> set OSS_ACCESS_KEY_SECRET=<ALIBABA_CLOUD_ACCESS_KEY_SECRET>環境変数を使用して認証情報を渡します。
package main import ( "fmt" "os" "github.com/aliyun/aliyun-oss-go-sdk/oss" ) func main() { // 環境変数からアクセス認証情報を取得します。このサンプルコードを実行する前に、OSS_ACCESS_KEY_ID と OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。 provider, err := oss.NewEnvironmentVariableCredentialsProvider() if err != nil { fmt.Println("Error:", err) os.Exit(-1) } // OSSClient インスタンスを作成します。 // yourEndpoint をバケットのエンドポイントに設定します。たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。他のリージョンについては、実際のエンドポイントを使用してください。 // yourRegion をバケットが配置されているリージョンに設定します。たとえば、バケットが中国 (杭州) リージョンにある場合、リージョンを cn-hangzhou に設定します。他のリージョンについては、実際のリージョンを使用してください。 clientOptions := []oss.ClientOption{oss.SetCredentialsProvider(&provider)} clientOptions = append(clientOptions, oss.Region("yourRegion")) // 署名バージョンを設定します。 clientOptions = append(clientOptions, oss.AuthVersion(oss.AuthV4)) client, err := oss.New("yourEndpoint", "", "", clientOptions...) if err != nil { fmt.Println("Error:", err) os.Exit(-1) } fmt.Printf("client:%#v\n", client) }
静的な認証情報
コード内の変数を使用して認証情報を参照できます。実行時に、これらの変数は環境変数、設定ファイル、または他の外部データソースからの実際の認証情報値で設定されます。
以下の手順では、設定ファイルを例として使用します。
go-ini ライブラリをインストールする必要があります。インストールされていない場合は、次のコマンドを実行してインストールします:
go get -u github.com/go-ini/iniconfig.iniという名前の設定ファイルを作成します。[credentials] alibaba_cloud_access_key_id = <ALIBABA_CLOUD_ACCESS_KEY_ID> alibaba_cloud_access_key_secret = <ALIBABA_CLOUD_ACCESS_KEY_SECRET>設定ファイルを使用して認証情報を渡します。
package main import ( "fmt" "os" "github.com/aliyun/aliyun-oss-go-sdk/oss" "gopkg.in/ini.v1" ) type defaultCredentials struct { config *oss.Config } func (defCre *defaultCredentials) GetAccessKeyID() string { return defCre.config.AccessKeyID } func (defCre *defaultCredentials) GetAccessKeySecret() string { return defCre.config.AccessKeySecret } func (defCre *defaultCredentials) GetSecurityToken() string { return defCre.config.SecurityToken } type defaultCredentialsProvider struct { config *oss.Config } func (defBuild *defaultCredentialsProvider) GetCredentials() oss.Credentials { return &defaultCredentials{config: defBuild.config} } func NewDefaultCredentialsProvider(accessID, accessKey, token string) (defaultCredentialsProvider, error) { var provider defaultCredentialsProvider if accessID == "" { return provider, fmt.Errorf("access key id is empty!") } if accessKey == "" { return provider, fmt.Errorf("access key secret is empty!") } config := &oss.Config{ AccessKeyID: accessID, AccessKeySecret: accessKey, SecurityToken: token, } return defaultCredentialsProvider{ config, }, nil } func main() { cfg, err := ini.Load("config.ini") if err != nil { fmt.Println("Error loading config file:", err) return } accessKeyID := cfg.Section("credentials").Key("alibaba_cloud_access_key_id").String() accessKeySecret := cfg.Section("credentials").Key("alibaba_cloud_access_key_secret").String() provider, err := NewDefaultCredentialsProvider(accessKeyID, accessKeySecret, "") if err != nil { fmt.Println("Error:", err) os.Exit(-1) } // yourEndpoint をバケットのエンドポイントに設定します。たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。他のリージョンについては、実際のエンドポイントを使用してください。 // yourRegion をバケットが配置されているリージョンに設定します。たとえば、バケットが中国 (杭州) リージョンにある場合、リージョンを cn-hangzhou に設定します。他のリージョンについては、実際のリージョンを使用してください。 clientOptions := []oss.ClientOption{oss.SetCredentialsProvider(&provider)} clientOptions = append(clientOptions, oss.Region("yourRegion")) // 署名バージョンを設定します。 clientOptions = append(clientOptions, oss.AuthVersion(oss.AuthV4)) client, err := oss.New("yourEndpoint", "", "", clientOptions...) if err != nil { fmt.Println("Error:", err) os.Exit(-1) } fmt.Printf("client:%#v\n", client) }
方法 2:STS トークンの使用
アプリケーションが OSS への一時的なアクセスを必要とする場合は、セキュリティトークンサービス (STS) から取得した一時的な ID 認証情報 (AccessKey ID、AccessKey Secret、およびセキュリティトークン) を使用して認証情報プロバイダーを初期化できます。この方法では、STS トークンを手動でメンテナンスする必要があり、セキュリティリスクとメンテナンスの複雑さが増します。さらに、OSS に複数回一時的にアクセスするには、STS トークンを手動でリフレッシュする必要があります。STS トークンを取得するには、「AssumeRole - RAM ロールの一時的な ID 認証情報の取得」をご参照ください。
一時的な ID 認証情報を使用して環境変数を設定します。
Mac OS X/Linux/UNIX
export OSS_ACCESS_KEY_ID=<ALIBABA_CLOUD_ACCESS_KEY_ID> export OSS_ACCESS_KEY_SECRET=<ALIBABA_CLOUD_ACCESS_KEY_SECRET> export OSS_SESSION_TOKEN=<ALIBABA_CLOUD_SECURITY_TOKEN>Windows
set OSS_ACCESS_KEY_ID=<ALIBABA_CLOUD_ACCESS_KEY_ID> set OSS_ACCESS_KEY_SECRET=<ALIBABA_CLOUD_ACCESS_KEY_SECRET> set OSS_SESSION_TOKEN=<ALIBABA_CLOUD_SECURITY_TOKEN>環境変数を通じて認証情報を渡します。
package main import ( "fmt" "os" "github.com/aliyun/aliyun-oss-go-sdk/oss" ) func main() { // 環境変数からアクセス認証情報を取得します。このサンプルコードを実行する前に、OSS_ACCESS_KEY_ID、OSS_ACCESS_KEY_SECRET、および OSS_SESSION_TOKEN 環境変数が設定されていることを確認してください。 provider, err := oss.NewEnvironmentVariableCredentialsProvider() if err != nil { fmt.Println("Error:", err) os.Exit(-1) } // OSSClient インスタンスを作成します。 // yourEndpoint をバケットのエンドポイントに設定します。たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。他のリージョンについては、実際のエンドポイントを使用してください。 // yourRegion をバケットが配置されているリージョンに設定します。たとえば、バケットが中国 (杭州) リージョンにある場合、リージョンを cn-hangzhou に設定します。他のリージョンについては、実際のリージョンを使用してください。 clientOptions := []oss.ClientOption{oss.SetCredentialsProvider(&provider)} clientOptions = append(clientOptions, oss.Region("yourRegion")) // 署名バージョンを設定します。 clientOptions = append(clientOptions, oss.AuthVersion(oss.AuthV4)) client, err := oss.New("yourEndpoint", "", "", clientOptions...) if err != nil { fmt.Println("Error:", err) os.Exit(-1) } fmt.Printf("client:%#v\n", client) }
方法 3:RAMRoleARN の使用
アプリケーションがクロスアカウントアクセスなど、OSS への権限付与されたアクセスを必要とする場合は、RAMRoleARN を使用して認証情報プロバイダーを初期化できます。この方法では、基盤となる認証情報としてセキュリティトークンサービス (STS) トークンを使用します。RAM ロールの Alibaba Cloud リソースネーム (ARN) を指定すると、認証情報ツールは STS から STS トークンを取得し、有効期限が切れる前にトークンを自動的にリフレッシュします。policy パラメーターを設定して、RAM ロールの権限をさらに制限することもできます。この方法では AccessKey ペアを提供する必要があり、セキュリティリスクとメンテナンスの複雑さが増すことに注意してください。AccessKey ペアの作成方法の詳細については、「CreateAccessKey - RAM ユーザーの AccessKey ペアの作成」をご参照ください。RAM ロールの作成方法の詳細については、「CreateRole - RAM ロールの作成」をご参照ください。
認証情報の依存関係を追加します。
go get github.com/aliyun/credentials-go/credentialsアクセス認証情報を設定します。
package main import ( "fmt" "os" "github.com/aliyun/aliyun-oss-go-sdk/oss" "github.com/aliyun/credentials-go/credentials" ) type Credentials struct { AccessKeyId string AccessKeySecret string SecurityToken string } type defaultCredentialsProvider struct { cred credentials.Credential } func (credentials *Credentials) GetAccessKeyID() string { return credentials.AccessKeyId } func (credentials *Credentials) GetAccessKeySecret() string { return credentials.AccessKeySecret } func (credentials *Credentials) GetSecurityToken() string { return credentials.SecurityToken } func (defBuild *defaultCredentialsProvider) GetCredentials() oss.Credentials { cred, _ := defBuild.cred.GetCredential() return &Credentials{ AccessKeyId: *cred.AccessKeyId, AccessKeySecret: *cred.AccessKeySecret, SecurityToken: *cred.SecurityToken, } } func NewRamRoleArnCredentialsProvider(credential credentials.Credential) defaultCredentialsProvider { return defaultCredentialsProvider{ cred: credential, } } func main() { config := new(credentials.Config). // 認証情報の種類を指定します。値は ram_role_arn に固定されます。 SetType("ram_role_arn"). // RAM ユーザーの AccessKey ペア (AccessKeyId と AccessKeySecret) を環境変数から取得します。 SetAccessKeyId(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_ID")). SetAccessKeySecret(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET")). // デフォルトでは、以下の操作は直接パラメーター値を入力します。環境変数を追加し、os.Getenv("<variable_name>") を使用して対応するパラメーターを設定することもできます。 // 引き受ける RAM ロールの ARN を環境変数から取得します。フォーマットは acs:ram::$accountID:role/$roleName です。 SetRoleArn("ALIBABA_CLOUD_ROLE_ARN"). // RoleArn のデフォルト環境変数は ALIBABA_CLOUD_ROLE_ARN です。 // 異なるトークンを区別するために、カスタムのロールセッション名を指定します。 SetRoleSessionName("ALIBABA_CLOUD_ROLE_SESSION_NAME"). // RoleSessionName のデフォルト環境変数は ALIBABA_CLOUD_ROLE_SESSION_NAME です。 // (オプション) STS トークンの権限を制限します。 SetPolicy(""). // (オプション) STS トークンの有効期間を指定します。 SetRoleSessionExpiration(3600) arnCredential, err := credentials.NewCredential(config) if err != nil { fmt.Println("Error:", err) os.Exit(-1) } provider := NewRamRoleArnCredentialsProvider(arnCredential) // yourEndpoint をバケットのエンドポイントに設定します。たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。他のリージョンについては、実際のエンドポイントを使用してください。 // yourRegion をバケットが配置されているリージョンに設定します。たとえば、バケットが中国 (杭州) リージョンにある場合、リージョンを cn-hangzhou に設定します。他のリージョンについては、実際のリージョンを使用してください。 clientOptions := []oss.ClientOption{oss.SetCredentialsProvider(&provider)} clientOptions = append(clientOptions, oss.Region("yourRegion")) // 署名バージョンを設定します。 clientOptions = append(clientOptions, oss.AuthVersion(oss.AuthV4)) client, err := oss.New("yourEndpoint", "", "", clientOptions...) if err != nil { fmt.Println("Error:", err) os.Exit(-1) } fmt.Printf("client:%#v\n", client) }
方法 4:ECSRAMRole の使用
アプリケーションが ECS インスタンス、ECI インスタンス、または Container Service for Kubernetes (ACK) のワーカーノードで実行される場合は、ECSRAMRole を使用して認証情報プロバイダーを初期化できます。この方法では、基盤となる認証情報としてセキュリティトークンサービス (STS) トークンを使用します。ECSRAMRole を使用すると、ロールを ECS インスタンス、ECI インスタンス、または ACK のワーカーノードに関連付けて、インスタンス内で STS トークンを自動的にリフレッシュできます。この方法では、AccessKey ペアや STS トークンを提供する必要がないため、手動メンテナンスのリスクが排除されます。ECSRAMRole を取得するには、「CreateRole - RAM ロールの作成」をご参照ください。
認証情報の依存関係を追加します。
go get github.com/aliyun/credentials-go/credentialsECSRAMRole をアクセス認証情報として設定します。
package main import ( "fmt" "os" "github.com/aliyun/aliyun-oss-go-sdk/oss" "github.com/aliyun/credentials-go/credentials" ) type Credentials struct { AccessKeyId string AccessKeySecret string SecurityToken string } type CredentialsProvider struct { cred credentials.Credential } func (credentials *Credentials) GetAccessKeyID() string { return credentials.AccessKeyId } func (credentials *Credentials) GetAccessKeySecret() string { return credentials.AccessKeySecret } func (credentials *Credentials) GetSecurityToken() string { return credentials.SecurityToken } func (defBuild CredentialsProvider) GetCredentials() oss.Credentials { cred, _ := defBuild.cred.GetCredential() return &Credentials{ AccessKeyId: *cred.AccessKeyId, AccessKeySecret: *cred.AccessKeySecret, SecurityToken: *cred.SecurityToken, } } func NewEcsCredentialsProvider(credential credentials.Credential) CredentialsProvider { return CredentialsProvider{ cred: credential, } } func main() { config := new(credentials.Config). // 認証情報の種類を指定します。値は ecs_ram_role に固定されます。 SetType("ecs_ram_role"). // (オプション) ロール名を指定します。ロール名を指定しない場合、OSS は自動的にロールを取得します。リクエスト数を減らすためにロール名を指定します。 SetRoleName("RoleName") ecsCredential, err := credentials.NewCredential(config) if err != nil { return } provider := NewEcsCredentialsProvider(ecsCredential) // yourEndpoint をバケットのエンドポイントに設定します。たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。他のリージョンについては、実際のエンドポイントを使用してください。 // yourRegion をバケットが配置されているリージョンに設定します。たとえば、バケットが中国 (杭州) リージョンにある場合、リージョンを cn-hangzhou に設定します。他のリージョンについては、実際のリージョンを使用してください。 clientOptions := []oss.ClientOption{oss.SetCredentialsProvider(&provider)} clientOptions = append(clientOptions, oss.Region("yourRegion")) // 署名バージョンを設定します。 clientOptions = append(clientOptions, oss.AuthVersion(oss.AuthV4)) client, err := oss.New("yourEndpoint", "", "", clientOptions...) if err != nil { fmt.Println("Error:", err) os.Exit(-1) } fmt.Printf("client:%#v\n", client) }
方法 5:OIDCRoleARN の使用
ACK のワーカーノードに RAM ロールを設定した後、これらのノード上の Pod 内のアプリケーションは、ECS にデプロイされたアプリケーションと同様に、メタデータサービスを通じて関連付けられたロールのセキュリティトークンサービス (STS) トークンを取得できます。ただし、信頼できないアプリケーションをコンテナークラスターにデプロイする場合、それらがメタデータサービスを通じてワーカーノードに関連付けられたインスタンス RAM ロールの STS トークンを取得することを望まない場合があります。これらの信頼できないアプリケーションが、クラウドリソースのセキュリティを損なうことなく、必要な STS トークンを安全に取得し、アプリケーションレベルで権限を最小限に抑えることを可能にするには、RAM Roles for Service Accounts (RRSA) 機能を使用できます。この方法では、基盤となる認証情報として STS トークンを使用します。Alibaba Cloud コンテナークラスターは、さまざまなアプリケーション Pod に対して対応するサービスアカウント OpenID Connect (OIDC) トークンファイルを作成してマウントし、関連する設定情報を環境変数に注入します。認証情報ツールは、環境変数から設定情報を取得し、STS の AssumeRoleWithOIDC 操作を呼び出して、OIDC トークンをバインドされたロールの STS トークンと交換します。この方法では、AccessKey ペアや STS トークンを提供する必要がないため、手動メンテナンスのリスクが排除されます。詳細については、「RRSA に基づく Pod 権限の分離」をご参照ください。
認証情報の依存関係を追加します。
go get github.com/aliyun/credentials-go/credentials
OIDC の RAM ロールをアクセス認証情報として設定します。
package main import ( "fmt" "os" "github.com/aliyun/aliyun-oss-go-sdk/oss" "github.com/aliyun/credentials-go/credentials" ) type Credentials struct { AccessKeyId string AccessKeySecret string SecurityToken string } type CredentialsProvider struct { cred credentials.Credential } func (credentials *Credentials) GetAccessKeyID() string { return credentials.AccessKeyId } func (credentials *Credentials) GetAccessKeySecret() string { t return credentials.AccessKeySecret } func (credentials *Credentials) GetSecurityToken() string { return credentials.SecurityToken } func (defBuild CredentialsProvider) GetCredentials() oss.Credentials { cred, _ := defBuild.cred.GetCredential() return &Credentials{ AccessKeyId: *cred.AccessKeyId, AccessKeySecret: *cred.AccessKeySecret, SecurityToken: *cred.SecurityToken, } } func NewOIDCRoleARNCredentialsProvider(credential credentials.Credential) CredentialsProvider { return CredentialsProvider{ cred: credential, } } func main() { config := new(credentials.Config). // OIDC トークンを保存するための OIDC トークンのファイルパスを指定します。 SetOIDCTokenFilePath(os.Getenv("ALIBABA_CLOUD_OIDC_TOKEN_FILE")). // デフォルトでは、以下の操作は直接パラメーター値を入力します。環境変数を追加し、os.Getenv("<variable_name>") を使用して対応するパラメーターを設定することもできます。 // 認証情報の種類を指定します。値は oidc_role_arn に固定されます。 SetType("oidc_role_arn"). // OIDC プロバイダーの ARN を指定します。フォーマットは acs:ram::account-id:oidc-provider/provider-name です。 SetOIDCProviderArn("acs:ram::113511544585****:oidc-provider/TestOidcProvider"). // OIDCProviderArn のデフォルト環境変数は ALIBABA_CLOUD_OIDC_PROVIDER_ARN です。 // 異なるトークンを区別するために、カスタムのロールセッション名を指定します。 SetRoleSessionName("role_session_name"). // RoleSessionName のデフォルト環境変数は ALIBABA_CLOUD_ROLE_SESSION_NAME です。 // 引き受けるロールの ARN を指定します。フォーマットは acs:ram::113511544585****:oidc-provider/TestOidcProvider です。 SetRoleArn("acs:ram::113511544585****:role/testoidc"). // RoleArn のデフォルト環境変数は ALIBABA_CLOUD_ROLE_ARN です。 // (オプション) ロールを引き受ける際に使用するポリシーを指定します。 SetPolicy(""). SetSessionExpiration(3600) oidcCredential, err := credentials.NewCredential(config) if err != nil { return } provider := NewOIDCRoleARNCredentialsProvider(oidcCredential) // yourEndpoint をバケットのエンドポイントに設定します。たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。他のリージョンについては、実際のエンドポイントを使用してください。 // yourRegion をバケットが配置されているリージョンに設定します。たとえば、バケットが中国 (杭州) リージョンにある場合、リージョンを cn-hangzhou に設定します。他のリージョンについては、実際のリージョンを使用してください。 clientOptions := []oss.ClientOption{oss.SetCredentialsProvider(&provider)} clientOptions = append(clientOptions, oss.Region("yourRegion")) // 署名バージョンを設定します。 clientOptions = append(clientOptions, oss.AuthVersion(oss.AuthV4)) client, err := oss.New("yourEndpoint", "", "", clientOptions...) if err != nil { fmt.Println("Error:", err) os.Exit(-1) } fmt.Printf("client:%#v\n", client) }
方法 6:Function Compute コンテキストからの認証情報の使用
アプリケーションの関数が Function Compute で実行される場合は、Function Compute コンテキストからの認証情報を使用して認証情報プロバイダーを初期化できます。この方法では、基盤となる認証情報としてセキュリティトークンサービス (STS) トークンを使用します。Function Compute は、関数に設定されたサービスロールを引き受けることで STS トークンを取得し、その STS トークンをコンテキストの Credentials パラメーターを通じてアプリケーションに渡します。STS トークンは 36 時間有効で、変更することはできません。関数の最大実行時間は 24 時間です。したがって、STS トークンは関数実行中に有効期限が切れることはなく、リフレッシュする必要もありません。この方法では、AccessKey ペアや STS トークンを提供する必要がないため、手動メンテナンスのリスクが排除されます。Function Compute に OSS へのアクセス権限を付与する方法については、「関数ロールを使用して Function Compute に他の Alibaba Cloud サービスへのアクセス権限を付与する」をご参照ください。
Function Compute コンテキストの依存関係を追加します。
go get github.com/aliyun/fc-runtime-go-sdk/fc go get github.com/aliyun/fc-runtime-go-sdk/fccontextFunction Compute コンテキストからの認証情報を使用して認証情報プロバイダーを初期化します。
package main import ( "context" "fmt" "github.com/aliyun/aliyun-oss-go-sdk/oss" "github.com/aliyun/fc-runtime-go-sdk/fc" "github.com/aliyun/fc-runtime-go-sdk/fccontext" ) type GetObjectContext struct { OutputRoute string `json:"outputRoute"` OutputToken string `json:"outputToken"` InputOssUrl string `json:"inputOssUrl"` } type StructEvent struct { GetObjectContext GetObjectContext `json:"getObjectContext"` } func HandleRequest(ctx context.Context, event StructEvent) error { endpoint := event.GetObjectContext.OutputRoute fctx, _ := fccontext.FromContext(ctx) client, err := oss.New(endpoint, fctx.Credentials.AccessKeyId, fctx.Credentials.AccessKeySecret, oss.SecurityToken(fctx.Credentials.SecurityToken)) if err != nil { return fmt.Errorf("client new error: %v", err) } fmt.Printf("client:%#v\n", client) return nil } func main() { fc.Start(HandleRequest) }
方法 7:CredentialsURI の使用
アプリケーションが柔軟な認証情報管理とキーレスアクセスのために外部システムから Alibaba Cloud 認証情報を取得する必要がある場合は、CredentialsURI を使用して認証情報プロバイダーを初期化できます。この方法では、基盤となる認証情報としてセキュリティトークンサービス (STS) トークンを使用します。認証情報ツールは、提供された URI から STS トークンを取得して、認証情報クライアントの初期化を完了します。この方法では、AccessKey ペアや STS トークンを提供する必要がないため、手動メンテナンスのリスクが排除されます。CredentialsURI 応答を提供するバックエンドサービスは、アプリケーションが常に有効な認証情報を取得できるように、STS トークンを自動的にリフレッシュするロジックを実装する必要があります。
認証情報ツールが STS トークンを正しく解析して使用できるように、URI は次の応答プロトコルに従う必要があります:
応答状態コード:200
応答本文の構造:
{ "Code": "Success", "AccessKeySecret": "AccessKeySecret", "AccessKeyId": "AccessKeyId", "Expiration": "2021-09-26T03:46:38Z", "SecurityToken": "SecurityToken" }
認証情報の依存関係を追加します。
go get github.com/aliyun/credentials-go/credentialsCredentialsURI をアクセス認証情報として設定します。
package main import ( "fmt" "os" "github.com/aliyun/aliyun-oss-go-sdk/oss" "github.com/aliyun/credentials-go/credentials" ) type Credentials struct { AccessKeyId string AccessKeySecret string SecurityToken string } type CredentialsProvider struct { cred credentials.Credential } func (credentials *Credentials) GetAccessKeyID() string { return credentials.AccessKeyId } func (credentials *Credentials) GetAccessKeySecret() string { return credentials.AccessKeySecret } func (credentials *Credentials) GetSecurityToken() string { return credentials.SecurityToken } func (defBuild CredentialsProvider) GetCredentials() oss.Credentials { cred, _ := defBuild.cred.GetCredential() return &Credentials{ AccessKeyId: *cred.AccessKeyId, AccessKeySecret: *cred.AccessKeySecret, SecurityToken: *cred.SecurityToken, } } func NewCredentialsUriCredentialsProvider(credential credentials.Credential) CredentialsProvider { return CredentialsProvider{ cred: credential, } } func main() { config := new(credentials.Config). // 認証情報の種類を指定します。値は credentials_uri に固定されます。 SetType("credentials_uri"). // URL を指定します。環境変数を設定し、os.Getenv("<variable_name>") を使用してパラメーターを渡すこともできます。 // URLCredential のデフォルト環境変数は ALIBABA_CLOUD_CREDENTIALS_URI です。 SetURLCredential("http://127.0.0.1") uriCredential, err := credentials.NewCredential(config) if err != nil { return } provider := NewCredentialsUriCredentialsProvider(uriCredential) // yourEndpoint をバケットのエンドポイントに設定します。たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。他のリージョンについては、実際のエンドポイントを使用してください。 // yourRegion をバケットが配置されているリージョンに設定します。たとえば、バケットが中国 (杭州) リージョンにある場合、リージョンを cn-hangzhou に設定します。他のリージョンについては、実際のリージョンを使用してください。 clientOptions := []oss.ClientOption{oss.SetCredentialsProvider(&provider)} clientOptions = append(clientOptions, oss.Region("yourRegion")) // 署名バージョンを設定します。 clientOptions = append(clientOptions, oss.AuthVersion(oss.AuthV4)) client, err := oss.New("yourEndpoint", "", "", clientOptions...) if err != nil { fmt.Println("Error:", err) os.Exit(-1) } fmt.Printf("client:%#v\n", client) }
方法 8:自動ローテーションされる AccessKey ペアの使用
アプリケーションが OSS への長期アクセスを必要とするが、AccessKey ペアの漏洩リスクがあり、頻繁な手動ローテーションが必要な環境で実行される場合は、ClientKey を使用して認証情報プロバイダーを初期化できます。この方法では、基盤となる認証情報として AccessKey ペアを使用します。ClientKey を使用すると、Key Management Service (KMS) は RAM ユーザーの管理対象 AccessKey ペアを自動的かつ定期的にローテーションできます。このプロセスにより、RAM ユーザーの静的な AccessKey ペアが動的になり、漏洩のリスクが軽減されます。定期的なローテーションに加えて、KMS は即時ローテーションもサポートしており、漏洩した AccessKey ペアを迅速に置き換えることができます。この方法では、AccessKey ペアを手動でメンテナンスする必要がないため、セキュリティリスクとメンテナンスの複雑さが軽減されます。ClientKey を取得するには、「アプリケーションアクセスポイントの作成」をご参照ください。
go getコマンドを実行して、プロジェクトで認証情報クライアントを使用します。go get -u github.com/aliyun/aliyun-secretsmanager-client-gosecretsmanager.propertiesという名前の設定ファイルを作成します。# アクセス認証情報の種類。 credentials_type=client_key # クライアントキーの復号パスワード。パスワードは環境変数またはファイルから読み取ることができます。 client_key_password_from_env_variable=#your client key private key password environment variable name# client_key_password_from_file_path=#your client key private key password file path# # クライアントキーの秘密鍵ファイルのパス。 client_key_private_key_path=#your client key private key file path# # 関連する KMS サービスのリージョン。 cache_client_region_id=[{"regionId":"#regionId#"}]クライアントをビルドします。
package main import ( "encoding/json" "fmt" "os" "github.com/aliyun/aliyun-oss-go-sdk/oss" "github.com/aliyun/aliyun-secretsmanager-client-go/sdk" ) type defaultCredentials struct { config *oss.Config } func (defCre *defaultCredentials) GetAccessKeyID() string { return defCre.config.AccessKeyID } func (defCre *defaultCredentials) GetAccessKeySecret() string { return defCre.config.AccessKeySecret } func (defCre *defaultCredentials) GetSecurityToken() string { return defCre.config.SecurityToken } type defaultCredentialsProvider struct { config *oss.Config } func (defBuild *defaultCredentialsProvider) GetCredentials() oss.Credentials { return &defaultCredentials{config: defBuild.config} } func NewDefaultCredentialsProvider(accessID, accessKey, token string) (defaultCredentialsProvider, error) { var provider defaultCredentialsProvider if accessID == "" { return provider, fmt.Errorf("access key id is empty!") } if accessKey == "" { return provider, fmt.Errorf("access key secret is empty!") } config := &oss.Config{ AccessKeyID: accessID, AccessKeySecret: accessKey, SecurityToken: token, } return defaultCredentialsProvider{ config, }, nil } func main() { client, err := sdk.NewClient() if err != nil { fmt.Println("Error:", err) os.Exit(-1) } secretInfo, err := client.GetSecretInfo("#secretName#") if err != nil { fmt.Println("Error:", err) os.Exit(-1) } fmt.Printf("SecretValue:%s\n", secretInfo.SecretValue) var m map[string]string err = json.Unmarshal([]byte(secretInfo.SecretValue), &m) if err != nil { fmt.Println("Error decoding JSON:", err) os.Exit(-1) } accessKeyId := m["AccessKeyId"] accessKeySecret := m["AccessKeySecret"] provider, err := NewDefaultCredentialsProvider(accessKeyId, accessKeySecret, "") if err != nil { fmt.Println("Error:", err) os.Exit(-1) } // yourEndpoint をバケットのエンドポイントに設定します。たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。他のリージョンについては、実際のエンドポイントを使用してください。 // yourRegion をバケットが配置されているリージョンに設定します。たとえば、バケットが中国 (杭州) リージョンにある場合、リージョンを cn-hangzhou に設定します。他のリージョンについては、実際のリージョンを使用してください。 clientOptions := []oss.ClientOption{oss.SetCredentialsProvider(&provider)} clientOptions = append(clientOptions, oss.Region("yourRegion")) // 署名バージョンを設定します。 clientOptions = append(clientOptions, oss.AuthVersion(oss.AuthV4)) ossClient, err := oss.New("yourEndpoint", "", "", clientOptions...) if err != nil { fmt.Println("Error:", err) os.Exit(-1) } fmt.Printf("client:%#v\n", ossClient) }
方法 9:アクセス認証情報のカスタマイズ
上記の認証情報設定方法のいずれも要件を満たさない場合は、Credential Providers インターフェイスを実装することで認証情報プロバイダーをカスタマイズできます。
package main
import (
"fmt"
"os"
"github.com/aliyun/aliyun-oss-go-sdk/oss"
)
type CustomerCredentialsProvider struct {
config *oss.Config
}
func NewCustomerCredentialsProvider() CustomerCredentialsProvider {
return CustomerCredentialsProvider{}
}
func (s CustomerCredentialsProvider) GetCredentials() oss.Credentials {
// 長期的な認証情報を返します。
config := &oss.Config{
AccessKeyID: "id",
AccessKeySecret: "secret",
}
return &CustomerCredentialsProvider{
config,
}
// 一時的な認証情報を返します。
//config := &oss.Config{
// AccessKeyID: "id",
// AccessKeySecret: "secret",
// SecurityToken: "token",
//}
//return &CustomerCredentialsProvider{
// config,
//}
}
func (s *CustomerCredentialsProvider) GetAccessKeyID() string {
return s.config.AccessKeyID
}
func (s *CustomerCredentialsProvider) GetAccessKeySecret() string {
return s.config.AccessKeySecret
}
func (s *CustomerCredentialsProvider) GetSecurityToken() string {
return s.config.SecurityToken
}
func main() {
provider := NewCustomerCredentialsProvider()
// yourEndpoint をバケットのエンドポイントに設定します。たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。他のリージョンについては、実際のエンドポイントを使用してください。
// yourRegion をバケットが配置されているリージョンに設定します。たとえば、バケットが中国 (杭州) リージョンにある場合、リージョンを cn-hangzhou に設定します。他のリージョンについては、実際のリージョンを使用してください。
clientOptions := []oss.ClientOption{oss.SetCredentialsProvider(&provider)}
clientOptions = append(clientOptions, oss.Region("yourRegion"))
// 署名バージョンを設定します。
clientOptions = append(clientOptions, oss.AuthVersion(oss.AuthV4))
client, err := oss.New("yourEndpoint", "", "", clientOptions...)
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
fmt.Printf("client:%#v\n", client)
}
次のステップ
アクセス認証情報を設定した後、OSSClient を初期化する必要があります。詳細については、「クライアントの設定 (Go SDK V1)」をご参照ください。