Alibaba Cloud SDK を使用してクラウド リソースを管理するための API オペレーションを呼び出すときは、有効なクレデンシャル情報を構成する必要があります。Alibaba Cloud クレデンシャルツールは、アクセスクレデンシャルを簡単に取得および管理できる強力な機能を提供します。このトピックでは、クレデンシャルツールを使用して、デフォルトのクレデンシャル、AccessKey ペア、セキュリティトークンサービス (STS) トークンなど、さまざまな種類のクレデンシャルを構成する方法について説明します。また、クレデンシャルツールがデフォルトのクレデンシャルを取得する順序についても説明します。Alibaba Cloud SDK でのクレデンシャルの構成と管理に関する十分な知識を習得できます。これにより、クラウド リソースに対する操作を効率的かつ安全に実行できます。
背景情報
クレデンシャルとは、ユーザーの身元を証明するために使用される一連の情報です。システムにログオンするときは、有効なクレデンシャルを使用して身分認証を完了する必要があります。一般的に使用されるクレデンシャルの種類は次のとおりです。
Alibaba Cloud アカウントまたは Resource Access Management (RAM) ユーザーの AccessKey ペア。AccessKey ペアは永続的に有効で、AccessKey ID と AccessKey シークレットで構成されます。
RAM ロールの STS トークン。STS トークンは一時的なクレデンシャルです。STS トークンの有効期間とアクセス許可を指定できます。詳細については、「STS とは」をご参照ください。
ベアラトークン。ID 認証と承認に使用されます。
前提条件
Go 1.10.x 以降がインストールされている。
Alibaba Cloud SDK V2.0 がインストールされている。詳細については、「IDE で Alibaba Cloud SDK for Go を使用する」をご参照ください。
クレデンシャルツールのインストール
go get
コマンドを実行して、Alibaba Cloud Credentials for Go をインストールします。
$ go get -u github.com/aliyun/credentials-go
dep
ツールを使用して Go の依存関係を管理する場合は、次のコマンドを実行して Alibaba Cloud Credentials for Go をインストールします。
$ dep ensure -add github.com/aliyun/credentials-go
最新バージョンのクレデンシャルツールを使用して、すべての種類のクレデンシャルがサポートされていることを確認します。
クレデンシャルクライアントの初期化
ビジネス要件に基づいて、次のいずれかの方法を使用してクレデンシャルクライアントを初期化できます。
プロジェクトでプレーンテキストの AccessKey ペアを使用する場合、コード リポジトリの権限管理が不適切なために、AccessKey ペアが漏洩する可能性があります。これにより、AccessKey ペアが属するアカウント内のすべてのリソースのセキュリティが脅かされる可能性があります。 AccessKey ペアは環境変数または構成ファイルに保存することをお勧めします。
方法 1:デフォルトのクレデンシャル プロバイダー チェーンを使用する
クレデンシャル クライアントを初期化する方法を指定しない場合、デフォルトのクレデンシャル プロバイダー チェーンが使用されます。デフォルトのクレデンシャル プロバイダー チェーンの取得方法の詳細については、このトピックの「デフォルトのクレデンシャル プロバイダー チェーン」セクションを参照してください。
package main
import (
"fmt"
"github.com/aliyun/credentials-go/credentials"
)
func main() {
// クレデンシャル クライアントを初期化する方法を指定しません。
credential, err := credentials.NewCredential(nil)
}
呼び出し例
方法 2:AccessKey ペアを使用する
Alibaba Cloud アカウントまたは RAM ユーザーの API オペレーションを呼び出すために使用される AccessKey ペアを作成できます。詳細については、「AccessKey ペアの作成」をご参照ください。その後、AccessKey ペアを使用してクレデンシャル クライアントを初期化できます。
Alibaba Cloud アカウントは、アカウント内のリソースに対するすべての権限を持っています。Alibaba Cloud アカウントの AccessKey ペアの漏洩は、システムに重大な脅威をもたらします。
したがって、最小権限の原則に基づいて権限が付与されている RAM ユーザーの AccessKey ペアを使用して、クレデンシャル クライアントを初期化することをお勧めします。
import (
"fmt"
"os"
"github.com/aliyun/credentials-go/credentials"
)
func main() {
config := new(credentials.Config).
SetType("access_key").
SetAccessKeyId(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_ID")).
SetAccessKeySecret(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"))
akCredential, err := credentials.NewCredential(config)
if err != nil {
return
}
accessKeyId, err := akCredential.GetAccessKeyId()
accessSecret, err := akCredential.GetAccessKeySecret()
credentialType := akCredential.GetType()
fmt.Println(accessKeyId, accessSecret, credentialType)
}
呼び出し例
方法 3:STS トークンを使用する
RAM ユーザーとして STS の AssumeRole オペレーションを呼び出して、STS トークンを取得できます。STS トークンの最大有効期間を指定できます。次の例は、STS トークンを使用してクレデンシャル クライアントを初期化する方法を示しています。この例では、STS トークンの取得方法は示していません。
package main
import (
"fmt"
"github.com/aliyun/credentials-go/credentials"
"os"
)
func main() {
config := new(credentials.Config).
SetType("sts").
// 環境変数から AccessKey ID を取得します。
SetAccessKeyId(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_ID")).
// 環境変数から AccessKey シークレットを取得します。
SetAccessKeySecret(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET")).
// 環境変数から STS トークンを取得します。
SetSecurityToken(os.Getenv("ALIBABA_CLOUD_SECURITY_TOKEN"))
stsCredential, err := credentials.NewCredential(config)
if err != nil {
return
}
credential, err := stsCredential.GetCredential()
accessKeyId := credential.AccessKeyId
accessKeySecret := credential.AccessKeySecret
securityToken := credential.SecurityToken
credentialType := credential.Type
fmt.Println(accessKeyId, accessKeySecret, securityToken, credentialType)
}
呼び出し例
方法 4:AccessKey ペアと RAM ロールを使用する
この方法の基本ロジックは、STS トークンを使用してクレデンシャル クライアントを初期化することです。RAM ロールの ARN を指定すると、クレデンシャルツールは STS から STS トークンを取得できます。 SetPolicy
メソッドを使用して、RAM ロールの権限を制限することもできます。
package main
import (
"fmt"
"os"
"github.com/aliyun/credentials-go/credentials"
)
func main() {
config := new(credentials.Config).
SetType("ram_role_arn").
SetAccessKeyId(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_ID")).
SetAccessKeySecret(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET")).
// 引き受ける RAM ロールの ARN を指定します。例:acs:ram::123456789012****:role/adminrole。ALIBABA_CLOUD_ROLE_ARN 環境変数から値を取得できます。
SetRoleArn("<RoleArn>").
// ロールセッション名を指定します。ALIBABA_CLOUD_ROLE_SESSION_NAME 環境変数から値を取得できます。
SetRoleSessionName("<RoleSessionName>").
// オプション。RAM ロールの制限付き権限を指定します。例:{"Statement": [{"Action": ["*"],"Effect": "Allow","Resource": ["*"]}],"Version":"1"}。
SetPolicy("<Policy>").
// オプション。セッションの有効期間を指定します。
SetRoleSessionExpiration(3600).
// オプション。外部 ID。このパラメーターは外部機関によって提供され、混乱した代理人の問題を防ぐために使用されます。
SetExternalId("ExternalId").
// オプション。STS のエンドポイント。デフォルト値は sts.aliyuncs.com です。ネットワーク接続を確保するために、地理的に最も近いリージョンの STS エンドポイントを使用することをお勧めします。
SetSTSEndpoint("sts.cn-hangzhou.aliyuncs.com")
arnCredential, err := credentials.NewCredential(config)
if err != nil {
return
}
credential, err := arnCredential.GetCredential()
accessKeyId := credential.AccessKeyId
accessKeySecret := credential.AccessKeySecret
securityToken := credential.SecurityToken
credentialType := credential.Type
fmt.Println(accessKeyId, accessKeySecret, securityToken, credentialType)
}
詳細については、「外部 ID を使用して混乱した代理人の問題を防ぐ」をご参照ください。
呼び出し例
方法 5:ECS インスタンスの RAM ロールを使用する
ECS インスタンスまたはエラスティックコンテナインスタンスに RAM ロールを割り当てることができます。ECS インスタンスまたはエラスティックコンテナインスタンスでクレデンシャルツールを使用すると、ツールはインスタンスに割り当てられた RAM ロールを自動的に取得し、メタデータサーバーにアクセスして RAM ロールの STS トークンを取得します。その後、STS トークンを使用してクレデンシャル クライアントを初期化できます。
インスタンスメタデータには、通常モードまたはセキュリティ強化モードでアクセスできます。デフォルトでは、クレデンシャルツールは、インスタンスメタデータサービスバージョン 2 (IMDSv2) を使用して、セキュリティ強化モードでアクセスクレデンシャルを取得します。セキュリティ強化モードで例外が発生した場合、DisableIMDSv1
パラメーターを構成して、例外処理ロジックを指定できます。 DisableIMDSv1 パラメーターの有効な値:
パラメーターがデフォルト値の
false
に設定されている場合、アクセスクレデンシャルは通常モードで取得されます。true
:例外がスローされ、クレデンシャルツールはセキュリティ強化モードでアクセスクレデンシャルの取得を続行します。
メタデータサーバーの構成によって、サーバーがセキュリティ強化モードをサポートするかどうかが決まります。
インスタンスメタデータの詳細については、「インスタンスメタデータの取得」をご参照ください。
ECS インスタンスに RAM ロールをアタッチする方法の詳細については、「インスタンス RAM ロール」トピックの「インスタンス RAM ロールの作成と ECS インスタンスへのアタッチ」セクションを参照してください。エラスティックコンテナインスタンスに RAM ロールをアタッチする方法の詳細については、「API オペレーションを呼び出してインスタンス RAM ロールを使用する」トピックの「エラスティックコンテナインスタンスにインスタンス RAM ロールを割り当てる」セクションを参照してください。
package main
import (
"fmt"
"github.com/aliyun/credentials-go/credentials"
)
func _main(args []*string) {
// ECS インスタンスの RAM ロールを使用して、クレデンシャル クライアントを初期化します。
credentialsConfig := new(credentials.Config).
// クレデンシャルの種類を指定します。
SetType("ecs_ram_role").
// オプション。ALIBABA_CLOUD_ECS_METADATA 環境変数を指定して、ECS インスタンスの RAM ロールの名前を指定します。このパラメーターを指定しない場合、値は自動的に取得されます。リクエスト数を減らすために、このパラメーターを指定することをお勧めします。
SetRoleName("<RoleName>")
// true の値は、セキュリティ強化モードが強制的に使用されることを指定します。デフォルト値は false で、システムが最初にセキュリティ強化モードでアクセスクレデンシャルを取得しようとすることを指定します。アクセスクレデンシャルの取得に失敗した場合、通常モード (IMDSv1) が使用されます。
// credentialsConfig.SetDisableIMDSv1(true)
credentialClient, err := credentials.NewCredential(credentialsConfig)
if err != nil {
return
}
credential, err := credentialClient.GetCredential()
accessKeyId := credential.AccessKeyId
accessKeySecret := credential.AccessKeySecret
securityToken := credential.SecurityToken
credentialType := credential.Type
fmt.Println(accessKeyId, accessKeySecret, securityToken, credentialType)
}
呼び出し例
方法 6:OIDC IdP の RAM ロールを使用する
Container Service for Kubernetes クラスタのワーカーノードに RAM ロールをアタッチした後、ワーカーノード上のポッド内のアプリケーションは、ECS インスタンス上のアプリケーションと同じ方法でメタデータサーバーを使用して STS トークンを取得できます。ただし、信頼されていないアプリケーション (顧客が送信したアプリケーションや、コードを利用できないアプリケーションなど) がワーカーノードにデプロイされている場合、アプリケーションがメタデータサーバーを使用して、ワーカーノードにアタッチされている RAM ロールのセキュリティトークンを取得することを望まない場合があります。クラウド リソースのセキュリティを確保し、信頼されていないアプリケーションが必要な STS トークンを安全に取得できるようにするには、サービスアカウントの RAM ロール (RRSA) 機能を使用して、アプリケーションに最小限必要な権限を付与します。この場合、ACK クラスタはサービスアカウント OpenID Connect (OIDC) トークンファイルを作成し、トークンファイルをポッドに関連付け、関連する環境変数をポッドに挿入します。次に、クレデンシャルツールは環境変数を使用して、STS の AssumeRoleWithOIDC オペレーションを呼び出し、RAM ロールの STS トークンを取得します。RRSA 機能の詳細については、「RRSA を使用して異なるポッドに異なるクラウドサービスへのアクセスを承認する」をご参照ください。
次の環境変数がポッドに挿入されます。
ALIBABA_CLOUD_ROLE_ARN:RAM ロールの ARN。
ALIBABA_CLOUD_OIDC_PROVIDER_ARN:OIDC ID プロバイダー (IdP) の ARN。
ALIBABA_CLOUD_OIDC_TOKEN_FILE:OIDC トークンファイルのパス。
package main
import (
"fmt"
"github.com/aliyun/credentials-go/credentials"
"os"
)
func main() {
config := new(credentials.Config).
SetType("oidc_role_arn").
// ALIBABA_CLOUD_OIDC_PROVIDER_ARN 環境変数を指定して、OIDC IdP の ARN を指定します。
SetOIDCProviderArn(os.Getenv("ALIBABA_CLOUD_OIDC_PROVIDER_ARN")).
// ALIBABA_CLOUD_OIDC_TOKEN_FILE 環境変数を指定して、OIDC トークンファイルのパスを指定します。
SetOIDCTokenFilePath(os.Getenv("ALIBABA_CLOUD_OIDC_TOKEN_FILE")).
// ALIBABA_CLOUD_ROLE_ARN 環境変数を指定して、RAM ロールの ARN を指定します。
SetRoleArn(os.Getenv("ALIBABA_CLOUD_ROLE_ARN")).
// ロールセッション名を指定します。ALIBABA_CLOUD_ROLE_SESSION_NAME 環境変数から値を取得できます。
SetRoleSessionName(os.Getenv("ALIBABA_CLOUD_ROLE_SESSION_NAME")).
// オプション。RAM ロールの制限付き権限を指定します。例:{"Statement": [{"Action": ["*"],"Effect": "Allow","Resource": ["*"]}],"Version":"1"}。
SetPolicy("<Policy>").
// オプション。セッションの有効期間を指定します。
SetRoleSessionExpiration(3600).
// オプション。STS のエンドポイント。デフォルト値は sts.aliyuncs.com です。ネットワーク接続を確保するために、地理的に最も近いリージョンの STS エンドポイントを使用することをお勧めします。
SetSTSEndpoint("sts.cn-hangzhou.aliyuncs.com")
oidcCredential, err := credentials.NewCredential(config)
if err != nil {
return
}
credential, err := oidcCredential.GetCredential()
accessKeyId := credential.AccessKeyId
accessKeySecret := credential.AccessKeySecret
securityToken := credential.SecurityToken
credentialType := credential.Type
fmt.Println(accessKeyId, accessKeySecret, securityToken, credentialType)
}
呼び出し例
方法 7:クレデンシャル URI を使用する
この方法の基本ロジックは、STS トークンを使用してクレデンシャル クライアントを初期化することです。クレデンシャルツールは、提供された Uniform Resource Identifier (URI) を使用して STS トークンを取得します。次に、STS トークンを使用してクレデンシャル クライアントが初期化されます。
package main
import (
"github.com/aliyun/credentials-go/credentials"
)
func main() {
config := new(credentials.Config).
SetType("credentials_uri").
// ALIBABA_CLOUD_CREDENTIALS_URI 環境変数を指定して、http://local_or_remote_uri/ 形式のクレデンシャルの URI を指定します。
SetCredentialsUri("<CredentialsUri>")
uriCredential, err := credentials.NewCredential(config)
}
呼び出し例
方法 8:ベアラトークンを使用する
Cloud Call Center のみ、ベアラトークンを使用してクレデンシャル クライアントを初期化できます。
package main
import (
"fmt"
"github.com/aliyun/credentials-go/credentials"
)
func main() {
config := new(credentials.Config).
SetType("bearer").
// ベアラトークンを入力します。
SetBearerToken("<BearerToken>")
bearerCredential, err := credentials.NewCredential(config)
if err != nil {
return
}
bearerToken := bearerCredential.GetBearerToken()
credentialType := bearerCredential.GetType()
fmt.Println(bearerToken, credentialType)
}
呼び出し例
デフォルトのクレデンシャル プロバイダー チェーン
開発環境と本番環境で異なる種類のクレデンシャルを使用する場合、通常はコードから環境情報を取得し、コードブランチを作成して開発環境と本番環境の異なるクレデンシャルを取得する必要があります。クレデンシャルツールのデフォルトのクレデンシャル プロバイダー チェーンを使用すると、アプリケーションとは無関係な構成に基づいて、同じコードを使用して異なる環境のクレデンシャルを取得できます。初期化方法を指定せずに NewCredential()
を使用してクレデンシャル クライアントを初期化する場合、クレデンシャルツールは次の順序でクレデンシャル情報を取得します。
1. 環境変数からクレデンシャル情報を取得する
前の手順でクレデンシャルが見つからない場合、クレデンシャルツールは環境変数からクレデンシャル情報を取得します。
ALIBABA_CLOUD_ACCESS_KEY_ID (AccessKey ID) と ALIBABA_CLOUD_ACCESS_KEY_SECRET (AccessKey シークレット) システム環境変数が指定されている場合、クレデンシャルツールは指定された AccessKey ペアをデフォルトのクレデンシャルとして使用します。
ALIBABA_CLOUD_ACCESS_KEY_ID (AccessKey ID)、ALIBABA_CLOUD_ACCESS_KEY_SECRET (AccessKey シークレット)、ALIBABA_CLOUD_SECURITY_TOKEN (STS トークン) システム環境変数が指定されている場合、クレデンシャルツールは指定された STS トークンをデフォルトのクレデンシャルとして使用します。
2. OIDC IdP の RAM ロールを使用してクレデンシャル情報を取得する
前の手順でクレデンシャルが見つからない場合、クレデンシャルツールは次の環境変数の値を取得します。
ALIBABA_CLOUD_ROLE_ARN:RAM ロールの ARN。
ALIBABA_CLOUD_OIDC_PROVIDER_ARN:OIDC IdP の ARN。
ALIBABA_CLOUD_OIDC_TOKEN_FILE:OIDC トークンファイルのパス。
上記の 3 つの環境変数が指定されている場合、クレデンシャルツールは環境変数を使用して STS の AssumeRoleWithOIDC オペレーションを呼び出し、STS トークンをデフォルトのクレデンシャルとして取得します。
3. config.json ファイルからクレデンシャル情報を取得する
前の手順でクレデンシャルが見つからない場合、クレデンシャルツールは config.json ファイルからクレデンシャル情報を取得します。構成ファイルのパスは、オペレーティングシステムによって異なります。
Linux:~/.aliyun/config.json
Windows:C:\Users\USER_NAME\.aliyun\config.json
config.json ファイルが存在する場合、アプリケーションは config.json ファイルの current パラメーターで指定されたクレデンシャル情報を使用してクレデンシャル クライアントを初期化します。 ALIBABA_CLOUD_PROFILE 環境変数を指定してクレデンシャル情報を指定することもできます。たとえば、ALIBABA_CLOUD_PROFILE 環境変数を client1 に設定できます。
config.json ファイルの mode パラメーターは、クレデンシャル情報を取得するために使用される方法を指定します。有効な値:
AK:RAM ユーザーの AccessKey ペアを使用してクレデンシャル情報を取得します。
RamRoleArn:RAM ロールの ARN を使用してクレデンシャル情報を取得します。
EcsRamRole:ECS インスタンスにアタッチされている RAM ロールを使用してクレデンシャル情報を取得します。
OIDC:OIDC IdP の ARN と OIDC トークンファイルを使用してクレデンシャル情報を取得します。
ChainableRamRoleArn:ロールチェーンを使用して、別の JSON ファイルでアクセスクレデンシャルを指定してクレデンシャル情報を取得します。
構成例:
{
"current": "default",
"profiles": [
{
"name": "default",
"mode": "AK",
"access_key_id": "<ALIBABA_CLOUD_ACCESS_KEY_ID>",
"access_key_secret": "<ALIBABA_CLOUD_ACCESS_KEY_SECRET>"
},
{
"name":"client1",
"mode":"RamRoleArn",
"access_key_id":"<ALIBABA_CLOUD_ACCESS_KEY_ID>",
"access_key_secret":"<ALIBABA_CLOUD_ACCESS_KEY_SECRET>",
"ram_role_arn":"<ROLE_ARN>",
"ram_session_name":"<ROLE_SESSION_NAME>",
"expired_seconds":3600
},
{
"name":"client2",
"mode":"EcsRamRole",
"ram_role_name":"<RAM_ROLE_ARN>"
},
{
"name":"client3",
"mode":"OIDC",
"oidc_provider_arn":"<OIDC_PROVIDER_ARN>",
"oidc_token_file":"<OIDC_TOKEN_FILE>",
"ram_role_arn":"<ROLE_ARN>",
"ram_session_name":"<ROLE_SESSION_NAME>",
"expired_seconds":3600
},
{
"name":"client4",
"mode":"ChainableRamRoleArn",
"source_profile":"<PROFILE_NAME>",
"ram_role_arn":"<ROLE_ARN>",
"ram_session_name":"<ROLE_SESSION_NAME>",
"expired_seconds":3600
}
]
}
4. ECS インスタンスの RAM ロールを使用してクレデンシャル情報を取得する
前の手順でクレデンシャルが見つからない場合、クレデンシャルツールは、ECS インスタンスの RAM ロール名を指定する ALIBABA_CLOUD_ECS_METADATA 環境変数の値を取得します。RAM ロールが存在する場合、アプリケーションはセキュリティ強化モードで ECS のメタデータサーバーを使用して、RAM ロールの STS トークンをデフォルトのクレデンシャルとして取得します。セキュリティ強化モードで例外が発生した場合、クレデンシャルツールは通常モードでアクセスクレデンシャルを取得します。 ALIBABA_CLOUD_IMDSV1_DISABLED 環境変数を構成して、例外処理ロジックを指定することもできます。環境変数の有効な値:
false
:クレデンシャルツールは通常モードでアクセスクレデンシャルの取得を続行します。true
:例外がスローされ、クレデンシャルツールはセキュリティ強化モードでアクセスクレデンシャルの取得を続行します。
メタデータサーバーの構成によって、サーバーがセキュリティ強化モードをサポートするかどうかが決まります。
5. URI に基づいてクレデンシャル情報を取得する
前の手順でクレデンシャルが見つからない場合、クレデンシャルツールは、クレデンシャルの URI を指定する ALIBABA_CLOUD_CREDENTIALS_URI 環境変数の値を取得します。クレデンシャルの URI が存在する場合、アプリケーションはクレデンシャルの URI を使用して STS トークンをデフォルトのクレデンシャルとして取得します。
クレデンシャルを切り替える
次の方法を使用して、異なるクレデンシャルを使用してアプリケーションで異なる API オペレーションを呼び出すことができます。
複数のクレデンシャル クライアントを使用する
複数のクレデンシャル クライアントを初期化して、異なるクレデンシャルを異なるリクエスト クライアントに渡します。
package main
import (
credentials "github.com/aliyun/credentials-go/credentials"
"os"
)
func main() {
config1 := new(credentials.Config).
SetType("access_key").
SetAccessKeyId(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_ID")).
SetAccessKeySecret(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"))
akCredential, err1 := credentials.NewCredential(config1)
config2 := new(credentials.Config).
SetType("sts").
SetAccessKeyId(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_ID")).
SetAccessKeySecret(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET")).
SetSecurityToken(os.Getenv("ALIBABA_CLOUD_SECURITY_TOKEN"))
akCredential, err2 := credentials.NewCredential(config2)
}