Go SDKを使用してMaxComputeリクエストを送信する前に、アクセス資格情報を設定して資格情報プロバイダーを初期化する必要があります。 Alibaba Cloudサービスは、これらのアクセス資格情報を使用してIDとアクセス権限を認証します。 MaxComputeには、さまざまな認証と承認のニーズに合わせていくつかの設定方法があります。
前提条件
Go SDKがインストールされています。 詳細については、「Go SDKのインストール」をご参照ください。
アクセス資格情報の設定方法の比較
設定方法 | シナリオ | 事前提供AccessKeyまたはSTSトークンが必要です | 基本的な実装 | 有効期間 | 資格情報のローテーションまたは更新方法 |
安全で安定した、外部攻撃の影響を受けにくい環境に展開されたアプリケーション。 このようなアプリケーションは、頻繁な資格情報のローテーションを必要とせずに、クラウドサービスに長期アクセスできます。 | 必須 | アクセスキー(AccessKey) | 長期 | 手動ローテーション | |
信頼できない環境にデプロイされたアプリケーション。 これらのアプリケーションには、制御されたアクセスの有効性と権限が必要です。 | 必須 | STSトークン | 一時的 | 手動更新 | |
クロスアカウントシナリオなど、承認されたクラウドサービスアクセスを必要とするアプリケーション。 | 必須 | STSトークン | 一時的 | 自動更新 | |
Alibaba Cloud ECSインスタンス、ECIインスタンス、またはContainer Service for Kubernetesワーカーノードにデプロイされたアプリケーション。 | 選択可能 | STSトークン | 一時的 | 自動更新 | |
外部システムからアクセス資格情報を取得する必要があるアプリケーション。 | 選択可能 | STSトークン | 一時的 | 自動更新 | |
または、アクセス資格情報をカスタマイズすることもできます。 | Custom | STSトークン | Custom | Custom |
方法1: AccessKey
アプリケーションが、外部攻撃の影響を受けにくく、MaxComputeへの長期アクセスを必要とするが、認証情報の頻繁な更新を必要としない安全で安定した環境内でデプロイされ、実行されている場合は、Alibaba CloudアカウントまたはRAMユーザーのAccessKey IDとAccessKey Secretを使用して、認証情報プロバイダーを初期化できます。 ただし、AccessKeyを手動で管理すると、セキュリティリスクが発生し、メンテナンスがさらに複雑になります。 AccessKeyの取得に関するガイダンスについては、「CreateAccessKey」をご参照ください。
環境変数
プロジェクトに資格情報の依存関係を追加します。
go get github.com/aliyun/credentials-go/credentialsAKの環境変数を設定します。
macOS X、Linux、およびUnixシステムの場合:
export ALIBABA_CLOUD_ACCESS_KEY_ID=<ALIBABA_CLOUD_ACCESS_KEY_ID> export ALIBABA_CLOUD_ACCESS_KEY_SECRET=<ALIBABA_CLOUD_ACCESS_KEY_SECRET>Windowsシステムの場合:
set ALIBABA_CLOUD_ACCESS_KEY_ID=<ALIBABA_CLOUD_ACCESS_KEY_ID> set ALIBABA_CLOUD_ACCESS_KEY_SECRET=<ALIBABA_CLOUD_ACCESS_KEY_SECRET>
環境変数を使用して資格情報を渡します。
package main import ( "fmt" "github.com/aliyun/aliyun-odps-go-sdk/odps" "github.com/aliyun/aliyun-odps-go-sdk/odps/account" "github.com/aliyun/credentials-go/credentials" ) func main() { // Read AccessKey information from environment variables: “ALIBABA_CLOUD_ACCESS_KEY_ID” and “ALIBABA_CLOUD_ACCESS_KEY_SECRET” credential, err := credentials.NewCredential(nil) if err != nil { return } aliyunAccount := account.NewStsAccountWithCredential(credential) // Get the specific endpoint, using Hangzhou as an example endpoint := "http://service.cn-hangzhou.maxcompute.aliyun.com/api" // Default MaxCompute project defaultProject := "" odpsIns := odps.NewOdps(aliyunAccount, endpoint) odpsIns.SetDefaultProjectName(defaultProject) fmt.Printf("odps:%#v\n", odpsIns) }
設定ファイル
で構成ファイルを作成します。
. iniconfig.iniなどのサフィックス。 次のコードは例を示しています。重要ファイルのキーと値のペアの後にコメントを追加することはできません。
[odps] access_id = "" access_key = "" endpoint = "" project = ""設定ファイルを使用して、設定情報を渡します。
package main import ( "fmt" "github.com/aliyun/aliyun-odps-go-sdk/odps" "github.com/aliyun/aliyun-odps-go-sdk/odps/account" "log" ) func main() { // Configuration file path configPath := "./config.ini" conf, err := odps.NewConfigFromIni(configPath) if err != nil { log.Fatalf("%+v", err) } aliAccount := account.NewAliyunAccount(conf.AccessId, conf.AccessKey) odpsIns := odps.NewOdps(aliAccount, conf.Endpoint) // Set the default MaxCompute project odpsIns.SetDefaultProjectName(conf.ProjectName) fmt.Printf("odps:%#v\n", odpsIns) }
方法2: STSトークン
アプリケーションが一時的にMaxComputeにアクセスする必要がある場合、STSサービスによって取得された一時的なID認証情報 (AccessKey ID、AccessKey Secret、およびSecurity Token) を使用して認証情報プロバイダーを初期化できます。 この方法を使用する場合、STSトークンを手動で管理する必要があります。これにより、セキュリティリスクが発生し、メンテナンスがさらに複雑になる可能性があります。 さらに、アプリケーションでMaxComputeに繰り返し一時的にアクセスする必要がある場合は、そのたびにSTSトークンを手動で更新する必要があります。 STSトークンの取得の詳細については、「AssumeRole」をご参照ください。
環境変数
プロジェクトに資格情報の依存関係を追加します。
go get github.com/aliyun/credentials-go/credentialsSTSトークンの環境変数を設定します。
macOS X、Linux、およびUnixシステムの場合:
export ALIBABA_CLOUD_ACCESS_KEY_ID=<ALIBABA_CLOUD_ACCESS_KEY_ID> export ALIBABA_CLOUD_ACCESS_KEY_SECRET=<ALIBABA_CLOUD_ACCESS_KEY_SECRET> export ALIBABA_CLOUD_SECURITY_TOKEN=<ALIBABA_CLOUD_SECURITY_TOKEN>Windowsシステムの場合:
set ALIBABA_CLOUD_ACCESS_KEY_ID=<ALIBABA_CLOUD_ACCESS_KEY_ID> set ALIBABA_CLOUD_ACCESS_KEY_SECRET=<ALIBABA_CLOUD_ACCESS_KEY_SECRET> set ALIBABA_CLOUD_SECURITY_TOKEN=<ALIBABA_CLOUD_SECURITY_TOKEN>
環境変数によって資格情報を渡します。
package main import ( "fmt" "github.com/aliyun/aliyun-odps-go-sdk/odps" "github.com/aliyun/aliyun-odps-go-sdk/odps/account" "github.com/aliyun/credentials-go/credentials" ) func main() { // Read AccessKey information from environment variables: "ALIBABA_CLOUD_ACCESS_KEY_ID","ALIBABA_CLOUD_ACCESS_KEY_SECRET", "ALIBABA_CLOUD_SECURITY_TOKEN" credential, err := credentials.NewCredential(nil) if err != nil { return } aliyunAccount := account.NewStsAccountWithCredential(credential) // Get the specific endpoint, using Hangzhou as an example endpoint := "http://service.cn-hangzhou.maxcompute.aliyun.com/api" // Default MaxCompute project defaultProject := "" odpsIns := odps.NewOdps(aliyunAccount, endpoint) odpsIns.SetDefaultProjectName(defaultProject) fmt.Printf("odps:%#v\n", odpsIns) }
設定ファイル
で構成ファイルを作成します。
. iniconfig.iniなどのサフィックス。 次のコードは例を示しています。重要ファイル内のキーと値のペアの後にコメントを追加することはできません。
[odps] access_id = "" access_key = "" sts_token = "" endpoint = "" project = ""設定ファイルを使用して、設定情報を渡します。
package main import ( "fmt" "github.com/aliyun/aliyun-odps-go-sdk/odps" "github.com/aliyun/aliyun-odps-go-sdk/odps/account" "log" ) func main() { // Configuration file path configPath := "./config.ini" conf, err := odps.NewConfigFromIni(configPath) if err != nil { log.Fatalf("%+v", err) } aliAccount := account.NewAliyunAccount(conf.AccessId, conf.AccessKey) odpsIns := odps.NewOdps(aliAccount, conf.Endpoint) // Set the default MaxCompute project odpsIns.SetDefaultProjectName(conf.ProjectName) fmt.Printf("odps:%#v\n", odpsIns) }
方法3: RAMRoleARN
アプリケーションでMaxComputeへのアクセス許可が必要な場合 (OSSへのクロスAlibaba Cloudアカウントアクセスなど) 、RAMRoleARNを使用して認証情報プロバイダーを初期化できます。 このアプローチの基本的な実装はSTSサービスです。 RAMロールのARNを指定すると、資格情報ツールはSTSサービスを呼び出してSTSトークンを取得し、セッションの有効期限が切れる前にSTSトークンを自動的に更新します。 さらに、ポリシーを割り当てることで、RAMロールをより小さな権限セットに制限できます。 ただし、この方法では、AccessKeyまたはSTSトークンを提供する必要があります。これにより、セキュリティリスクが発生し、メンテナンスが複雑になる可能性があります。 AccessKeyまたはSTSトークンの取得の詳細については、「CreateAccessKey」または「AssumeRole」をご参照ください。 RAMRoleARNの取得の詳細については、「CreateRole」をご参照ください。
プロジェクトに資格情報の依存関係を追加します。
go get github.com/aliyun/credentials-go/credentialsアクセス資格情報を設定します。
package main import ( "fmt" "github.com/aliyun/aliyun-odps-go-sdk/odps" "github.com/aliyun/aliyun-odps-go-sdk/odps/account" "github.com/aliyun/credentials-go/credentials" "log" ) func main() { // Obtain AccessKey information accessKeyId := "" accessKeySecret := "" config := new(credentials.Config). // Required credential type SetType("ram_role_arn"). // AccessKey ID of the cloud account SetAccessKeyId(accessKeyId). // AccessKey Secret of the cloud account SetAccessKeySecret(accessKeySecret). // RoleArn format: acs:ram::USER_Id:role/ROLE_NAME SetRoleArn("RoleArn"). // RoleSession name SetRoleSessionName("RoleSessionName"). // Optional, restrict the permissions of the STS token SetPolicy("Policy"). // Optional, restrict the validity period of the STS token SetRoleSessionExpiration(3600) credential, err := credentials.NewCredential(config) if err != nil { log.Fatalf("%+v", err) } stsAccount := account.NewStsAccountWithCredential(credential) // Get the specific endpoint, using Hangzhou as an example endpoint := "http://service.cn-hangzhou.maxcompute.aliyun.com/api" // Default MaxCompute project defaultProject := "" odpsIns := odps.NewOdps(stsAccount, endpoint) odpsIns.SetDefaultProjectName(defaultProject) fmt.Printf("odps:%#v\n", odpsIns) }
方法4: ECSRAMRole
アプリケーションがECSインスタンス、ECIインスタンス、またはContainer Service for Kubernetesワーカーノードで実行されている場合、ECSRAMRoleを使用して認証情報プロバイダーを初期化することをお勧めします。 このアプローチの基本的な実装はSTSトークンです。 この方法では、AccessKeyまたはSTSトークンを必要としないため、AccessKeyまたはSTSトークンを手動で管理することに関連するリスクが排除されます。 ECSRAMRoleの取得方法の詳細については、「CreateRole」をご参照ください。
プロジェクトに資格情報の依存関係を追加します。
go get github.com/aliyun/credentials-go/credentialsアクセス資格情報としてECSRAMRoleを設定します。
package main import ( "fmt" "log" "github.com/aliyun/aliyun-odps-go-sdk/odps" "github.com/aliyun/aliyun-odps-go-sdk/odps/account" "github.com/aliyun/credentials-go/credentials" ) func main(){ config := new(credentials.Config). // Credential type SetType("ecs_ram_role"). // "roleName" is optional. If not set, it will be automatically search. We recommended to set it for reducing requests SetRoleName("RoleName"). // "DisableIMDSv1" is optional and recommended to be enabled. It can be replaced by configuring the environment variable: ALIBABA_CLOUD_IMDSV1_DISABLED SetDisableIMDSv1(true) credential, err := credentials.NewCredential(config) if err != nil { log.Fatalf("%+v", err) } stsAccount := account.NewStsAccountWithCredential(credential) // Get the specific endpoint, using Hangzhou as an example endpoint := "http://service.cn-hangzhou.maxcompute.aliyun.com/api" // Default MaxCompute project defaultProject := "" odpsIns := odps.NewOdps(stsAccount, endpoint) odpsIns.SetDefaultProjectName(defaultProject) fmt.Printf("odps:%#v\n", odpsIns) }
方法5: CredentialsURI
アプリケーションが外部システムを介してAlibaba Cloudの資格情報を取得し、柔軟な資格情報管理とキーレスアクセスを実現する必要がある場合は、CredentialsURIを使用して資格情報プロバイダーを初期化できます。 このメソッドの基本的な実装は、STSトークンに基づいています。 資格情報ツールは、指定したURIを介してSTSトークンを取得し、資格情報クライアントの初期化を完了します。 この方法では、AccessKeyまたはSTSトークンを提供する必要がないため、AccessKeyまたはSTSトークンを手動で管理することに関連するリスクが排除されます。 CredentialsURIに応答するバックエンドサービスは、STSトークンの自動更新ロジックを実装して、アプリケーションが常に有効な資格情報を取得できるようにする必要があります。
CredentialsツールがSTSトークンを正しく解析して利用するには、URIが次の応答プロトコルに従う必要があります。
応答ステータスコード: 200
レスポンスボディの構造:
{ "Code": "Success", "AccessKeySecret": "AccessKeySecret", "AccessKeyId": "AccessKeyId", "Expiration": "2024-10-09T16:39:33Z", "SecurityToken": "SecurityToken" }
プロジェクトに資格情報の依存関係を追加します。
go get github.com/aliyun/credentials-go/credentialsアクセス資格情報としてCredentialsURIを設定します。
package main import ( "fmt" "github.com/aliyun/aliyun-odps-go-sdk/odps" "github.com/aliyun/aliyun-odps-go-sdk/odps/account" "github.com/aliyun/credentials-go/credentials" ) func main() { config := new(credentials.Config).SetType("credentials_uri").SetURLCredential("<yourCredentialsURI>") credential, err := credentials.NewCredential(config) if err != nil { return } stsAccount := account.NewStsAccountWithCredential(credential) // Get the specific endpoint, using Hangzhou as an example endpoint := "http://service.cn-hangzhou.maxcompute.aliyun.com/api" // Default MaxCompute project defaultProject := "" odpsIns := odps.NewOdps(stsAccount, endpoint) odpsIns.SetDefaultProjectName(defaultProject) fmt.Printf("odps:%#v\n", odpsIns) }
方法6: アクセス資格情報のカスタム化
上記の資格情報の構成方法のいずれも要件を満たしていない場合は、CredentialProviderインターフェイスを実装して資格情報のプロビジョニング方法をカスタマイズすることもできます。 これにより、資格情報をアプリケーションに提供する方法について独自のロジックを定義でき、資格情報管理の柔軟性と制御性を高めます。
package main
import (
"fmt"
"github.com/aliyun/aliyun-odps-go-sdk/odps"
"github.com/aliyun/aliyun-odps-go-sdk/odps/account"
"github.com/aliyun/credentials-go/credentials"
)
type CustomCredentialProvider struct {
}
func (cp *CustomCredentialProvider) GetType() (*string, error) {
s := "CustomProvider"
return &s, nil
}
func (cp *CustomCredentialProvider) GetCredential() (*credentials.CredentialModel, error) {
accessKeyId := ""
accessKeySecurity := ""
accessKeyToken := ""
return &credentials.CredentialModel{
AccessKeyId: &accessKeyId,
AccessKeySecret: &accessKeyToken,
SecurityToken: &accessKeySecurity,
}, nil
}
func main() {
provider := &CustomCredentialProvider{}
stsAccount := account.NewStsAccountWithProvider(provider)
// Get the specific endpoint, using Hangzhou as an example
endpoint := "http://service.cn-hangzhou.maxcompute.aliyun.com/api"
// Default MaxCompute project
defaultProject := ""
odpsIns := odps.NewOdps(stsAccount, endpoint)
odpsIns.SetDefaultProjectName(defaultProject)
fmt.Printf("odps:%#v\n", odpsIns)
}次に何をする?
アクセス資格情報を設定した後、MaxCompute SDKを初期化できます。 詳細な手順については、「MaxCompute SDKの初期化」をご参照ください。