Alibaba Cloud SDK を使用して API オペレーションを呼び出し、クラウド リソースを管理するには、有効な認証情報を構成する必要があります。このトピックでは、Go 用 Alibaba Cloud SDK V1.0 のアクセス認証情報を構成する方法について説明します。アクセス認証情報は、開発に SDK を使用する場合のアクセス制御を向上させます。
背景情報
Alibaba Cloud SDK を使用して開発を行う場合は、ビジネス シナリオと権限制御の要件に基づいて適切な認証情報タイプを構成します。開発者が安定した信頼性の高いアプリケーションを構築できるように、適切な環境変数または構成ファイルを構成して、SDK が認証情報を読み取って使用できるようにする必要があります。
前提条件
Go 1.10.x 以降を使用している。
Go 用 Alibaba Cloud SDK のコア ライブラリがインストールされている。
go get -u github.com/aliyun/alibaba-cloud-sdk-go/sdk
認証情報クライアントを初期化する
方法 1:デフォルトの認証情報プロバイダー チェーンを使用する
SDK クライアントを初期化する方法を指定しない場合は、デフォルトの認証情報プロバイダー チェーンが使用されます。詳細については、このトピックのデフォルトの認証情報プロバイダー チェーンセクションをご参照ください。
package main
import (
"github.com/aliyun/alibaba-cloud-sdk-go/sdk"
"github.com/aliyun/alibaba-cloud-sdk-go/sdk/auth/credentials/provider"
)
func main() {
config := sdk.NewConfig()
// このパラメーターには値が指定されていません。
credential := credentials.NewDefaultCredentialsProvider()
// <REGION_ID>: SDK クライアントがアクセスする必要がある Alibaba Cloud リージョンを指定します。例:cn-hangzhou。
client, err := sdk.NewClientWithOptions("<REGION_ID>", config, credential)
if err != nil {
panic(err)
}
// API オペレーションを呼び出す手順は省略されています。
}方法 2:AccessKey ペアを使用する
Alibaba Cloud アカウントと Resource Access Management (RAM) ユーザーの API を呼び出すための AccessKey ペアを作成できます。 AccessKey ペアを使用して、SDK クライアントを初期化できます。
Alibaba Cloud アカウントの AccessKey ペアは、アカウント内のすべてのリソースへのフル アクセス権を持っています。 AccessKey ペアの漏洩は、Alibaba Cloud アカウント内のリソースにとって重大な脅威となります。 RAM ユーザーの AccessKey ペアを使用し、AccessKey ペアを定期的にローテーションすることをお勧めします。 RAM ユーザーの AccessKey ペアを作成する方法については、「AccessKey ペアを作成する」をご参照ください。
package main
import (
"os"
"github.com/aliyun/alibaba-cloud-sdk-go/sdk"
"github.com/aliyun/alibaba-cloud-sdk-go/sdk/auth/credentials"
)
func main() {
config := sdk.NewConfig()
credential, err := credentials.NewStaticAKCredentialsProviderBuilder().
// os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"):環境変数から RAM ユーザーの AccessKey ID を取得します。
WithAccessKeyId(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_ID")).
// os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"):環境変数から RAM ユーザーの AccessKey シークレットを取得します。
WithAccessKeySecret(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET")).
Build()
if err != nil {
panic(err)
}
// <REGION_ID>: SDK クライアントがアクセスする必要がある Alibaba Cloud リージョンを指定します。例:cn-hangzhou。
client, err := sdk.NewClientWithOptions("<REGION_ID>", config, credential)
if err != nil {
panic(err)
}
// API オペレーションを呼び出す手順は省略されています。
}方法 3:STS トークンを使用する
ビジネスのセキュリティを確保するために、Security Token Service (STS) から一時的なセキュリティ認証情報 (TSC) を申請して、一時的なクライアントを作成できます。
package main
import (
"os"
"github.com/aliyun/alibaba-cloud-sdk-go/sdk"
"github.com/aliyun/alibaba-cloud-sdk-go/sdk/auth/credentials"
)
func main() {
config := sdk.NewConfig()
credential, err := credentials.NewStaticSTSCredentialsProviderBuilder().
// os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"):環境変数から RAM ユーザーの AccessKey ID を取得します。
WithAccessKeyId(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_ID")).
// os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"):環境変数から RAM ユーザーの AccessKey シークレットを取得します。
WithAccessKeySecret(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET")).
// os.Getenv("ALIBABA_CLOUD_SECURITY_TOKEN"):環境変数から STS トークンを取得します。
WithSecurityToken(os.Getenv("ALIBABA_CLOUD_SECURITY_TOKEN")).
Build()
if err != nil {
panic(err)
}
// <REGION_ID>: SDK クライアントがアクセスする必要がある Alibaba Cloud リージョンを指定します。例:cn-hangzhou。
client, err := sdk.NewClientWithOptions("<REGION_ID>", config, credential)
if err != nil {
panic(err)
}
// API オペレーションを呼び出す手順は省略されています。
}方法 4:AccessKey ペアと RAM ロールを使用する
RAM ロールの Alibaba Cloud Resource Name (ARN) を指定して、SDK クライアントを初期化できます。 SDK クライアントは、API リクエストを送信する前に、STS API を呼び出して STS トークンを取得する必要があります。 STS トークンの権限を制限するには、RAM でカスタム ポリシーを構成します。
package main
import (
"os"
"github.com/aliyun/alibaba-cloud-sdk-go/sdk"
"github.com/aliyun/alibaba-cloud-sdk-go/sdk/auth/credentials"
)
func main() {
config := sdk.NewConfig()
credential, err := credentials.NewRAMRoleARNCredentialsProviderBuilder().
// os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"): 必須。環境変数から RAM ユーザーの AccessKey ID を取得します。
WithAccessKeyId(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_ID")).
// os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"): 必須。環境変数から RAM ユーザーの AccessKey シークレットを取得します。
WithAccessKeySecret(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET")).
// "<Role_Arn>" 必須。RAM ロールの ARN。RAM ロールの ARN は、RAM コンソールで取得できます。例:acs:ram::123456789012****:role/adminrole。
WithRoleArn("<Role_Arn>").
// "<ROLE_SESSION_NAME>" 必須。異なるセッションを区別するために使用されるロール セッションの名前。例:alice。
WithRoleSessionName("<ROLE_SESSION_NAME>").
// "<POLICY>": ロールのセッション権限を制限するためのカスタム ポリシーを指定します。例:{\"Statement\": [{\"Action\": [\"*\"],\"Effect\": \"Allow\",\"Resource\": [\"*\"]}],\"Version\":\"1\"}。
WithPolicy("<POLICY>").
// "<EXTERNAL_ID>": 代理と混同される場合に備えて、ロールの外部 ID を指定します。例:abcd1234。
WithExternalId("<EXTERNAL_ID>").
// <ROLE_SESSION_EXPIRATION>: トークンの有効期間。例:3600。
WithDurationSeconds(3600).
Build()
if err != nil {
panic(err)
}
// <REGION_ID>: SDK クライアントがアクセスする必要がある Alibaba Cloud リージョンを指定します。例:cn-hangzhou。
client, err := sdk.NewClientWithOptions("<REGION_ID>", config, credential)
if err != nil {
panic(err)
}
// API オペレーションを呼び出す手順は省略されています。
}方法 5:ECS インスタンスの RAM ロールを使用する
ECS インスタンスまたはエラスティック コンテナー インスタンスに RAM ロールをアタッチできます。認証情報ツールは、インスタンスにアタッチされている RAM ロールを自動的に取得し、メタデータ サーバーを使用して RAM ロールの STS トークンを取得します。 następnie STS トークンは、認証情報クライアントの初期化に使用されます。
インスタンス メタデータには、通常モードまたはセキュリティ強化モードでアクセスできます。デフォルトでは、認証情報ツールは、インスタンス メタデータ サービス バージョン 2 (IMDSv2) を使用して、セキュリティ強化モードでアクセス認証情報を取得します。セキュリティ強化モードで例外が発生した場合は、DisableIMDSv1 パラメーターを構成して、例外処理ロジックを指定できます。 DisableIMDSv1 パラメーターの有効な値:
パラメーターがデフォルト値の
falseに設定されている場合、アクセス認証情報は通常モードで取得されます。true: 例外がスローされ、認証情報ツールはセキュリティ強化モードでアクセス認証情報の取得を続けます。
メタデータ サーバーの構成によって、サーバーがセキュリティ強化モード (IMDSv2) をサポートするかどうかが決まります。
インスタンス メタデータの詳細については、「インスタンス メタデータを取得する」をご参照ください。
ECS インスタンスに RAM ロールをアタッチする方法の詳細については、「インスタンス RAM ロール」トピックの「インスタンス RAM ロールを作成し、ECS インスタンスにアタッチする」セクションをご参照ください。エラスティック コンテナー インスタンスに RAM ロールをアタッチする方法の詳細については、「API オペレーションを呼び出してインスタンス RAM ロールを使用する」トピックの「エラスティック コンテナー インスタンスにインスタンス RAM ロールを割り当てる」セクションをご参照ください。
package main
import (
"os"
"github.com/aliyun/alibaba-cloud-sdk-go/sdk"
"github.com/aliyun/alibaba-cloud-sdk-go/sdk/auth/credentials"
)
func main() {
config := sdk.NewConfig()
// STS トークンを使用して SDK クライアントを初期化します。 STS トークンは、ECS インスタンスにアタッチされている RAM ロールを使用して取得されます。
// この方法は、ECS インスタンス上で実行され、他の Alibaba Cloud リソースにアクセスする必要があるプログラムに適しています。
credential, err := credentials.NewECSRAMRoleCredentialsProviderBuilder().
// "<ROLE_NAME>": 使用する RAM ロールの名前を指定します。環境変数 ALIBABA_CLOUD_ECS_METADATA で roleName パラメーターのデフォルト値を指定できます。例:alice。
WithRoleName(os.Getenv("ALIBABA_CLOUD_ECS_METADATA")).
// true の値は、セキュリティ強化モードが強制的に使用されることを指定します。デフォルト値は false で、システムが最初にセキュリティ強化モードでアクセス認証情報を取得しようとすることを指定します。アクセス認証情報を取得できない場合は、通常モードが使用されます。
//WithDisableIMDSv1(true).
Build()
if err != nil {
panic(err)
}
// <REGION_ID>: SDK クライアントがアクセスする必要がある Alibaba Cloud リージョンを指定します。例:cn-hangzhou。
client, err := sdk.NewClientWithOptions("<REGION_ID>", config, credential)
if err != nil {
panic(err)
}
// API オペレーションを呼び出す手順は省略されています。
}方法 6:OIDC IdP の RAM ロールを使用する
Container Service for Kubernetes (ACK) クラスタのワーカー ノードに RAM ロールをアタッチした後、ワーカー ノード上のポッドはメタデータ サーバーを使用して STS トークンを取得できます。ただし、顧客が開示していないコードのアプリケーションなど、信頼されていないアプリケーションがメタデータ サービスを使用して STS トークンにアクセスできるようにすると、セキュリティ リスクが発生する可能性があります。セキュリティ リスクを防ぎ、最小権限の原則 (PoLP) を実装するには、サービス アカウントの RAM ロール機能を使用することをお勧めします。この機能は、クラウド リソースのセキュリティを向上させ、信頼されていないアプリケーションが安全な方法で STS トークンを取得できるようにします。この場合、ACK クラスタはサービス アカウント OpenID Connect (OIDC) トークン ファイルを作成し、トークン ファイルをポッドに関連付けて、関連する環境変数をポッドに挿入します。 następnie 認証情報ツールは環境変数を使用して、STS の AssumeRoleWithOIDC オペレーションを呼び出し、RAM ロールの STS トークンを取得します。 RRSA 機能の詳細については、「RRSA を使用して異なるポッドに異なるクラウド サービスへのアクセスを許可する」をご参照ください。次の環境変数がポッドに挿入されます。
ALIBABA_CLOUD_ROLE_ARN: RAM ロールの ARN。
ALIBABA_CLOUD_OIDC_PROVIDER_ARN: OIDC IdP の ARN。
ALIBABA_CLOUD_OIDC_TOKEN_FILE: OIDC トークン ファイルのパス。
package main
import (
"os"
"github.com/aliyun/alibaba-cloud-sdk-go/sdk"
"github.com/aliyun/alibaba-cloud-sdk-go/sdk/auth/credentials"
)
func main() {
config := sdk.NewConfig()
// OIDC ID プロバイダー (IdP) の RAM ロールを使用して、SDK クライアントを初期化します。
credential, err := credentials.NewOIDCCredentialsProviderBuilder().
// ALIBABA_CLOUD_OIDC_PROVIDER_ARN 環境変数を指定して、OIDC IdP の ARN を指定します。
WithOIDCProviderARN(os.Getenv("ALIBABA_CLOUD_OIDC_PROVIDER_ARN")).
// ALIBABA_CLOUD_OIDC_TOKEN_FILE 環境変数を指定して、OIDC トークン ファイルのパスを指定します。
WithOIDCTokenFilePath(os.Getenv("ALIBABA_CLOUD_OIDC_TOKEN_FILE")).
// "<Role_Arn>" 必須。RAM ロールの ARN。RAM ロールの ARN は、RAM コンソールで取得できます。例:acs:ram::123456789012****:role/adminrole。
WithRoleArn("<Role_Arn>").
// "<ROLE_SESSION_NAME>" 必須。ロール セッションの名前を指定します。例:alice。
WithRoleSessionName("<ROLE_SESSION_NAME>").
// "<POLICY>": オプション。RAM ロールに制限付き権限を付与します。例:{"Statement": [{"Action": ["*"],"Effect": "Allow","Resource": ["*"]}],"Version":"1"}。
WithPolicy("<POLICY>").
// <ROLE_SESSION_EXPIRATION>: セッションの有効期間を指定します。例:3600。
WithDurationSeconds(3600).
Build()
if err != nil {
panic(err)
}
// <REGION_ID>: SDK クライアントがアクセスする必要がある Alibaba Cloud リージョンを指定します。例:cn-hangzhou。
client, err := sdk.NewClientWithOptions("<REGION_ID>", config, credential)
if err != nil {
panic(err)
}
// API オペレーションを呼び出す手順は省略されています。
}
方法 7:ベアラ トークンを使用する
Cloud Call Centerのみ、ベアラ トークンを使用して SDK クライアントを初期化できます。
package main
import (
"github.com/aliyun/alibaba-cloud-sdk-go/sdk"
"github.com/aliyun/alibaba-cloud-sdk-go/sdk/auth/credentials"
)
func main() {
config := sdk.NewConfig()
// <BEARER_TOKEN> は、API 呼び出しの認証方式のタイプを指定します。
credential := credentials.NewBearerTokenCredentialsProvider("<BEARER_TOKEN>")
// <REGION_ID>: SDK クライアントがアクセスする必要がある Alibaba Cloud リージョンを指定します。例:cn-hangzhou。
client, err := sdk.NewClientWithOptions("<REGION_ID>", config, credential)
if err != nil {
panic(err)
}
// API オペレーションを呼び出す手順は省略されています。
}デフォルトの認証情報プロバイダー チェーン
開発環境と本番環境で異なるタイプの認証情報を使用する場合、通常はコードから環境情報を取得し、コード ブランチを作成して、開発環境と本番環境で異なる認証情報を取得する必要があります。認証情報ツールのデフォルトの認証情報プロバイダー チェーンを使用すると、アプリケーションとは独立した構成に基づいて、同じコードを使用して異なる環境の認証情報を取得できます。 credentials.NewDefaultCredentialsProvider() を使用して初期化方法を指定せずに認証情報クライアントを初期化すると、認証情報ツールは次の順序で認証情報を取得します。
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 ロールが存在する場合、アプリケーションはセキュリティ強化モード (IMDSv2) で ECS のメタデータ サーバーを使用して、RAM ロールの STS トークンをデフォルトの認証情報として取得します。セキュリティ強化モード (IMDSv2) で例外が発生した場合、認証情報ツールは通常モードでアクセス認証情報を取得します。 ALIBABA_CLOUD_IMDSV1_DISABLED 環境変数を構成して、例外処理ロジックを指定することもできます。環境変数の有効な値:
false(デフォルト): 認証情報ツールは通常モードでアクセス認証情報の取得を続けます。true: 例外がスローされ、認証情報ツールはセキュリティ強化モードでアクセス認証情報の取得を続けます。
メタデータ サーバーの構成によって、サーバーがセキュリティ強化モード (IMDSv2) をサポートするかどうかが決まります。
5. 認証情報 URI を使用する
前の手順で認証情報が見つからない場合、認証情報ツールは、認証情報の URI を指定する ALIBABA_CLOUD_CREDENTIALS_URI 環境変数の値を取得します。認証情報の URI が存在する場合、アプリケーションは認証情報の URI を使用して STS トークンをデフォルトの認証情報として取得します。