すべてのプロダクト
Search
ドキュメントセンター

Object Storage Service:OSS SDK for Goのアクセス資格情報の設定

最終更新日:Dec 10, 2024

Object Storage Service (OSS) SDK for Goを使用してリクエストを開始するには、アクセス資格情報を設定する必要があります。 Alibaba Cloudサービスは、アクセス資格情報を使用してID情報とアクセス許可を検証します。 認証と承認の要件に基づいて、さまざまなタイプのアクセス資格情報を選択できます。 このトピックでは、一時的なアクセス資格情報と長期的なアクセス資格情報を設定する方法について説明します。

初期化方法の選択

資格情報プロバイダー

OSSは、資格情報プロバイダーを初期化する複数の方法をサポートしています。 実際のシナリオの認証と承認の要件に基づいて、適切な方法を選択できます。

初期化メソッド

シナリオ

AccessKeyペアまたはセキュリティトークンが必要

基礎となる資格

資格情報の有効期間

資格情報のローテーションまたは更新方法

方法1: AccessKeyペアの使用

アプリケーションは、外部からの攻撃に対して脆弱ではなく、頻繁な資格情報のローテーションなしに長期間クラウドサービスにアクセスする必要がある、安全で安定した環境でデプロイおよび実行されます。

AK

長期

手動ローテーション

方法2: セキュリティトークンの使用

アプリケーションは信頼できない環境で展開され、実行されます。この場合、資格情報の有効性とアクセス可能なリソースを管理します。

STS Token

一時的

手動更新

方法3: RAMRoleARNを使用する

アプリケーションは、クラウドサービスへのアクセスを許可される必要があります。 たとえば、この方法を使用して、OSSへのクロスアカウントアクセスを許可できます。

STS Token

一時的

自動更新

方法4: ECSRAMRoleの使用

アプリケーションは、Elastic Compute Service (ECS) インスタンス、elasticコンテナインスタンス、およびcontainer Service for Kubernetes (ACK) ワーカーノードでデプロイされ、実行されます。

不可

STS Token

一時的

自動更新

方法5: OIDCRoleARNを使用する

信頼できないアプリケーションは、ACKワーカーノードにデプロイされ、実行されます。

不可

STS Token

一時的

自動更新

方法6: カスタム資格情報プロバイダーの指定

上記の方法のいずれも要件を満たしていない場合は、カスタム方法を使用してアクセス資格情報を取得できます。

Custom

Custom

Custom

Custom

方法1: 方法1: AccessKeyペアの使用

アプリケーションが、外部攻撃に対して脆弱ではなく、OSSへの長期アクセスを必要とする安全で安定した環境にデプロイされている場合、Alibaba CloudアカウントまたはRAMユーザーのAccessKeyペアを使用して、認証情報プロバイダーを初期化できます。 AccessKeyペアは、AccessKey IDとAccessKeyシークレットで構成されます。 この方法では、AccessKeyペアを手動で維持する必要があることに注意してください。 これにより、セキュリティリスクが生じ、メンテナンスが複雑になります。 AccessKeyペアを取得する方法の詳細については、「CreateAccessKey」をご参照ください。

環境変数

警告

Alibaba Cloudアカウントには、アカウント内のリソースに対する完全な権限があります。 Alibaba CloudアカウントのAccessKeyペアの漏洩は、重大なセキュリティ上の脅威をもたらします。 したがって、資格情報プロバイダーを初期化するために必要最小限の権限が付与されているRAMユーザーのAccessKeyペアを使用することをお勧めします。

  1. 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>
  2. 環境変数を使用して資格情報を渡します。

    package main
    
    import (
    	"log"
    
    	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
    	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
    )
    
    func main() {
    	// Specify the ID of the region in which the bucket is located based on your business requirements. For example, if the bucket is located in the China (Hangzhou) region, set the region ID to cn-hangzhou.
    	region := "cn-hangzhou"
    
    	// Obtain access credentials from environment variables. Before you execute the sample code, make sure that the OSS_ACCESS_KEY_ID and OSS_ACCESS_KEY_SECRET environment variables are configured.
    	provider := credentials.NewEnvironmentVariableCredentialsProvider()
    
    	// Load the default configurations and specify the credential provider and region.
    	cfg := oss.LoadDefaultConfig().
    		WithCredentialsProvider(provider).
    		WithRegion(region)
    
    	// Create an OSS client.
    	client := oss.NewClient(cfg)
    	log.Printf("ossclient: %v", client)
    }
    

