Node.js SDK を使用して OSS にリクエストを送信するには、アクセス認証情報を設定する必要があります。Alibaba Cloud サービスは、これらの認証情報を使用して、ID とアクセス権限を検証します。シナリオの認証と権限付与の要件に基づいて、認証情報を提供する方法を選択できます。
前提条件
アクセス認証情報を設定する前に、OSS Node.js SDK をインストールする必要があります。詳細については、「Node.js SDK のインストール」をご参照ください。
認証情報プロバイダーの初期化
認証情報プロバイダーの選択
OSS の認証情報プロバイダーは、いくつかの方法で初期化できます。シナリオの認証と権限付与の要件に基づいて、方法を選択してください。
認証情報プロバイダーの初期化方法 | シナリオ | 既存の AccessKey またはセキュリティトークンサービス (STS) トークンが必要か | 基盤となる認証情報 | 認証情報の有効期間 | 認証情報のローテーションまたは更新方法 |
安全で安定した環境で実行され、頻繁な認証情報のローテーションなしで Alibaba Cloud サービスへの長期間のアクセスを必要とするアプリケーション。 | はい | AccessKey | 長期間 | 手動でのローテーション | |
信頼できない環境で実行され、アクセス有効期間と権限のコントロールを必要とするアプリケーション。 | はい | セキュリティトークンサービス (STS) トークン | 一時的 | 手動での更新 | |
クロスアカウントアクセスなど、Alibaba Cloud サービスへの権限付与されたアクセスを必要とするアプリケーション。 | はい | STS トークン | 一時的 | 自動更新 | |
Alibaba Cloud の ECS インスタンス、ECI インスタンス、または Container Service for Kubernetes (ACK) のワーカーノードで実行されるアプリケーション。 | いいえ | STS トークン | 一時的 | 自動更新 | |
Alibaba Cloud 上の ACK のワーカーノードで実行される信頼できないアプリケーション。 | いいえ | STS トークン | 一時的 | 自動更新 | |
外部システムからアクセス認証情報を取得する必要があるアプリケーション。 | いいえ | STS トークン | 一時的 | 自動更新 |
方法 1:AccessKey の使用
アプリケーションが安全な環境で実行され、OSS への長期間のアクセスが必要で、認証情報を頻繁にローテーションできない場合は、Alibaba Cloud アカウントまたは Resource Access Management (RAM) ユーザーの AccessKey ペアを使用して認証情報プロバイダーを初期化できます。AccessKey ペアは、AccessKey ID と AccessKey Secret で構成されます。この方法では、AccessKey ペアを手動でメンテナンスする必要があり、セキュリティリスクとメンテナンスの複雑さが増します。AccessKey ペアの取得方法の詳細については、「CreateAccessKey」をご参照ください。
Alibaba Cloud アカウントは、すべてのリソースに対する完全な権限を持っています。AccessKey ペアが漏洩すると、システムに重大なセキュリティリスクをもたらします。Alibaba Cloud アカウントの AccessKey ペアは使用しないでください。代わりに、最小限の権限を持つ RAM ユーザーの AccessKey ペアを使用してください。
環境変数を設定します。
Mac OS 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>AccessKey ペアを使用してクライアントを初期化します。
const OSS = require("ali-oss"); // OSS を初期化します。 const client = new OSS({ // 環境変数から AccessKey ID を取得します。 accessKeyId: process.env.ALIBABA_CLOUD_ACCESS_KEY_ID, // 環境変数から AccessKey Secret を取得します。 accessKeySecret: process.env.ALIBABA_CLOUD_ACCESS_KEY_SECRET }); // listBuckets const buckets = await client.listBuckets(); console.log(buckets);
方法 2:STS トークンの使用
RAM ユーザーとして、セキュリティトークンサービス (STS) の AssumeRole 操作を呼び出し、トークンの最大有効期間を設定して、一時的な認証情報である STS トークンを取得できます。
環境変数を設定します。
Mac OS 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>一時的な認証情報を使用してクライアントを初期化します。
const OSS = require("ali-oss"); // OSS を初期化します。 const client = new OSS({ // 環境変数から AccessKey ID を取得します。 accessKeyId: process.env.ALIBABA_CLOUD_ACCESS_KEY_ID, // 環境変数から AccessKey Secret を取得します。 accessKeySecret: process.env.ALIBABA_CLOUD_ACCESS_KEY_SECRET, // 環境変数から STS トークンを取得します。 stsToken: process.env.ALIBABA_CLOUD_SECURITY_TOKEN }); // listBuckets const buckets = await client.listBuckets(); console.log(buckets);
方法 3:RAMRoleARN の使用
この方法は STS トークンに基づいています。RAM ロールの Alibaba Cloud リソースネーム (ARN) を指定することで、Credentials ツールは STS から STS トークンを取得します。policy に値を割り当てて、RAM ロールの権限をさらに制限することもできます。
AccessKey ペアと RAMRoleARN を使用して認証情報プロバイダーを初期化し、クライアントの初期化を完了します。
const Credential = require("@alicloud/credentials");
const OSS = require("ali-oss");
// RamRoleArn を使用して Credentials クライアントを初期化します。
const credentialsConfig = new Credential.Config({
// 認証情報のタイプ。
type: "ram_role_arn",
// 環境変数から AccessKey ID を取得します。
accessKeyId: process.env.ALIBABA_CLOUD_ACCESS_KEY_ID,
// 環境変数から AccessKey Secret を取得します。
accessKeySecret: process.env.ALIBABA_CLOUD_ACCESS_KEY_SECRET,
// 偽装する RAM ロールの ARN。例:acs:ram::123456789012****:role/adminrole。ALIBABA_CLOUD_ROLE_ARN 環境変数を使用して roleArn を設定できます。
roleArn: '<RoleArn>',
// ロールセッション名。ALIBABA_CLOUD_ROLE_SESSION_NAME 環境変数を使用して RoleSessionName を設定できます。
roleSessionName: '<RoleSessionName>',
// より小さい権限セットを指定するアクセスポリシー。このパラメーターはオプションです。例:{"Statement": [{"Action": ["*"],"Effect": "Allow","Resource": ["*"]}],"Version":"1"}
// policy: '<Policy>',
roleSessionExpiration: 3600
});
const credentialClient = new Credential.default(credentialsConfig);
const credential = await credentialClient.getCredential();
// OSS を初期化します。
const client = new OSS({
accessKeyId:credential.accessKeyId,
accessKeySecret: credential.accessKeySecret,
stsToken: credential.securityToken,
refreshSTSTokenInterval: 0, // Credential オブジェクトは accessKeyId、accessKeySecret、および stsToken の更新を制御します。
refreshSTSToken: async () => {
const { accessKeyId, accessKeySecret, securityToken } = await credentialClient.getCredential();
return {
accessKeyId,
accessKeySecret,
stsToken: securityToken,
};
}
});
// listBuckets
const buckets = await client.listBuckets();
console.log( buckets);
方法 4:標準モードで ECS インスタンスのメタデータから RAM ロールを取得
この方法は STS トークンに基づいています。Credentials ツールは、ECS インスタンスにアタッチされた RAM ロールを自動的に取得します。その後、ECS メタデータサーバーを呼び出して STS トークンを取得し、そのトークンを使用してクライアントを初期化します。
const Credential = require("@alicloud/credentials");
const OSS = require("ali-oss");
// Credentials クライアントを初期化します。
const credentialsConfig = new Credential.Config({
// 認証情報のタイプ。
type: "ecs_ram_role",
// オプション。ECS ロールの名前。このパラメーターを指定しない場合、ロール名は自動的に取得されます。リクエスト数を減らすために、このパラメーターを指定することを推奨します。ALIBABA_CLOUD_ECS_METADATA 環境変数を使用して roleName を設定できます。
roleName: '<RoleName>'
});
const credentialClient = new Credential.default(credentialsConfig);
const { accessKeyId, accessKeySecret, securityToken } = await credentialClient.getCredential();
// OSS クライアントを初期化します。
const client = new OSS({
accessKeyId,
accessKeySecret,
stsToken: securityToken,
refreshSTSTokenInterval: 0, // Credential オブジェクトは accessKeyId、accessKeySecret、および stsToken の更新を制御します。
refreshSTSToken: async () => {
const { accessKeyId, accessKeySecret, securityToken } = await credentialClient.getCredential();
return {
accessKeyId,
accessKeySecret,
stsToken: securityToken,
};
}
});
// listBuckets
const buckets = await client.listBuckets();
console.log(buckets);
方法 5:OIDCRoleArn の使用
ACK のワーカーノードに RAM ロールを設定すると、そのノード上の Pod 内のアプリケーションは、ECS にデプロイされたアプリケーションと同様に、関連付けられたロールの STS トークンをメタデータサーバーから取得できます。しかし、ソースコードが利用できない顧客のアプリケーションなど、信頼できないアプリケーションをコンテナークラスターにデプロイする場合、このアプローチは安全ではありません。これらのアプリケーションが、ワーカーノードに関連付けられたインスタンス RAM ロールの STS トークンを取得するのを防ぐ必要があります。この問題に対処するために、RAM Roles for Service Accounts (RRSA) 機能を使用できます。RRSA を使用すると、信頼できないアプリケーションがアプリケーションレベルで最小限の権限を持つ STS トークンを安全に取得でき、クラウドリソースへのセキュリティリスクを防ぎます。アプリケーションの各 Pod に対して、Alibaba Cloud コンテナークラスターは対応するサービスアカウントの OpenID Connect (OIDC) トークンファイルを作成してマウントし、構成情報を環境変数に注入します。Credentials ツールはこの構成情報を取得し、STS の AssumeRoleWithOIDC 操作を呼び出して、アタッチされたロールの STS トークンを取得します。詳細については、「RRSA に基づく Pod の権限隔離」をご参照ください。
OIDC RAM ロールをアクセス認証情報として設定して、クライアントを初期化します。
const OSS = require("ali-oss");
const Credential = require("@alicloud/credentials");
const credentialsConfig = new Credential.Config({
// 認証情報のタイプ。
type: "oidc_role_arn",
// RAM ロールの ARN。ALIBABA_CLOUD_ROLE_ARN 環境変数を使用して roleArn を設定できます。
roleArn: '<RoleArn>',
// OIDC プロバイダーの ARN。ALIBABA_CLOUD_OIDC_PROVIDER_ARN 環境変数を使用して oidcProviderArn を設定できます。
oidcProviderArn: '<OidcProviderArn>',
// OIDC トークンファイルのパス。ALIBABA_CLOUD_OIDC_TOKEN_FILE 環境変数を使用して oidcTokenFilePath を設定できます。
oidcTokenFilePath: '<OidcTokenFilePath>',
// ロールセッション名。ALIBABA_CLOUD_ROLE_SESSION_NAME 環境変数を使用して roleSessionName を設定できます。
roleSessionName: '<RoleSessionName>',
// より小さい権限セットを指定するアクセスポリシー。このパラメーターはオプションです。例:{"Statement": [{"Action": ["*"],"Effect": "Allow","Resource": ["*"]}],"Version":"1"}
// policy: "<Policy>",
// セッションの有効期限を設定します。
roleSessionExpiration: 3600
});
const credentialClient = new Credential.default(credentialsConfig);
const { accessKeyId, accessKeySecret, securityToken } = await credentialClient.getCredential();
const client = new OSS({
accessKeyId,
accessKeySecret,
stsToken: securityToken,
refreshSTSTokenInterval: 0, // Credential オブジェクトは accessKeyId、accessKeySecret、および stsToken の更新を制御します。
refreshSTSToken: async () => {
const { accessKeyId, accessKeySecret, securityToken } = await credentialClient.getCredential();
return {
accessKeyId,
accessKeySecret,
stsToken: securityToken,
};
}
});
const buckets = await client.listBuckets();
console.log(buckets);
方法 6:CredentialsURI の使用
アプリケーションが柔軟な認証情報管理とキーレスアクセスのために外部システムから Alibaba Cloud の認証情報を取得する必要がある場合、CredentialsURI を使用して認証情報プロバイダーを初期化できます。この方法は STS トークンに基づいています。Credentials ツールは、指定した URI から STS トークンを取得し、認証情報クライアントを初期化します。この方法では、AccessKey ペアや STS トークンを提供する必要がないため、手動メンテナンスのリスクが排除されます。CredentialsURI のレスポンスを提供するバックエンドサービスは、アプリケーションが常に有効な認証情報を取得できるように、STS トークンを自動更新するロジックを実装する必要があることに注意してください。
Credentials ツールが STS トークンを正しく解析して使用できるように、URI からのレスポンスは次のプロトコルに従う必要があります:
レスポンスステータスコード:200
レスポンス本文の構造:
{ "Code": "Success", "AccessKeySecret": "AccessKeySecret", "AccessKeyId": "AccessKeyId", "Expiration": "2021-09-26T03:46:38Z", "SecurityToken": "SecurityToken" }
CredentialsURI をアクセス認証情報として設定して、クライアントを初期化します。
const OSS = require("ali-oss"); const Credential = require("@alicloud/credentials"); // 認証情報 URI を使用して Credentials クライアントを初期化します。 const credentialsConfig = new Credential.Config({ // 認証情報のタイプ。 type: "credentials_uri", // 認証情報を取得する URI。フォーマットは http://local_or_remote_uri/ です。ALIBABA_CLOUD_CREDENTIALS_URI 環境変数を使用して credentialsUri を設定できます。 credentialsURI: '<CredentialsUri>' }); const credentialClient = new Credential.default(credentialsConfig); const credential = await credentialClient.getCredential(); // OSS を初期化します。 const client = new OSS({ accessKeyId: credential.accessKeyId, accessKeySecret: credential.accessKeySecret, stsToken: credential.securityToken, refreshSTSTokenInterval: 0, // Credential オブジェクトは accessKeyId、accessKeySecret、および stsToken の更新を制御します。 refreshSTSToken: async () => { const { accessKeyId, accessKeySecret, securityToken } = await credentialClient.getCredential(); return { accessKeyId, accessKeySecret, stsToken: securityToken, }; } }); // listBuckets const buckets = await client.listBuckets(); console.log(buckets);
次のステップ
認証情報プロバイダーを初期化したら、OSSClient インスタンスを作成できます。詳細については、「初期化 (Node.js SDK)」をご参照ください。