Object Storage Service (OSS) SDK for Goを使用してリクエストを開始するには、アクセス資格情報を設定する必要があります。 Alibaba Cloudサービスは、アクセス資格情報を使用してID情報とアクセス許可を検証します。 認証と承認の要件に基づいて、さまざまなタイプのアクセス資格情報を選択できます。 このトピックでは、一時的および長期的なアクセス資格情報を設定する方法について説明します。
前提条件
OSS SDK for Goがインストールされています。 詳細については、「インストール」をご参照ください。
初期化方法の選択
資格情報プロバイダーの選択
OSSは、資格情報プロバイダーを初期化する複数の方法をサポートしています。 実際のシナリオの認証と承認の要件に基づいて、適切な方法を選択できます。
初期化メソッド | シナリオ | AccessKeyペアまたはセキュリティトークンが必要 | 基本的なロジック | 資格情報の有効期間 | 資格情報のローテーションまたは更新方法 |
アプリケーションは、外部からの攻撃に対して脆弱ではなく、頻繁な資格情報のローテーションなしに長期間クラウドサービスにアクセスする必要がある、安全で安定した環境でデプロイおよび実行されます。 | 必須 | AccessKey ペア | 長期 | 手動ローテーション | |
アプリケーションは信頼できない環境でデプロイされ、実行されます。この場合、資格情報の有効期間とアクセス可能なリソースを管理します。 | 必須 | セキュリティトークン | 一時的 | 手動更新 | |
アプリケーションは、クロスアカウントアクセスなどのクラウドサービスへのアクセスを許可されている必要があります。 | 必須 | セキュリティトークン | 一時的 | 自動更新 | |
アプリケーションは、Elastic Compute Service (ECS) インスタンス、elasticコンテナインスタンス、およびcontainer Service for Kubernetes (ACK) ワーカーノードでデプロイされ、実行されます。 | 選択可能 | セキュリティトークン | 一時的 | 自動更新 | |
信頼できないアプリケーションは、ACKワーカーノードにデプロイされ、実行されます。 | 選択可能 | セキュリティトークン | 一時的 | 自動更新 | |
アプリケーションの関数はFunction Computeにデプロイされ、実行されます。 | 選択可能 | セキュリティトークン | 一時的 | 更新する必要はありません | |
アプリケーションには、外部システムからのアクセス資格情報が必要です。 | 選択可能 | セキュリティトークン | 一時的 | 自動更新 | |
アプリケーションは、AccessKeyペアが漏洩のリスクが高く、クラウドサービスに長期間アクセスするためにアクセス資格情報を頻繁にローテーションする必要がある環境でデプロイおよび実行されます。 | 選択可能 | AccessKey ペア | 長期 | 自動回転 | |
上記の方法のいずれも要件を満たしていない場合は、カスタム方法を指定してアクセス資格情報を取得できます。 | Custom | Custom | Custom | Custom |
方法1: AccessKeyペアの使用
アプリケーションが、外部攻撃に対して脆弱ではなく、OSSへの長期アクセスを必要とする安全で安定した環境にデプロイされている場合、Alibaba CloudアカウントまたはRAMユーザーのAccessKeyペアを使用して、認証情報プロバイダーを初期化できます。 AccessKeyペアは、AccessKey IDとAccessKeyシークレットで構成されます。 この方法では、AccessKeyペアを手動で維持する必要があることに注意してください。 これにより、セキュリティリスクが生じ、メンテナンスが複雑になります。 AccessKeyペアを取得する方法の詳細については、「CreateAccessKey」をご参照ください。
環境変数
Alibaba Cloudアカウントは、アカウントのすべてのリソースにフルアクセスできます。 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() { // Obtain access credentials from environment variables. Before you run the sample code, make sure that the OSS_ACCESS_KEY_ID and OSS_ACCESS_KEY_SECRET environment variables are configured. provider, err := oss.NewEnvironmentVariableCredentialsProvider() if err != nil { fmt.Println("Error:", err) os.Exit(-1) } // Create an OSSClient instance. // Specify the endpoint of the region in which the bucket is located. For example, if the bucket is located in the China (Hangzhou) region, set the endpoint to https://oss-cn-hangzhou.aliyuncs.com. Specify your actual endpoint. // Specify the region in which the bucket is located. For example, if the bucket is located in the China (Hangzhou) region, set the region to cn-hangzhou. Specify the actual region. clientOptions := []oss.ClientOption{oss.SetCredentialsProvider(&provider)} clientOptions = append(clientOptions, oss.Region("yourRegion")) // Specify the version of the signature algorithm. 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-iniライブラリをインストールするには、次のコマンドを実行します。
go get -u github.com/go-ini/ini
config.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) } // Specify the endpoint of the region in which the bucket is located. For example, if the bucket is located in the China (Hangzhou) region, set the endpoint to https://oss-cn-hangzhou.aliyuncs.com. Specify your actual endpoint. // Specify the region in which the bucket is located. For example, if the bucket is located in the China (Hangzhou) region, set the region to cn-hangzhou. Specify the actual region. clientOptions := []oss.ClientOption{oss.SetCredentialsProvider(&provider)} clientOptions = append(clientOptions, oss.Region("yourRegion")) // Specify the version of the signature algorithm. 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: セキュリティトークンの使用
アプリケーションがOSSに一時的にアクセスする必要がある場合は、security token Service (STS) から取得したAccessKeyペアとセキュリティトークンで構成される一時的なアクセス資格情報を使用して、資格情報プロバイダーを初期化できます。 この方法では、セキュリティトークンを手動で管理する必要があることに注意してください。 これにより、セキュリティリスクが生じ、メンテナンスが複雑になります。 OSSに複数回アクセスする場合は、セキュリティトークンを手動で更新する必要があります。 セキュリティトークンの取得方法の詳細については、「AssumeRole」をご参照ください。
環境変数
一時的なアクセス資格情報を使用して環境変数を指定します。
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() { // Obtain access credentials from environment variables. Before you run the sample code, make sure that the OSS_ACCESS_KEY_ID, OSS_ACCESS_KEY_SECRET, and OSS_SESSION_TOKEN environment variables are configured. provider, err := oss.NewEnvironmentVariableCredentialsProvider() if err != nil { fmt.Println("Error:", err) os.Exit(-1) } // Create an OSSClient instance. // Specify the endpoint of the region in which the bucket is located. For example, if the bucket is located in the China (Hangzhou) region, set the endpoint to https://oss-cn-hangzhou.aliyuncs.com. Specify your actual endpoint. // Specify the region in which the bucket is located. For example, if the bucket is located in the China (Hangzhou) region, set the region to cn-hangzhou. Specify the actual region. clientOptions := []oss.ClientOption{oss.SetCredentialsProvider(&provider)} clientOptions = append(clientOptions, oss.Region("yourRegion")) // Specify the version of the signature algorithm. 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-iniライブラリをインストールするには、次のコマンドを実行します。
go get -u github.com/go-ini/ini
config.ini
という名前の設定ファイルを作成します。[credentials] alibaba_cloud_access_key_id = <ALIBABA_CLOUD_ACCESS_KEY_ID> alibaba_cloud_access_key_secret = <ALIBABA_CLOUD_ACCESS_KEY_SECRET> alibaba_cloud_security_token = <ALIBABA_CLOUD_SECURITY_TOKEN>
設定ファイルを使用して資格情報を渡します。
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() token := cfg.Section("credentials").Key("alibaba_cloud_security_token").String() provider, err := NewDefaultCredentialsProvider(accessKeyID, accessKeySecret, token) if err != nil { fmt.Println("Error:", err) os.Exit(-1) } // Specify the endpoint of the region in which the bucket is located. For example, if the bucket is located in the China (Hangzhou) region, set the endpoint to https://oss-cn-hangzhou.aliyuncs.com. Specify your actual endpoint. // Specify the region in which the bucket is located. For example, if the bucket is located in the China (Hangzhou) region, set the region to cn-hangzhou. Specify the actual region. clientOptions := []oss.ClientOption{oss.SetCredentialsProvider(&provider)} clientOptions = append(clientOptions, oss.Region("yourRegion")) // Specify the version of the signature algorithm. 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へのアクセスを許可されている必要がある場合、たとえば、別のAlibaba CloudアカウントのOSSリソースにアクセスする場合、RAMRoleARNを使用して資格情報プロバイダーを初期化できます。 この方法の基本的なロジックは、STSから取得したセキュリティトークンを使用してアクセス資格情報を設定することです。 RAMロールのAlibaba Cloud Resource Name (ARN) を指定すると、CredentialsツールはSTSからセキュリティトークンを取得し、セッションの有効期限が切れる前にセキュリティトークンを自動的に更新します。 policy
パラメーターに値を割り当てて、RAMロールの権限を制限できます。 この方法では、AccessKeyペアとセキュリティトークンを手動で提供する必要があることに注意してください。 これにより、セキュリティリスクが生じ、メンテナンスが複雑になります。 AccessKeyペアまたはセキュリティトークンを取得する方法の詳細については、「CreateAccessKey」または「AssumeRole」をご参照ください。 RAMロールARNを取得する方法の詳細については、「CreateRole」をご参照ください。
AccessKeyペアとRAMRoleARNの使用
資格情報の依存関係を追加します。
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). // Set the credential type to ram_role_arn. SetType("ram_role_arn"). // Obtain the AccessKey ID and AccessKey secret of the RAM user from the environment variables. SetAccessKeyId(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_ID")). SetAccessKeySecret(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET")). // By default, the values of the parameters are directly entered for the following operations. You can also add environment variables and use os.Getenv("<variable name>") to specify the corresponding parameters. // Obtain the ARN of the RAM role from the environment variable, which is the ID of the RAM role to be assumed. Format: acs:ram::$accountID:role/$roleName. SetRoleArn("ALIBABA_CLOUD_ROLE_ARN"). // By default, the canonical name of the RoleArn environment variable is ALIBABA_CLOUD_ROLE_ARN. // Specify a custom session name for the role to distinguish different tokens. SetRoleSessionName("ALIBABA_CLOUD_ROLE_SESSION_NAME"). // RoleSessionName default environment variable canonical name ALIBABA_CLOUD_ROLE_SESSION_NAME // (Optional) Specify the permissions of the security token. SetPolicy(""). // (Optional) Specify the validity period of the security token. SetRoleSessionExpiration(3600) arnCredential, err := credentials.NewCredential(config) if err != nil { fmt.Println("Error:", err) os.Exit(-1) } provider := NewRamRoleArnCredentialsProvider(arnCredential) // Specify the endpoint of the region in which the bucket is located. For example, if the bucket is located in the China (Hangzhou) region, set the endpoint to https://oss-cn-hangzhou.aliyuncs.com. Specify your actual endpoint. // Specify the region in which the bucket is located. For example, if the bucket is located in the China (Hangzhou) region, set the region to cn-hangzhou. Specify the actual region. clientOptions := []oss.ClientOption{oss.SetCredentialsProvider(&provider)} clientOptions = append(clientOptions, oss.Region("yourRegion")) // Specify the version of the signature algorithm. 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インスタンス、エラスティックコンテナインスタンス、またはACKワーカーノードで実行されている場合、ECSRAMRoleを使用して資格情報プロバイダーを初期化することを推奨します。 この方法の基本的なロジックは、STSから取得したセキュリティトークンを使用してアクセス資格情報を設定することです。 ECSRAMRoleを使用すると、ECSインスタンス、エラスティックコンテナインスタンス、またはACKワーカーノードにRAMロールをアタッチして、インスタンスのセキュリティトークンを自動的に更新できます。 この方法では、AccessKeyペアまたはセキュリティトークンを手動で管理する場合に発生するリスクを排除します。 ECSRAMRoleロールの取得方法の詳細については、「CreateRole」をご参照ください。
資格情報の依存関係を追加します。
go get github.com/aliyun/credentials-go/credentials
アクセス資格情報としてECSRAMRoleを設定します。
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). // Set the credential type to ecs_ram_role. SetType("ecs_ram_role"). // (Optional) Specify the role name. If you do not specify the role name, OSS automatically generates a role name. We recommend that you specify a role name to reduce the number of requests. SetRoleName("RoleName") ecsCredential, err := credentials.NewCredential(config) if err != nil { return } provider := NewEcsCredentialsProvider(ecsCredential) // Specify the endpoint of the region in which the bucket is located. For example, if the bucket is located in the China (Hangzhou) region, set the endpoint to https://oss-cn-hangzhou.aliyuncs.com. Specify your actual endpoint. // Specify the region in which the bucket is located. For example, if the bucket is located in the China (Hangzhou) region, set the region to cn-hangzhou. Specify the actual region. clientOptions := []oss.ClientOption{oss.SetCredentialsProvider(&provider)} clientOptions = append(clientOptions, oss.Region("yourRegion")) // Specify the version of the signature algorithm. 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ロールを設定すると、ノードのポッド内のアプリケーションは、ECSインスタンスにデプロイされたアプリケーションと同じ方法でメタデータサーバーを使用して、アタッチされたロールのセキュリティトークンを取得できます。 ただし、信頼されていないアプリケーション (顧客によって送信され、コードを使用できないアプリケーションなど) がワーカーノードにデプロイされている場合、アプリケーションがメタデータサーバーを使用してワーカーノードにアタッチされているRAMロールのセキュリティトークンを取得することはできません。 クラウドリソースのセキュリティを確保し、信頼できないアプリケーションが必要なセキュリティトークンを安全に取得できるようにし、アプリケーションレベルの権限を最小限に抑えるために、サービスアカウントのRAMロール (RRSA) 機能を使用できます。 この方法の基本的なロジックは、STSから取得したセキュリティトークンを使用してアクセス資格情報を設定することです。 ACKは、さまざまなアプリケーションポッドの対応するOpenID Connect (OIDC) トークンファイルを作成およびマウントし、関連する構成情報を環境変数に渡します。 資格情報ツールは、環境変数の構成情報を取得し、STSのAssumeRoleWithOIDC操作を呼び出して、アタッチされたロールのセキュリティトークンを取得します。 この方法では、AccessKeyペアまたはセキュリティトークンを手動で管理する場合に発生するリスクを排除します。 詳細については、「RRSAを使用して異なるポッドに異なるクラウドサービスへのアクセスを許可する」をご参照ください。
資格情報の依存関係を追加します。
go get github.com/aliyun/credentials-go/credentials
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 { 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). // Specify the path of the file that contains the OIDC token. SetOIDCTokenFilePath(os.Getenv("ALIBABA_CLOUD_OIDC_TOKEN_FILE")). // By default, the values of the parameters are directly entered for the following operations. You can also add environment variables and use os.Getenv("<variable name>") to specify the corresponding parameters. // Set the credential type to oidc_role_arn. SetType("oidc_role_arn"). // Specify the ARN of the OIDC IdP. The ARN is in the acs:ram::account-id:oidc-provider/provider-name format. SetOIDCProviderArn("acs:ram::113511544585****:oidc-provider/TestOidcProvider"). // By default, the canonical name of the OIDCProviderArn environment variable is ALIBABA_CLOUD_OIDC_PROVIDER_ARN // Specify a custom session name for the role to distinguish different tokens. SetRoleSessionName("role_session_name"). // By default, the canonical name of the RoleSessionName environment variable is ALIBABA_CLOUD_ROLE_SESSION_NAME // Specify the ARN of the RAM role, which is the ID of the RAM role to be assumed. Format: acs:ram::113511544585****:oidc-provider/TestOidcProvider. SetRoleArn("acs:ram::113511544585****:role/testoidc"). // By default, the canonical name of the RoleArn environment variable is ALIBABA_CLOUD_ROLE_ARN // (Optional) Specify the policy of the RAM role. SetPolicy(""). SetSessionExpiration(3600) oidcCredential, err := credentials.NewCredential(config) if err != nil { return } provider := NewOIDCRoleARNCredentialsProvider(oidcCredential) // Specify the endpoint of the region in which the bucket is located. For example, if the bucket is located in the China (Hangzhou) region, set the endpoint to https://oss-cn-hangzhou.aliyuncs.com. Specify your actual endpoint. // Specify the region in which the bucket is located. For example, if the bucket is located in the China (Hangzhou) region, set the region to cn-hangzhou. Specify the actual region. clientOptions := []oss.ClientOption{oss.SetCredentialsProvider(&provider)} clientOptions = append(clientOptions, oss.Region("yourRegion")) // Specify the version of the signature algorithm. 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のコンテキストでCredentialsパラメーターを使用する
アプリケーションの関数がfunction Computeにデプロイされて実行されている場合、Function ComputeのコンテキストでCredentialsパラメーターを使用して、資格情報プロバイダーを初期化できます。 この方法の基本的なロジックは、STSから取得したセキュリティトークンを使用してアクセス資格情報を設定することです。 Function Computeは、関数に設定されたロールに基づいてサービスロールを引き受けることによってセキュリティトークンを取得します。 次に、Function ComputeのコンテキストでCredentialsパラメーターを使用して、セキュリティトークンがアプリケーションに渡されます。 セキュリティトークンは36時間有効です。 有効期間は変更できません。 関数の最大実行時間は24時間です。 したがって、関数の実行時に有効期限が切れないため、セキュリティトークンを更新する必要はありません。 この方法では、AccessKeyペアまたはセキュリティトークンを手動で管理する場合に発生するリスクを排除します。 Function ComputeにOSSへのアクセスを許可する方法の詳細については、「他のAlibaba Cloudサービスへのアクセス権限の付与」をご参照ください。
Function Computeのコンテキスト依存関係を追加します。
go get github.com/aliyun/fc-runtime-go-sdk/fc go get github.com/aliyun/fc-runtime-go-sdk/fccontext
Function ComputeコンテキストのCredentialsパラメーターを使用して、資格情報プロバイダーを初期化します。
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から取得したセキュリティトークンを使用してアクセス資格情報を設定することです。 Credentialsツールは、クライアントでOSSClientインスタンスを初期化するために指定したURIを使用してセキュリティトークンを取得します。 この方法では、AccessKeyペアまたはセキュリティトークンを手動で管理する場合に発生するリスクを排除します。 CredentialsURI応答を提供するバックエンドサービスは、アプリケーションが常に有効な資格情報を取得できるように、セキュリティトークンを自動的に更新する必要があることに注意してください。
資格情報ツールがセキュリティトークンを正しく解析して使用できるようにするには、URIが次の応答プロトコルに準拠している必要があります。
応答ステータスコード: 200
レスポンスボディの構造:
{ "Code": "Success", "AccessKeySecret": "AccessKeySecret", "AccessKeyId": "AccessKeyId", "Expiration": "2021-09-26T03:46:38Z", "SecurityToken": "SecurityToken" }
資格情報の依存関係を追加します。
go get github.com/aliyun/credentials-go/credentials
アクセス資格情報としてCredentialsURIを設定します。
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). // Set the credential type to credentials_uri. SetType("credentials_uri"). // Specify the URL. You can also specify environment variables and use os.Getenv(<variable name>) to pass parameters. // By default, the canonical name of the URLCredential environment variable is ALIBABA_CLOUD_CREDENTIALS_URI. SetURLCredential("http://127.0.0.1") uriCredential, err := credentials.NewCredential(config) if err != nil { return } provider := NewCredentialsUriCredentialsProvider(uriCredential) // Specify the endpoint of the region in which the bucket is located. For example, if the bucket is located in the China (Hangzhou) region, set the endpoint to https://oss-cn-hangzhou.aliyuncs.com. Specify your actual endpoint. // Specify the region in which the bucket is located. For example, if the bucket is located in the China (Hangzhou) region, set the region to cn-hangzhou. Specify the actual region. clientOptions := []oss.ClientOption{oss.SetCredentialsProvider(&provider)} clientOptions = append(clientOptions, oss.Region("yourRegion")) // Specify the version of the signature algorithm. 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ペアのリークのリスクに直面している場合は、AccessKeyペアを手動でローテーションする必要があります。 この場合、クライアントキーを使用して資格情報プロバイダーを初期化できます。 この方法の基本的なロジックは、AccessKeyペアを使用してOSSリソースにアクセスすることです。 クライアントキーを使用すると、key Management Service (KMS) は、マネージRAMユーザーのAccessKeyペアを自動的かつ定期的にローテーションし、RAMユーザーの静的AccessKeyペアを動的に変更できます。 これにより、AccessKeyペアがリークするリスクが軽減されます。 KMSは、漏洩したAccessKeyペアを迅速に置き換えるための即時ローテーションもサポートしています。 これにより、AccessKeyペアを手動で保守する必要がなくなり、セキュリティリスクと保守の複雑さが軽減されます。 クライアントキーの取得方法の詳細については、「AAPの作成」をご参照ください。
プロジェクトでシークレットクライアントを使用するには、
go get
コマンドを実行します。go get -u github.com/aliyun/aliyun-secretsmanager-client-go
secretsmanager.properties
という名前の構成ファイルを作成します。# Specify the access credential type. credentials_type=client_key # Specify the password of the client key. You can obtain the password from environment variables or files. 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# # Specify the path of the private key file of the client key. client_key_private_key_path=#your client key private key file path# # Specify the ID of the region in which you want to use 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) } // Specify the endpoint of the region in which the bucket is located. For example, if the bucket is located in the China (Hangzhou) region, set the endpoint to https://oss-cn-hangzhou.aliyuncs.com. Specify your actual endpoint. // Specify the region in which the bucket is located. For example, if the bucket is located in the China (Hangzhou) region, set the region to cn-hangzhou. Specify the actual region. clientOptions := []oss.ClientOption{oss.SetCredentialsProvider(&provider)} clientOptions = append(clientOptions, oss.Region("yourRegion")) // Specify the version of the signature algorithm. 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: カスタムアクセス資格情報を使用する
上記のメソッドのいずれも要件を満たしていない場合は、CredentialsProvider操作を呼び出して、アクセス資格情報を取得するカスタムメソッドを指定できます。
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 {
// Return long-term credentials.
config := &oss.Config{
AccessKeyID: "id",
AccessKeySecret: "secret",
}
return &CustomerCredentialsProvider{
config,
}
// Return temporary credentials.
//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()
// Specify the endpoint of the region in which the bucket is located. For example, if the bucket is located in the China (Hangzhou) region, set the endpoint to https://oss-cn-hangzhou.aliyuncs.com. Specify your actual endpoint.
// Specify the region in which the bucket is located. For example, if the bucket is located in the China (Hangzhou) region, set the region to cn-hangzhou. Specify the actual region.
clientOptions := []oss.ClientOption{oss.SetCredentialsProvider(&provider)}
clientOptions = append(clientOptions, oss.Region("yourRegion"))
// Specify the version of the signature algorithm.
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インスタンスを初期化する必要があります。 詳細については、「初期化」をご参照ください。