静的な資格情報

コード内の変数を使用してアクセス資格情報を定義できます。 コードの実行中、これらの変数には、環境変数、構成ファイル、またはその他の外部の場所から取得した実際の資格情報の値が入力されます。

次の手順では、構成ファイルを使用して資格情報を提供する方法について説明します。

説明

go-iniライブラリをインストールする必要があります。 go-iniライブラリをインストールするには、次のコマンドを実行します。

go get -u github.com/go-ini/ini
  1. config.iniという名前の設定ファイルを作成します。

    [credentials]
    alibaba_cloud_access_key_id = <ALIBABA_CLOUD_ACCESS_KEY_ID>
    alibaba_cloud_access_key_secret = <ALIBABA_CLOUD_ACCESS_KEY_SECRET>
  2. 設定ファイルを使用して資格情報を渡します。

    package main
    
    import (
    	"log"
    
    	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
    	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
    	"gopkg.in/ini.v1"
    )
    
    func main() {
    	// Specify the ID of the region in which the bucket is located based on your business requirements. For example, if the bucket is located in the China (Hangzhou) region, set the region ID to cn-hangzhou.
    	region := "cn-hangzhou"
    
    	// Read the configuration file.
    	cfgFile, err := ini.Load("config.ini")
    	if err != nil {
    		log.Fatalf("Failed to load config file: %v", err)
    	}
    
    	// Obtain the configurations.
    	accessKeyID := cfgFile.Section("oss").Key("alibaba_cloud_access_key_id").String()
    	accessKeySecret := cfgFile.Section("oss").Key("alibaba_cloud_access_key_secret").String()
    
    	// Create a credential provider.
    	provider := credentials.NewStaticCredentialsProvider(accessKeyID, accessKeySecret)
    
    	// Load the default configurations and specify the credential provider and region.
    	cfg := oss.LoadDefaultConfig().
    		WithCredentialsProvider(provider).
    		WithRegion(region)
    
    	// Create an OSS client.
    	client := oss.NewClient(cfg)
    
    	log.Printf("ossclient: %v", client)
    }
    

方法2: セキュリティトークンの使用

アプリケーションがOSSに一時的にアクセスする必要がある場合は、security token Service (STS) から取得した、AccessKeyペアとセキュリティトークンで構成される一時的なアクセス資格情報を使用できます。 この方法では、セキュリティトークンを手動で管理する必要があることに注意してください。 これにより、セキュリティリスクが生じ、メンテナンスが複雑になります。 OSSに複数回アクセスする場合は、セキュリティトークンを手動で更新する必要があります。 セキュリティトークンの取得方法の詳細については、「AssumeRole」をご参照ください。

  1. 一時的なアクセス資格情報を使用して、環境変数を指定します。

    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>
  2. 環境変数を使用して資格情報を渡します。

    package main
    
    import (
    	"log"
    
    	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
    	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
    )
    
    func main() {
    	// Specify the ID of the region in which the bucket is located based on your business requirements. For example, if the bucket is located in the China (Hangzhou) region, set the region ID to cn-hangzhou.
    	region := "cn-hangzhou"
    
    	// 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 := credentials.NewEnvironmentVariableCredentialsProvider()
    
    	// Load the default configurations and specify the credential provider and region.
    	cfg := oss.LoadDefaultConfig().
    		WithCredentialsProvider(provider).
    		WithRegion(region)
    
    	// Create an OSS client.
    	client := oss.NewClient(cfg)
    	log.Printf("ossclient: %v", client)
    }
    

