Tablestore は、複数のタイプのアクセス資格情報をサポートしています。ビジネスシナリオの認証および権限付与の要件に基づいて、適切なアクセス資格情報を選択できます。
アクセス資格情報の選択
Tablestore は、AccessKey (AK) や STS トークンなどのアクセス資格情報タイプと、複数の設定方法をサポートしています。次の表では、さまざまな設定方法の適用可能なシナリオと SDK サポートについて説明します。
アクセス資格情報の設定方法 | シナリオ | AccessKey ペアまたは STS トークンが必要 | 基盤となる実装資格情報 | 資格情報の有効期間 | 資格情報のローテーションまたはリフレッシュ方法 | SDK サポート |
アプリケーションは、外部攻撃に対して脆弱でなく、頻繁な資格情報のローテーションなしで長期間にわたってクラウドサービスにアクセスする必要がある、安全で安定した環境にデプロイおよび実行されます | はい | AK | 長期 | 手動ローテーション | Java、Go、Python、Node.js、.NET、PHP | |
アプリケーションは信頼できない環境にデプロイおよび実行され、その場合、資格情報の有効期間とアクセス可能なリソースを管理したい | はい | STS トークン | 一時的 | 手動リフレッシュ | Java、Go、Python、Node.js、PHP | |
アプリケーションは、クラウドサービスへのクロスアカウントアクセスなど、クラウドサービスにアクセスするための権限付与が必要です | はい | STS トークン | 一時的 | 自動リフレッシュ | Java | |
アプリケーションは、Elastic Compute Service (ECS) インスタンス、Elastic Container Instance、および Container Service for Kubernetes (ACK) ワーカーノードにデプロイおよび実行されます | いいえ | STS トークン | 一時的 | 自動リフレッシュ | Java | |
信頼できないアプリケーションが Container Service for Kubernetes ワーカーノードにデプロイおよび実行されます | いいえ | STS トークン | 一時的 | 自動リフレッシュ | Java | |
アプリケーションの関数は Function Compute にデプロイおよび実行されます | いいえ | STS トークン | 一時的 | リフレッシュ不要 | Java、Python | |
アプリケーションは外部システムからのアクセス資格情報を必要とします | いいえ | STS トークン | 一時的 | 自動リフレッシュ | Java | |
AccessKey ペアの漏洩リスクが高く、アクセス資格情報の頻繁なローテーションが必要な環境にアプリケーションがデプロイおよび実行されます | いいえ | AK | 長期 | 自動ローテーション | Java | |
上記のどの方法も要件を満たさない場合、カスタムメソッドを使用してアクセス資格情報を取得できます | カスタム | カスタム | カスタム | カスタム | Java |
アクセス資格情報の設定方法
RAM ユーザーの AccessKey ペアを使用する
RAM ユーザーの AccessKey ペア (AccessKey ID と AccessKey Secret) を使用してアクセス資格情報を設定します。この方法では、AccessKey ペアを手動でメンテナンスする必要があり、セキュリティリスクをもたらし、メンテナンスの複雑さを増大させます。
Alibaba Cloud アカウントは、アカウント内のリソースに対する完全な権限を持っています。Alibaba Cloud アカウントの AccessKey ペアが漏洩すると、重大なセキュリティ脅威となります。したがって、最小限の必要な権限が付与された RAM ユーザーの AccessKey ペアを使用することを推奨します。RAM ユーザーの AccessKey ペアを取得する方法については、「RAM ユーザーの AccessKey ペアを使用して Tablestore にアクセスする」をご参照ください。
この方法を使用する場合、環境変数または静的資格情報を使用して資格情報を設定できます。以下に詳細な設定について説明します。
環境変数
環境変数を設定します。設定が完了したら、IDE、コマンドラインインターフェイス、その他のデスクトップアプリケーション、およびバックグラウンドサービスを含むコンパイルおよびランタイム環境を再起動またはリフレッシュして、最新のシステム環境変数が正常にロードされるようにします。
Linux
コマンドラインインターフェイスで次のコマンドを実行して、環境変数の設定を
~/.bashrcファイルに追加します。echo "export TABLESTORE_ACCESS_KEY_ID='YOUR_ACCESS_KEY_ID'" >> ~/.bashrc echo "export TABLESTORE_ACCESS_KEY_SECRET='YOUR_ACCESS_KEY_SECRET'" >> ~/.bashrc次のコマンドを実行して、変更を有効にします。
source ~/.bashrc次のコマンドを実行して、環境変数が有効になったかどうかを確認します。
echo $TABLESTORE_ACCESS_KEY_ID echo $TABLESTORE_ACCESS_KEY_SECRET
macOS
ターミナルで次のコマンドを実行して、デフォルトの Shell タイプを確認します。
echo $SHELLデフォルトの Shell タイプに基づいて操作を実行します。
Zsh
次のコマンドを実行して、環境変数の設定を
~/.zshrcファイルに追加します。echo "export TABLESTORE_ACCESS_KEY_ID='YOUR_ACCESS_KEY_ID'" >> ~/.zshrc echo "export TABLESTORE_ACCESS_KEY_SECRET='YOUR_ACCESS_KEY_SECRET'" >> ~/.zshrc次のコマンドを実行して、変更を有効にします。
source ~/.zshrc次のコマンドを実行して、環境変数が有効になったかどうかを確認します。
echo $TABLESTORE_ACCESS_KEY_ID echo $TABLESTORE_ACCESS_KEY_SECRET
Bash
次のコマンドを実行して、環境変数の設定を
~/.bash_profileファイルに追加します。echo "export TABLESTORE_ACCESS_KEY_ID='YOUR_ACCESS_KEY_ID'" >> ~/.bash_profile echo "export TABLESTORE_ACCESS_KEY_SECRET='YOUR_ACCESS_KEY_SECRET'" >> ~/.bash_profile次のコマンドを実行して、変更を有効にします。
source ~/.bash_profile次のコマンドを実行して、環境変数が有効になったかどうかを確認します。
echo $TABLESTORE_ACCESS_KEY_ID echo $TABLESTORE_ACCESS_KEY_SECRET
Windows
CMD
CMD で次のコマンドを実行して、環境変数を設定します。
setx TABLESTORE_ACCESS_KEY_ID "YOUR_ACCESS_KEY_ID" setx TABLESTORE_ACCESS_KEY_SECRET "YOUR_ACCESS_KEY_SECRET"CMD を再起動した後、次のコマンドを実行して環境変数が有効になったかどうかを確認します。
echo %TABLESTORE_ACCESS_KEY_ID% echo %TABLESTORE_ACCESS_KEY_SECRET%
PowerShell
PowerShell で次のコマンドを実行します。
[Environment]::SetEnvironmentVariable("TABLESTORE_ACCESS_KEY_ID", "YOUR_ACCESS_KEY_ID", [EnvironmentVariableTarget]::User) [Environment]::SetEnvironmentVariable("TABLESTORE_ACCESS_KEY_SECRET", "YOUR_ACCESS_KEY_SECRET", [EnvironmentVariableTarget]::User)次のコマンドを実行して、環境変数が有効になったかどうかを確認します。
[Environment]::GetEnvironmentVariable("TABLESTORE_ACCESS_KEY_ID", [EnvironmentVariableTarget]::User) [Environment]::GetEnvironmentVariable("TABLESTORE_ACCESS_KEY_SECRET", [EnvironmentVariableTarget]::User)
環境変数を使用して資格情報を渡します。
import com.alicloud.openservices.tablestore.core.auth.CredentialsProviderFactory; import com.alicloud.openservices.tablestore.core.auth.EnvironmentVariableCredentialsProvider; public class AkDemoTest { public static void main(String[] args) throws Exception { { // 例 1: 環境変数からアクセス資格情報を取得します。 EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider(); // credentialsProvider を使用して後続の操作を実行します。 } { // 例 2: 環境変数から AccessKey ID と AccessKey Secret を取得します。 final String accessKeyId = System.getenv("TABLESTORE_ACCESS_KEY_ID"); final String accessKeySecret = System.getenv("TABLESTORE_ACCESS_KEY_SECRET"); // AccessKey ID と AccessKey Secret を使用して後続の操作を実行します。 } } }accessKeyId := os.Getenv("TABLESTORE_ACCESS_KEY_ID") accessKeySecret := os.Getenv("TABLESTORE_ACCESS_KEY_SECRET")# -*- coding: utf-8 -*- import os access_key_id = os.getenv("TABLESTORE_ACCESS_KEY_ID") access_key_secret = os.getenv("TABLESTORE_ACCESS_KEY_SECRET")var accessKeyId = process.env.TABLESTORE_ACCESS_KEY_ID; var secretAccessKey = process.env.TABLESTORE_ACCESS_KEY_SECRET;// 環境変数からアクセス資格情報を取得します。 var AccessKeyId = Environment.GetEnvironmentVariable("TABLESTORE_ACCESS_KEY_ID"); var AccessKeySecret = Environment.GetEnvironmentVariable("TABLESTORE_ACCESS_KEY_SECRET");$accessKeyId = getenv('TABLESTORE_ACCESS_KEY_ID'); $accessKeySecret = getenv('TABLESTORE_ACCESS_KEY_SECRET');
静的資格情報
コードで変数を指定することで、資格情報を参照できます。実行時環境では、変数は環境変数、構成ファイル、またはその他の外部データソースからの実際の資格情報の値によって渡されます。
次の手順では、設定ファイルを例として、一般的な Tablestore SDK で静的資格情報を使用する方法について説明します。
config.iniという名前の設定ファイルを作成します。[configName] TABLESTORE_ACCESS_KEY_ID = your_access_key_id TABLESTORE_ACCESS_KEY_SECRET = your_access_key_secret構成ファイルを使用して資格情報を渡します。
import com.alicloud.openservices.tablestore.core.auth.CredentialsProvider; import com.alicloud.openservices.tablestore.core.auth.DefaultCredentialProvider; import java.io.FileInputStream; import java.util.Properties; public class AkDemoTest { public static void main(String[] args) throws Exception { Properties properties = new Properties(); // config.ini ファイルのパスを指定します。実際のパスを使用してください。 String configFilePath = "config.ini"; // 設定ファイルを読み取ります。 FileInputStream input = new FileInputStream(configFilePath); properties.load(input); input.close(); // 設定ファイルから AccessKey ペアを取得します。 String accessKeyId = properties.getProperty("TABLESTORE_ACCESS_KEY_ID"); String accessKeySecret = properties.getProperty("TABLESTORE_ACCESS_KEY_SECRET"); CredentialsProvider credentialsProvider = new DefaultCredentialProvider(accessKeyId, accessKeySecret); // 後続の操作には credentialsProvider を使用します。 } }// 設定ファイルを読み取ります。実際のパスを使用してください。 config, err := ini.Load("config.ini") if err != nil { fmt.Println("Failed to read the configuration file:", err) } // 設定ファイルから AccessKey ID と AccessKey Secret を取得します。 access_key_id := config.Section("configName").Key("TABLESTORE_ACCESS_KEY_ID").String() access_key_secret := config.Section("configName").Key("TABLESTORE_ACCESS_KEY_SECRET").String()# -*- coding: utf-8 -*- import configparser # 設定ファイルを読み取ります config = configparser.ConfigParser() # config.ini がスクリプトと同じディレクトリにあると仮定します。実際のパスを使用してください。 config.read('config.ini') # 設定ファイルから AccessKey ID と AccessKey Secret を取得します。 access_key_id = config.get('configName', 'TABLESTORE_ACCESS_KEY_ID') access_key_secret = config.get('configName', 'TABLESTORE_ACCESS_KEY_SECRET')try { // 設定ファイルを読み取ります。config.ini がスクリプトと同じディレクトリにあると仮定します。実際のパスを使用してください。 $config = parse_ini_file('config.ini'); // AccessKey ID と AccessKey Secret を取得します。 $accessKeyId = $config['TABLESTORE_ACCESS_KEY_ID']; $accessKeySecret = $config['TABLESTORE_ACCESS_KEY_SECRET']; }catch (Exception $e) { printf($e->getMessage() . "\n"); return; }
STS の一時的なアクセス資格情報を使用する
STS から取得した一時的なアクセス資格情報 (AccessKey ID、AccessKey Secret、およびセキュリティトークン) を使用してアクセス資格情報を設定します。この方法では、STS トークンを手動でメンテナンスする必要があり、セキュリティリスクをもたらし、メンテナンスの複雑さを増大させます。Tablestore に複数回アクセスする場合は、STS トークンを手動でリフレッシュする必要があります。STS の一時的なアクセス資格情報を取得する方法については、「STS から取得した一時的なアクセス資格情報を使用して Tablestore にアクセスする」をご参照ください。
この方法を使用する場合、環境変数または静的資格情報を使用して一時的なアクセス資格情報を設定できます。以下に詳細な設定について説明します。
環境変数
環境変数を設定します。設定が完了したら、IDE、コマンドラインインターフェイス、その他のデスクトップアプリケーション、およびバックグラウンドサービスを含むコンパイルおよびランタイム環境を再起動またはリフレッシュして、最新のシステム環境変数が正常にロードされるようにします。
Linux
コマンドラインインターフェイスで次のコマンドを実行して、環境変数の設定を
~/.bashrcファイルに追加します。echo "export TABLESTORE_ACCESS_KEY_ID='YOUR_STS_ACCESS_KEY_ID'" >> ~/.bashrc echo "export TABLESTORE_ACCESS_KEY_SECRET='YOUR_STS_ACCESS_KEY_SECRET'" >> ~/.bashrc echo "export TABLESTORE_SESSION_TOKEN='YOUR_STS_TOKEN'" >> ~/.bashrc次のコマンドを実行して、変更を有効にします。
source ~/.bashrc次のコマンドを実行して、環境変数が有効になったかどうかを確認します。
echo $TABLESTORE_ACCESS_KEY_ID echo $TABLESTORE_ACCESS_KEY_SECRET echo $TABLESTORE_SESSION_TOKEN
macOS
ターミナルで次のコマンドを実行して、デフォルトの Shell タイプを確認します。
echo $SHELLデフォルトの Shell タイプに基づいて操作を実行します。
Zsh
次のコマンドを実行して、環境変数の設定を
~/.zshrcファイルに追加します。echo "export TABLESTORE_ACCESS_KEY_ID='YOUR_STS_ACCESS_KEY_ID'" >> ~/.zshrc echo "export TABLESTORE_ACCESS_KEY_SECRET='YOUR_STS_ACCESS_KEY_SECRET'" >> ~/.zshrc echo "export TABLESTORE_SESSION_TOKEN='YOUR_STS_TOKEN'" >> ~/.zshrc次のコマンドを実行して、変更を有効にします。
source ~/.zshrc次のコマンドを実行して、環境変数が有効になったかどうかを確認します。
echo $TABLESTORE_ACCESS_KEY_ID echo $TABLESTORE_ACCESS_KEY_SECRET echo $TABLESTORE_SESSION_TOKEN
Bash
次のコマンドを実行して、環境変数の設定を
~/.bash_profileファイルに追加します。echo "export TABLESTORE_ACCESS_KEY_ID='YOUR_STS_ACCESS_KEY_ID'" >> ~/.bash_profile echo "export TABLESTORE_ACCESS_KEY_SECRET='YOUR_STS_ACCESS_KEY_SECRET'" >> ~/.bash_profile echo "export TABLESTORE_SESSION_TOKEN='YOUR_STS_TOKEN'" >> ~/.bash_profile次のコマンドを実行して、変更を有効にします。
source ~/.bash_profile次のコマンドを実行して、環境変数が有効になったかどうかを確認します。
echo $TABLESTORE_ACCESS_KEY_ID echo $TABLESTORE_ACCESS_KEY_SECRET echo $TABLESTORE_SESSION_TOKEN
Windows
CMD
CMD で次のコマンドを実行して、環境変数を設定します。
setx TABLESTORE_ACCESS_KEY_ID "YOUR_STS_ACCESS_KEY_ID" setx TABLESTORE_ACCESS_KEY_SECRET "YOUR_STS_ACCESS_KEY_SECRET" setx TABLESTORE_SESSION_TOKEN "YOUR_STS_TOKEN"CMD を再起動した後、次のコマンドを実行して環境変数が有効になったかどうかを確認します。
echo %TABLESTORE_ACCESS_KEY_ID% echo %TABLESTORE_ACCESS_KEY_SECRET% echo %TABLESTORE_SESSION_TOKEN%
PowerShell
PowerShell で次のコマンドを実行します。
[Environment]::SetEnvironmentVariable("TABLESTORE_ACCESS_KEY_ID", "YOUR_STS_ACCESS_KEY_ID", [EnvironmentVariableTarget]::User) [Environment]::SetEnvironmentVariable("TABLESTORE_ACCESS_KEY_SECRET", "YOUR_STS_ACCESS_KEY_SECRET", [EnvironmentVariableTarget]::User) [Environment]::SetEnvironmentVariable("TABLESTORE_SESSION_TOKEN", "YOUR_STS_TOKEN", [EnvironmentVariableTarget]::User)次のコマンドを実行して、環境変数が有効になったかどうかを確認します。
[Environment]::GetEnvironmentVariable("TABLESTORE_ACCESS_KEY_ID", [EnvironmentVariableTarget]::User) [Environment]::GetEnvironmentVariable("TABLESTORE_ACCESS_KEY_SECRET", [EnvironmentVariableTarget]::User) [Environment]::GetEnvironmentVariable("TABLESTORE_SESSION_TOKEN", [EnvironmentVariableTarget]::User)
環境変数を使用して資格情報を渡します。
import com.alicloud.openservices.tablestore.core.auth.CredentialsProviderFactory; import com.alicloud.openservices.tablestore.core.auth.EnvironmentVariableCredentialsProvider; public class StsDemoTest { public static void main(String[] args) throws Exception { { // 例 1: 環境変数からアクセス資格情報を取得します。 EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider(); // 後続の操作には credentialsProvider を使用します。 } { // 例 2: 環境変数から AccessKey ID、AccessKey Secret、およびセキュリティトークンを取得します。 final String accessKeyId = System.getenv("TABLESTORE_ACCESS_KEY_ID"); final String accessKeySecret = System.getenv("TABLESTORE_ACCESS_KEY_SECRET"); final String securityToken = System.getenv("TABLESTORE_SESSION_TOKEN"); // AccessKey ID、AccessKey Secret、およびセキュリティトークンを使用して後続の操作を実行します。 } } }accessKeyId := os.Getenv("TABLESTORE_ACCESS_KEY_ID") accessKeySecret := os.Getenv("TABLESTORE_ACCESS_KEY_SECRET") securityToken := os.Getenv("TABLESTORE_SESSION_TOKEN")# -*- coding: utf-8 -*- import os access_key_id = os.getenv("TABLESTORE_ACCESS_KEY_ID") access_key_secret = os.getenv("TABLESTORE_ACCESS_KEY_SECRET") sts_token = os.getenv("TABLESTORE_SESSION_TOKEN")var accessKeyId = process.env.TABLESTORE_ACCESS_KEY_ID; var secretAccessKey = process.env.TABLESTORE_ACCESS_KEY_SECRET; var stsToken = process.env.TABLESTORE_SESSION_TOKEN;$accessKeyId = getenv('TABLESTORE_ACCESS_KEY_ID'); $accessKeySecret = getenv('TABLESTORE_ACCESS_KEY_SECRET'); $securityToken = getenv('TABLESTORE_SESSION_TOKEN');
静的資格情報
コードで変数を指定することで、資格情報を参照できます。実行時環境では、変数は環境変数、構成ファイル、またはその他の外部データソースからの実際の資格情報の値によって渡されます。
次の手順では、設定ファイルを例として、一般的な Tablestore SDK で静的資格情報を使用する方法について説明します。
config.iniという名前の設定ファイルを作成します。[configName] TABLESTORE_ACCESS_KEY_ID = your_sts_access_key_id TABLESTORE_ACCESS_KEY_SECRET = your_sts_access_key_secret TABLESTORE_SESSION_TOKEN = your_sts_token構成ファイルを使用して資格情報を渡します。
import com.alicloud.openservices.tablestore.core.auth.CredentialsProvider; import com.alicloud.openservices.tablestore.core.auth.DefaultCredentialProvider; import java.io.FileInputStream; import java.util.Properties; public class StsDemoTest { public static void main(String[] args) throws Exception { Properties properties = new Properties(); // config.ini ファイルのパスを指定します。実際のパスを使用してください。 String configFilePath = "config.ini"; // 設定ファイルを読み取ります。 FileInputStream input = new FileInputStream(configFilePath); properties.load(input); input.close(); // 設定ファイルから AccessKey ペアとセキュリティトークンを取得します。 String accessKeyId = properties.getProperty("TABLESTORE_ACCESS_KEY_ID"); String accessKeySecret = properties.getProperty("TABLESTORE_ACCESS_KEY_SECRET"); String securityToken = properties.getProperty("TABLESTORE_SESSION_TOKEN"); CredentialsProvider credentialsProvider = new DefaultCredentialProvider(accessKeyId, accessKeySecret, securityToken); // 後続の操作には credentialsProvider を使用します。 } }// 設定ファイルを読み取ります。実際のパスを使用してください。 config, err := ini.Load("config.ini") if err != nil { fmt.Println("Failed to read the configuration file:", err) } // 設定ファイルから AccessKey ID と AccessKey Secret を取得します。 access_key_id := config.Section("configName").Key("TABLESTORE_ACCESS_KEY_ID").String() access_key_secret := config.Section("configName").Key("TABLESTORE_ACCESS_KEY_SECRET").String() security_token := config.Section("configName").Key("TABLESTORE_SESSION_TOKEN").String()# -*- coding: utf-8 -*- import configparser # 設定ファイルを読み取ります config = configparser.ConfigParser() # config.ini がスクリプトと同じディレクトリにあると仮定します。実際のパスを使用してください。 config.read('config.ini') # 設定ファイルから AccessKey ID と AccessKey Secret を取得します。 access_key_id = config.get('configName', 'TABLESTORE_ACCESS_KEY_ID') access_key_secret = config.get('configName', 'TABLESTORE_ACCESS_KEY_SECRET') security_token = config.get('configName', 'TABLESTORE_SESSION_TOKEN')try { // 設定ファイルを読み取ります。config.ini がスクリプトと同じディレクトリにあると仮定します。実際のパスを使用してください。 $config = parse_ini_file('config.ini'); // AccessKey ID、AccessKey Secret、およびセキュリティトークンを取得します。 $accessKeyId = $config['TABLESTORE_ACCESS_KEY_ID']; $accessKeySecret = $config['TABLESTORE_ACCESS_KEY_SECRET']; $securityToken = $config['TABLESTORE_SESSION_TOKEN']; }catch (Exception $e) { printf($e->getMessage() . "\n"); return; }
RAMRoleARN を使用する
RAMRoleARN を使用してアクセス資格情報を設定します。この方法の基盤となるロジックは、STS トークンを使用してアクセス資格情報を設定することです。RAM ロールの Alibaba Cloud リソースネーム (ARN) を指定することにより、Credentials ツールは STS からセキュリティトークンを取得し、セッションが期限切れになる前にセキュリティトークンを自動的にリフレッシュします。policy パラメーターを指定して、RAM ロールに付与される権限を制限することもできます。この方法では AccessKey ペアを提供する必要があり、セキュリティリスクをもたらし、メンテナンスの複雑さを増大させます。AccessKey ペアの取得方法については、「CreateAccessKey」をご参照ください。RAM ロールの ARN を取得する方法については、「CreateRole」をご参照ください。
credentials の依存関係を追加します。
<!-- https://mvnrepository.com/artifact/comaliyun/credentials-java --> <dependency> <groupId>com.aliyun</groupId> <artifactId>credentials-java</artifactId> <version>0.3.4</version> </dependency>AccessKey ペアと RAM ロールの ARN をアクセス資格情報として使用します。
import com.alicloud.openservices.tablestore.core.auth.CredentialsProvider; import com.alicloud.openservices.tablestore.core.auth.DefaultCredentials; import com.alicloud.openservices.tablestore.core.auth.ServiceCredentials; import com.aliyun.credentials.models.CredentialModel; public class RamRoleArnAkDemoTest { public static void main(String[] args) { com.aliyun.credentials.models.Config config = new com.aliyun.credentials.models.Config(); // 資格情報のタイプを ram_role_arn に設定します。 config.setType("ram_role_arn"); // RAM ユーザーが偽装する RAM ロールの ARN を指定します。ALIBABA_CLOUD_ROLE_ARN 環境変数を使用して RAM ロールの ARN を指定できます。例: acs:ram::123456789012****:role/adminrole。 config.setRoleArn("<RoleArn>"); // 環境変数から AccessKey ID を取得します。 config.setAccessKeyId(System.getenv().get("TABLESTORE_ACCESS_KEY_ID")); // 環境変数から AccessKey Secret を取得します。 config.setAccessKeySecret(System.getenv().get("TABLESTORE_ACCESS_KEY_SECRET")); // RAM ロールのセッション名を指定します。 config.setRoleName("roleSessionName"); // (オプション) RAM ロールに限定された権限を指定します。例: {"Statement": [{"Action": ["*"],"Effect": "Allow","Resource": ["*"]}],"Version":"1"} config.setPolicy("<Policy>"); // (オプション) ロールセッションの有効期間を指定します。 config.setRoleSessionExpiration(3600); final com.aliyun.credentials.Client credentialsClient = new com.aliyun.credentials.Client(config); CredentialsProvider credentialsProvider = new CredentialsProvider(){ @Override public void setCredentials(ServiceCredentials credentials) { } @Override public ServiceCredentials getCredentials() { CredentialModel credential = credentialsClient.getCredential(); return new DefaultCredentials(credential.getAccessKeyId(), credential.getAccessKeySecret(), credential.getSecurityToken()); } }; // 後続の操作には credentialsProvider を使用します。 } }
ECSRAMRole を使用する
ECS RAM ロールを使用してアクセス資格情報を設定します。この方法の基盤となるロジックは、STS トークンを使用することです。ECS RAM ロールを使用すると、ロールを ECS インスタンス、ECI インスタンス、または Container Service for Kubernetes ワーカーノードに関連付けて、インスタンス上の STS トークンを自動的にリフレッシュできます。この方法では、AccessKey ペアや STS トークンを提供する必要がないため、AccessKey ペアや STS トークンを手動でメンテナンスする際に生じるリスクが排除されます。ECS RAM ロールの取得方法については、「CreateRole」をご参照ください。
credentials の依存関係を追加します。
<!-- https://mvnrepository.com/artifact/com.aliyun/credentials-java --> <dependency> <groupId>com.aliyun</groupId> <artifactId>credentials-java</artifactId> <version>0.3.4</version> </dependency>RAM ロールを使用してアクセス資格情報を提供します。
import com.alicloud.openservices.tablestore.core.auth.CredentialsProvider; import com.alicloud.openservices.tablestore.core.auth.DefaultCredentials; import com.alicloud.openservices.tablestore.core.auth.ServiceCredentials; import com.aliyun.credentials.models.CredentialModel; public class EcsRamRoleDemoTest { public static void main(String[] args) { com.aliyun.credentials.models.Config config = new com.aliyun.credentials.models.Config(); // 資格情報の種類を ecs_ram_role に設定します。 config.setType("ecs_ram_role"); // (オプション) ECS インスタンスにアタッチされている RAM ロールの名前を指定します。このパラメーターを構成しない場合、システムは自動的に RAM ロールを検索します。リクエスト数を減らすために、このパラメーターを構成することをお勧めします。 config.setRoleName("ECSRAMRole"); //(オプション) ECS インスタンスのメタデータのセキュリティ強化モードを有効にします。システム全体のセキュリティを向上させるために、このパラメーターを構成することをお勧めします。 config.setEnableIMDSv2(true); final com.aliyun.credentials.Client credentialsClient = new com.aliyun.credentials.Client(config); CredentialsProvider credentialsProvider = new CredentialsProvider(){ @Override public void setCredentials(ServiceCredentials credentials) { } @Override public ServiceCredentials getCredentials() { CredentialModel credential = credentialsClient.getCredential(); return new DefaultCredentials(credential.getAccessKeyId(), credential.getAccessKeySecret(), credential.getSecurityToken()); } }; // 後続の操作を実行するために credentialsProvider を使用します。 } }
OIDCRoleARN を使用する
Container Service for Kubernetes (ACK) のワーカーノードに RAM ロールを設定した後、ノード上の Pod 内のアプリケーションは、ECS にデプロイされたアプリケーションと同様に、メタデータサービス (Meta Data Server) から関連付けられたロールの STS トークンを取得できます。ただし、信頼できないアプリケーションがコンテナークラスターにデプロイされている場合 (たとえば、コードが利用できない顧客から提出されたアプリケーションなど)、ワーカーノードインスタンスに関連付けられた RAM ロールの STS トークンをメタデータサービスから取得させたくない場合があります。クラウドリソースのセキュリティを確保し、信頼できないアプリケーションが必要な STS トークンを安全に取得できるようにし、アプリケーションレベルの権限を最小限に抑えるために、RAM Roles for Service Account (RRSA) 機能を使用できます。この方法の基盤となるロジックは、STS トークンを使用することです。ACK は、さまざまなアプリケーション Pod に対して対応するサービスアカウント OpenID Connect (OIDC) トークンファイルを作成してマウントし、関連する設定情報を環境変数に渡します。Credentials ツールは、環境変数から設定情報を取得し、STS の AssumeRoleWithOIDC 操作を呼び出して、アタッチされたロールの STS トークンを取得します。この方法では、AccessKey ペアや STS トークンは不要であり、これらの資格情報を手動で管理することに伴うリスクが排除されます。詳細については、「RRSA を使用して ServiceAccount の RAM 権限を設定し、Pod レベルの権限分離を実装する」をご参照ください。
credentials の依存関係を追加します。
<!-- https://mvnrepository.com/artifact/com.aliyun/credentials-java --> <dependency> <groupId>com.aliyun</groupId> <artifactId>credentials-java</artifactId> <version>0.3.4</version> </dependency>>OIDC IdP の RAM ロールを使用してアクセス資格情報を提供します。
public class OidcRoleArnDemoTest { public static void main(String[] args) { com.aliyun.credentials.models.Config config = new com.aliyun.credentials.models.Config(); // 資格情報のタイプを oidc_role_arn に設定します。 config.setType("oidc_role_arn"); // ALIBABA_CLOUD_ROLE_ARN 環境変数を使用して RAM ロールの ARN を指定します。 config.setRoleArn("<RoleArn>"); // OIDC IdP の ARN を指定します。ARN は ALIBABA_CLOUD_OIDC_PROVIDER_ARN 環境変数から取得できます。 config.setOidcProviderArn("<OidcProviderArn>"); // OIDC トークンファイルのパスを指定します。OIDC トークンファイルは ALIBABA_CLOUD_OIDC_TOKEN_FILE 環境変数から取得できます。 config.setOidcTokenFilePath("<OidcTokenFilePath>"); // ロールセッション名を指定します。ロールセッション名は ALIBABA_CLOUD_ROLE_SESSION_NAME 環境変数から取得できます。 config.setRoleSessionName("<RoleSessionName>"); // (オプション) RAM ロールに限定された権限を指定します。例: {"Statement": [{"Action": ["*"],"Effect": "Allow","Resource": ["*"]}],"Version":"1"} config.setPolicy("<Policy>"); // セッションの有効期間を指定します。 config.setRoleSessionExpiration(3600); final com.aliyun.credentials.Client credentialsClient = new com.aliyun.credentials.Client(config); CredentialsProvider credentialsProvider = new CredentialsProvider() { @Override public void setCredentials(ServiceCredentials credentials) { } @Override public ServiceCredentials getCredentials() { CredentialModel credential = credentialsClient.getCredential(); return new DefaultCredentials(credential.getAccessKeyId(), credential.getAccessKeySecret(), credential.getSecurityToken()); } }; // 後続の操作には credentialsProvider を使用します。 } }
Function Compute のコンテキストで Credentials パラメーターを使用する
Function Compute コンテキストの Credentials パラメーターを使用してアクセス資格情報を設定します。この方法の基盤となるロジックは、セキュリティトークンサービス (STS) トークンを使用することです。Function Compute は、関数に設定されたロールに基づいてサービスロールを偽装することで STS トークンを取得します。その後、STS トークンはコンテキスト内の Credentials パラメーターを使用してアプリケーションに渡されます。STS トークンの有効期間は 36 時間です。その有効期間を変更することはできません。関数の最大実行時間は 24 時間です。したがって、関数が実行されている間は STS トークンが期限切れになることはないため、リフレッシュする必要はありません。この方法では、AccessKey ペアや STS トークンを提供する必要がないため、これらの資格情報を手動で管理することに伴うリスクが排除されます。Function Compute に Tablestore へのアクセス権限を付与する方法の詳細については、「関数ロールを使用して Function Compute に他のクラウドサービスへのアクセス権限を付与する」をご参照ください。
Java での実装
Function Compute コンテキストの依存関係を追加します。
<!-- https://mvnrepository.com/artifact/com.aliyun.fc.runtime/fc-java-core --> <dependency> <groupId>com.aliyun.fc.runtime</groupId> <artifactId>fc-java-core</artifactId> <version>1.4.1</version> </dependency>Function Compute コンテキストの Credentials パラメーターを使用して資格情報プロバイダーを初期化します。
package example; import com.alicloud.openservices.tablestore.core.auth.CredentialsProvider; import com.alicloud.openservices.tablestore.core.auth.DefaultCredentialProvider; import com.aliyun.fc.runtime.Context; import com.aliyun.fc.runtime.Credentials; import com.aliyun.fc.runtime.StreamRequestHandler; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; public class App implements StreamRequestHandler { @Override public void handleRequest( InputStream inputStream, OutputStream outputStream, Context context) throws IOException { // キー情報を取得します。関数を実行する前に、関数が属するサービスにロールが構成されており、そのロールに Tablestore にアクセスするための権限が付与されていることを確認してください。AliyunFCDefaultRole ロールを使用することをお勧めします。 Credentials creds = context.getExecutionCredentials(); // 取得した資格情報を使用して、資格情報プロバイダーインスタンスを作成します。 CredentialsProvider credentialsProvider = new DefaultCredentialProvider(creds.getAccessKeyId(), creds.getAccessKeySecret(), creds.getSecurityToken()); // 後続の操作を実行するために credentialsProvider を使用します。 outputStream.write(new String("done").getBytes()); } }
Python での実装
Function Compute のコンテキストで Credentials パラメーターを使用して、一時的なアクセス資格情報を取得します。
# -*- coding: utf-8 -*-
def handler(event, context):
# キー情報を取得します。関数を実行する前に、関数が属するサービスにロールが設定されており、そのロールに Tablestore へのアクセス権限が付与されていることを確認してください。AliyunFCDefaultRole ロールを使用することを推奨します。
creds = context.credentials
access_key_id = creds.access_key_id
access_key_secret = creds.access_key_secret
security_token = creds.security_token
# 後続の操作を実行します。
return 'success'CredentialsURI を使用する
CredentialsURI を使用してアクセス資格情報を設定します。この方法の基盤となるロジックは、STS トークンを使用してアクセス資格情報を設定することです。Credentials ツールは、指定した URI を使用して STS トークンを取得し、資格情報クライアントを初期化します。この方法では、AccessKey ペアや STS トークンは不要であり、これらの資格情報を手動で管理することに伴うリスクが排除されます。資格情報 URI 応答を提供するバックエンドサービスは、アプリケーションが常に有効な資格情報を取得できるように、STS トークンを自動的にリフレッシュする必要があります。
Credentials ツールが STS トークンを正しく解析して使用できるようにするには、URI が次のレスポンスプロトコルに準拠している必要があります。
レスポンスステータスコード: 200
レスポンスボディ構造:
{ "Code": "Success", "AccessKeySecret": "AccessKeySecret", "AccessKeyId": "AccessKeyId", "Expiration": "2021-09-26T03:46:38Z", "SecurityToken": "SecurityToken" }
credentials の依存関係を追加します。
<!-- https://mvnrepository.com/artifact/com.aliyun/credentials-java --> <dependency> <groupId>com.aliyun</groupId> <artifactId>credentials-java</artifactId> <version>0.3.4</version> </dependency>アクセス資格情報として資格情報 URI を構成します。
import com.alicloud.openservices.tablestore.core.auth.CredentialsProvider; import com.alicloud.openservices.tablestore.core.auth.DefaultCredentials; import com.alicloud.openservices.tablestore.core.auth.ServiceCredentials; import com.aliyun.credentials.models.CredentialModel; public class CredentialsUriDemoTest { public static void main(String[] args) { com.aliyun.credentials.models.Config config = new com.aliyun.credentials.models.Config(); // 資格情報の種類を credentials_uri に設定します。 config.setType("credentials_uri"); // http://local_or_remote_uri/ 形式で資格情報を取得する URI を指定します。 config.setCredentialsUri("<local_or_remote_uri>"); final com.aliyun.credentials.Client credentialsClient = new com.aliyun.credentials.Client(config); CredentialsProvider credentialsProvider = new CredentialsProvider() { @Override public void setCredentials(ServiceCredentials credentials) { } @Override public ServiceCredentials getCredentials() { CredentialModel credential = credentialsClient.getCredential(); return new DefaultCredentials(credential.getAccessKeyId(), credential.getAccessKeySecret(), credential.getSecurityToken()); } }; // 後続の操作を実行するために credentialsProvider を使用します。 } }
自動的にローテーションする AccessKey ペアを使用する
クライアントキーを使用してアクセス資格情報を設定します。クライアントキーを使用すると、Key Management Service (KMS) は管理対象の RAM ユーザーの AccessKey ペアを自動的かつ定期的にローテーションし、RAM ユーザーの静的な AccessKey ペアを動的に変更できます。これにより、AccessKey ペアの漏洩リスクが軽減されます。KMS は、漏洩した AccessKey ペアを迅速に無効にするための即時ローテーションもサポートしています。これにより、AccessKey ペアを手動でメンテナンスする必要がなくなり、セキュリティリスクとメンテナンスの複雑さが軽減されます。
資格情報クライアントの依存関係を追加します。
<dependency> <groupId>com.aliyun</groupId> <artifactId>alibabacloud-secretsmanager-client</artifactId> <version>1.3.7</version> </dependency> <dependency> <groupId>com.aliyun</groupId> <artifactId>aliyun-java-sdk-core</artifactId> <version>4.7.0</version> </dependency>secretsmanager.propertiesという名前の設定ファイルを作成します。# 資格情報の種類を client_key に設定します。 credentials_type=client_key # クライアントキーの復号化パスワードを指定します。復号化パスワードは、環境変数または構成ファイルから取得できます。 client_key_password_from_env_variable=<クライアントキーの秘密キーのパスワードの環境変数名> client_key_password_from_file_path=<クライアントキーの秘密キーのパスワードファイルのパス> # クライアントキーの秘密キーファイルのパスを指定します。 client_key_private_key_path=<クライアントキーの秘密キーファイルのパス> # KMS を使用するリージョンの ID を指定します。 cache_client_region_id=[{"regionId":"<regionId>"}]構成ファイルを使用して資格情報を渡します。
import com.alicloud.openservices.tablestore.core.auth.CredentialsProvider; import com.alicloud.openservices.tablestore.core.auth.DefaultCredentials; import com.alicloud.openservices.tablestore.core.auth.ServiceCredentials; import com.aliyuncs.kms.secretsmanager.client.SecretCacheClient; import com.aliyuncs.kms.secretsmanager.client.SecretCacheClientBuilder; import com.aliyuncs.kms.secretsmanager.client.exception.CacheSecretException; import com.aliyuncs.kms.secretsmanager.client.model.SecretInfo; import org.codehaus.jettison.json.JSONException; import org.codehaus.jettison.json.JSONObject; public class ClientKeyDemoTest { public static void main(String[] args) throws CacheSecretException { final SecretCacheClient client = SecretCacheClientBuilder.newClient(); CredentialsProvider credentialsProvider = new CredentialsProvider() { @Override public void setCredentials(ServiceCredentials credentials) { } @Override public ServiceCredentials getCredentials() { try { SecretInfo secretInfo = client.getSecretInfo("<secretName>"); JSONObject jsonObject = new JSONObject(secretInfo.getSecretValue()); String accessKeyId = jsonObject.getString("AccessKeyId"); String accessKeySecret = jsonObject.getString("AccessKeySecret"); return new DefaultCredentials(accessKeyId, accessKeySecret); } catch (CacheSecretException | JSONException e) { return null; } } }; // 後続の操作を実行するために credentialsProvider を使用します。 } }
カスタムアクセス資格情報を使用する
上記のどの方法も要件を満たさない場合は、Credential Providers 操作を呼び出すことで、アクセス資格情報を取得するためのカスタムメソッドを指定できます。基盤となる実装が STS トークンに基づいている場合は、資格情報の更新サポートを提供する必要があります。
import com.alicloud.openservices.tablestore.core.auth.CredentialsProvider;
import com.alicloud.openservices.tablestore.core.auth.DefaultCredentials;
import com.alicloud.openservices.tablestore.core.auth.ServiceCredentials;
public class CustomCredentialProviderDemoTest {
public static void main(String[] args) {
CredentialsProvider credentialsProvider = new CredentialsProvider(){
// 変数を初期化します。
String accessKeyId = null;
// 変数を初期化します。
String accessKeySecrect = null;
// 変数を初期化します。
// String token = null;
@Override
public void setCredentials(ServiceCredentials credentials) {
}
@Override
public ServiceCredentials getCredentials() {
//TODO
// アクセス資格情報を取得するカスタムメソッドを指定します。
// AccessKey ID と AccessKey シークレットで構成される長期アクセス資格情報を返します。
return new DefaultCredentials(accessKeyId, accessKeySecrect);
// AccessKey ID、AccessKey シークレット、および STS トークンで構成される一時的なアクセス資格情報を返します。
// 有効期限に基づいて一時的なアクセス資格情報を更新します。
// return new DefaultCredentials(accessKeyId, accessKeySecrect, token);
}
};
// 後続の操作を実行するために credentialsProvider を使用します。
}
}