方法3: RAMRoleARNを使用する

アプリケーションが別のAlibaba CloudアカウントのOSSリソースへのアクセスを必要とする場合など、アプリケーションにOSSへのアクセスを許可する必要がある場合は、RAMRoleARNを使用して資格情報プロバイダーを初期化できます。 この方法の基本的なロジックは、STSから取得したセキュリティトークンを使用してアクセス資格情報を設定することです。 RAMロールの指定されたAlibaba Cloud Resource Name (ARN) を使用することにより、CredentialsツールはSTSからセキュリティトークンを取得し、セッションの有効期限が切れる前にセキュリティトークンを自動的に更新します。 Policyパラメーターを指定して、RAMロールに付与される権限を制限できます。 この方法ではAccessKeyペアが必要であるため、セキュリティリスクが高くなり、メンテナンスが複雑になります。 AccessKeyペアを取得する方法の詳細については、「CreateAccessKey」をご参照ください。 RAMロールのARNを取得する方法の詳細については、「CreateRole」をご参照ください。

  1. 資格情報の依存関係を追加します。

    go get github.com/aliyun/credentials-go/credentials
  2. アクセス資格情報を設定します。

    package main
    
    import (
    	"context"
    	"log"
    	"os"
    
    	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
    	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
    	openapicred "github.com/aliyun/credentials-go/credentials"
    )
    
    func main() {
    	// Specify the ID of the region in which the bucket is located based on your business requirements. For example, if the bucket is located in the China (Hangzhou) region, set the region ID to cn-hangzhou.
    	region := "cn-hangzhou"
    
    	config := new(openapicred.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"). // By default, the canonical name of the RoleSessionName environment variable is ALIBABA_CLOUD_ROLE_SESSION_NAME.
    		// Optional. Specify the permissions of the security token.
    		SetPolicy("Policy").
    		// Optional. Specify the validity period of the security token.
    		SetRoleSessionExpiration(3600)
    
    	arnCredential, gerr := openapicred.NewCredential(config)
    	provider := credentials.CredentialsProviderFunc(func(ctx context.Context) (credentials.Credentials, error) {
    		if gerr != nil {
    			return credentials.Credentials{}, gerr
    		}
    		cred, err := arnCredential.GetCredential()
    		if err != nil {
    			return credentials.Credentials{}, err
    		}
    		return credentials.Credentials{
    			AccessKeyID:     *cred.AccessKeyId,
    			AccessKeySecret: *cred.AccessKeySecret,
    			SecurityToken:   *cred.SecurityToken,
    		}, nil
    	})
    
    	// Load the default configurations and specify the credential provider and region.
    	cfg := oss.LoadDefaultConfig().
    		WithCredentialsProvider(provider).
    		WithRegion(region)
    
    	// Create an OSS client.
    	client := oss.NewClient(cfg)
    	log.Printf("ossclient: %v", client)
    }
    

方法4: ECSRAMRoleを使用する

アプリケーションがECSインスタンス、エラスティックコンテナインスタンス、またはACKワーカーノードで実行されている場合、ECSRAMRoleを使用して資格情報プロバイダーを初期化することを推奨します。 この方法の基本的なロジックは、STSから取得したセキュリティトークンを使用してアクセス資格情報を設定することです。 ECSRAMRoleを使用すると、ECSインスタンス、エラスティックコンテナインスタンス、またはACKワーカーノードにRAMロールをアタッチして、インスタンスのセキュリティトークンを自動的に更新できます。 この方法では、AccessKeyペアまたはセキュリティトークンを手動で管理する場合に発生するリスクを排除します。 ECSRAMRoleの取得方法の詳細については、「CreateRole」をご参照ください。

  1. 資格情報の依存関係を追加します。

    go get github.com/aliyun/credentials-go/credentials
  2. アクセス資格情報を設定します。

    package main
    
    import (
    	"context"
    	"log"
    
    	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
    	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
    	openapicred "github.com/aliyun/credentials-go/credentials"
    )
    
    func main() {
    	// Specify the ID of the region in which the bucket is located based on your business requirements. For example, if the bucket is located in the China (Hangzhou) region, set the region ID to cn-hangzhou.
    	region := "cn-hangzhou"
    
    	config := new(openapicred.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")
    
    	arnCredential, gerr := openapicred.NewCredential(config)
    	provider := credentials.CredentialsProviderFunc(func(ctx context.Context) (credentials.Credentials, error) {
    		if gerr != nil {
    			return credentials.Credentials{}, gerr
    		}
    		cred, err := arnCredential.GetCredential()
    		if err != nil {
    			return credentials.Credentials{}, err
    		}
    		return credentials.Credentials{
    			AccessKeyID:     *cred.AccessKeyId,
    			AccessKeySecret: *cred.AccessKeySecret,
    			SecurityToken:   *cred.SecurityToken,
    		}, nil
    	})
    
    	// Load the default configurations and specify the credential provider and region.
    	cfg := oss.LoadDefaultConfig().
    		WithCredentialsProvider(provider).
    		WithRegion(region)
    
    	// Create an OSS client.
    	client := oss.NewClient(cfg)
    	log.Printf("ossclient: %v", client)
    }
    

方法5: OIDCRoleARNを使用する

ACKワーカーノードでRAMロールを設定すると、ノードのポッド内のアプリケーションは、ECSインスタンスにデプロイされたアプリケーションと同じ方法でメタデータサーバーを使用して、アタッチされたロールのセキュリティトークンを取得できます。 ただし、信頼されていないアプリケーション (顧客によって送信され、コードを使用できないアプリケーションなど) がワーカーノードにデプロイされている場合、アプリケーションがメタデータサーバーを使用してワーカーノードにアタッチされているRAMロールのセキュリティトークンを取得することはできません。 クラウドリソースのセキュリティを確保し、信頼できないアプリケーションが必要なセキュリティトークンを安全に取得できるようにし、アプリケーションレベルの権限を最小限に抑えるために、サービスアカウントのRAMロール (RRSA) 機能を使用できます。 この方法の基本的なロジックは、STSから取得したセキュリティトークンを使用してアクセス資格情報を設定することです。 ACKは、さまざまなアプリケーションポッドの対応するOpenID Connect (OIDC) トークンファイルを作成およびマウントし、関連する構成情報を環境変数に渡します。 資格情報ツールは、環境変数の構成情報を取得し、STSのAssumeRoleWithOIDC操作を呼び出して、アタッチされたロールのセキュリティトークンを取得します。 この方法では、AccessKeyペアまたはセキュリティトークンを手動で管理する場合に発生するリスクを排除します。 詳細については、「RRSAを使用して異なるポッドに異なるクラウドサービスへのアクセスを許可する」をご参照ください。

  1. 資格情報の依存関係を追加します。

    go get github.com/aliyun/credentials-go/credentials
  2. アクセス資格情報を設定します。

    package main
    
    import (
    	"context"
    	"log"
    
    	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
    	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
    	openapicred "github.com/aliyun/credentials-go/credentials"
    )
    
    func main() {
    	// Specify the ID of the region in which the bucket is located based on your business requirements. For example, if the bucket is located in the China (Hangzhou) region, set the region ID to cn-hangzhou.
    	region := "cn-hangzhou"
    
    	config := new(openapicred.Config).
    		// 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("OIDCProviderArn").
    		// Specify the path of the file in which the OIDC token is stored.
    		SetOIDCTokenFilePath("OIDCTokenFilePath").
    		// Specify a custom session name for the role to distinguish different tokens.
    		SetRoleSessionName("RoleSessionName"). // By default, the canonical name of the RoleSessionName environment variable is ALIBABA_CLOUD_ROLE_SESSION_NAME.
    		// Optional. Specify the policy of the RAM role.
    		SetPolicy("Policy").
    		// 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("RoleArn").
    		// Specify the validity period of the session.
    		SetSessionExpiration(3600)
    
    	arnCredential, gerr := openapicred.NewCredential(config)
    	provider := credentials.CredentialsProviderFunc(func(ctx context.Context) (credentials.Credentials, error) {
    		if gerr != nil {
    			return credentials.Credentials{}, gerr
    		}
    		cred, err := arnCredential.GetCredential()
    		if err != nil {
    			return credentials.Credentials{}, err
    		}
    		return credentials.Credentials{
    			AccessKeyID:     *cred.AccessKeyId,
    			AccessKeySecret: *cred.AccessKeySecret,
    			SecurityToken:   *cred.SecurityToken,
    		}, nil
    	})
    
    	// Load the default configurations and specify the credential provider and region.
    	cfg := oss.LoadDefaultConfig().
    		WithCredentialsProvider(provider).
    		WithRegion(region)
    
    	// Create an OSS client.
    	client := oss.NewClient(cfg)
    	log.Printf("ossclient: %v", client)
    }
    

方法6: カスタム資格情報プロバイダーの指定

上記の資格情報の設定方法がビジネス要件を満たしていない場合は、アクセス資格情報を取得するために使用する方法を指定できます。 次の方法がサポートされています。

  1. CredentialsProviderFuncメソッドの使用

    package main
    
    import (
    	"context"
    	"log"
    
    	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
    	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
    )
    
    func main() {
    	// Specify the ID of the region in which the bucket is located based on your business requirements. For example, if the bucket is located in the China (Hangzhou) region, set the region ID to cn-hangzhou.
    	region := "cn-hangzhou"
    
    	// Create a credential provider.
    	provider := credentials.CredentialsProviderFunc(func(ctx context.Context) (credentials.Credentials, error) {
    		// Return long-term credentials.
    		return credentials.Credentials{AccessKeyID: "id", AccessKeySecret: "secret"}, nil
    		// Return temporary credentials.
    		//return credentials.Credentials{AccessKeyID: "id", AccessKeySecret: "secret",    SecurityToken: "token"}, nil
    	})
    
    	// Load the default configurations and specify the credential provider and region.
    	cfg := oss.LoadDefaultConfig().
    		WithCredentialsProvider(provider).
    		WithRegion(region)
    
    	// Create an OSS client.
    	client := oss.NewClient(cfg)
    	log.Printf("ossclient: %v", client)
    }
    
  2. credentials.CredentialsProviderメソッドを使用する

    package main
    
    import (
    	"context"
    	"log"
    
    	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
    	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
    )
    
    type CustomerCredentialsProvider struct {
    	// TODO
    }
    
    func NewCustomerCredentialsProvider() CustomerCredentialsProvider {
    	return CustomerCredentialsProvider{}
    }
    
    func (s CustomerCredentialsProvider) GetCredentials(_ context.Context) (credentials.Credentials, error) {
    	// Return long-term credentials.
    	return credentials.Credentials{AccessKeyID: "id", AccessKeySecret: "secret"}, nil
    	// Return temporary credentials.
    	//return credentials.Credentials{AccessKeyID: "id", AccessKeySecret: "secret",    SecurityToken: "token"}, nil
    }
    
    func main() {
    	// Specify the ID of the region in which the bucket is located based on your business requirements. For example, if the bucket is located in the China (Hangzhou) region, set the region ID to cn-hangzhou.
    	region := "cn-hangzhou"
    
    	// Create a credential provider.
    	provider := NewCustomerCredentialsProvider()
    
    	// Load the default configurations and specify the credential provider and region.
    	cfg := oss.LoadDefaultConfig().
    		WithCredentialsProvider(provider).
    		WithRegion(region)
    
    	// Create an OSS client.
    	client := oss.NewClient(cfg)
    	log.Printf("ossclient: %v", client)
    }