シークレット
シークレットを使うことで、SquidはAPI keys、passwords、certificatesなどの機密データの管理をサポートします。シークレット管理は、Squid ConsoleおよびSquid Client SDKの両方から実施できます。
プログラムによるシークレット管理は、自動的なAPI keyのローテーション、定期的なパスワードの更新、動的なサービスの作成などに有用です。Squid Client SDKは、カスタムシークレットとアプリケーションのAPI keysの両方を管理する方法を提供します。
Squid Client SDKからシークレットを管理するには、クライアントをアプリケーションのAPI keyで初期化する必要があります。これは apiKey
オプションを使用して行うことができ、決して ユーザーフェイシングなアプリケーションから実施すべきではありません。シークレット管理は、Squid Backendのような安全な環境でのみ行うべきです。
シークレットは、データ漏洩や不正アクセスのリスクを最小限に抑えます。Squidシークレットは、以下のようなセキュリティが重要な状況で有用です:
- APIリクエストに対して安全にAPI keysやその他の認証シークレットを注入する
- クライアントから直接かつ安全にAPIコールを有効にする
- API keyの検証を実装する
- schedulerを使用してAPI keyのローテーションを実装する
カスタムシークレット
シークレットは、クライアントが提供する標準のCRUD(create, read, update, delete)操作を使って管理できます。APIは以下のように使用します:
シークレットの取得
名前によってシークレットへアクセスするには、get
メソッドを呼び出します。このメソッドは、value
とシークレットが最後に更新された時間 (lastUpdated
、ミリ秒単位) を含むシークレットエントリ、もしくはシークレットが存在しない場合は undefined
を返します。
const result = await squid.secrets.get('SECRET_NAME');
// {
// key: 'SECRET_NAME',
// value: 'your_value',
// lastUpdated: 1692306991724
// }
すべてのシークレットの取得
すべてのシークレットのマップを取得するには、getAll
メソッドを呼び出します。マップの各エントリは、value
とシークレットが最後に更新された時間 (lastUpdated
、ミリ秒単位) を含みます。
const result = await squid.secrets.getAll();
// {
// 'SECRET_NAME': {
// key: 'SECRET_NAME',
// value: 'your_value',
// lastUpdated: 1692306991724
// }
// }
シークレットの作成または更新
新しいシークレットを作成するか、既存のシークレットを更新するには、upsert
関数を使用し、シークレットのkeyとvalueをパラメータとして渡します。シークレットは作成されるか更新され、呼び出しは作成または更新されたシークレットを返します。
const result = await squid.secrets.upsert('SECRET_NAME', 'your_new_value');
// {
// key: 'SECRET_NAME',
// value: 'your_new_value',
// lastUpdated: 1692306991724
// }
複数のシークレットを同時に更新するには、upsertMany
メソッドを使用します。この関数は、各シークレットがkeyおよびvalue属性を持つオブジェクトである配列を受け取ります。
const result = await squid.secrets.upsertMany([
{ key: 'SECRET_NAME', value: 'your_new_value' },
{ key: 'OTHER_SECRET_NAME', value: 'your_other_value' },
]);
// [{
// key: 'SECRET_NAME',
// value: 'your_new_value',
// lastUpdated: 1692306991724
// },
// {
// key: 'OTHER_SECRET_NAME',
// value: 'your_other_value',
// lastUpdated: 1692306991724
// }]
シークレットの削除
シークレットを削除するには、削除したいシークレットの名前を指定して delete
メソッドを呼び出します。
await squid.secrets.delete('SECRET_NAME');
複数のシークレットを同時に削除するには、deleteMany
メソッドを使用します。この関数は、削除するシークレットの名前を含む文字列の配列を受け取ります。
const result = await squid.secrets.deleteMany(['SECRET_NAME', 'OTHER_SECRET_NAME']);
API keys
Squid API keysも squid.secrets
属性を使って管理できます。ただし、SquidがAPI keysの生成を行うため、API keyの作成や更新の際に値を渡すことはできません。
API keyの取得
名前でAPI keyにアクセスするには、apiKeys.get
メソッドを呼び出します。API keyが存在しない場合、このメソッドは undefined
に解決するPromiseを返します。キーが存在する場合は、key
、value
、およびシークレットが最後に更新された時間 (lastUpdated
, ミリ秒単位) を含むシークレットエントリオブジェクトを返すPromiseを返します。
const result = await squid.secrets.apiKeys.get('API_KEY_NAME');
// {
// key: 'API_KEY_NAME',
// value: 'a123b456-cd78-9e90-f123-gh45i678j901',
// lastUpdated: 1692306991724
// }
すべてのAPI keyの取得
すべてのAPI keyのマップを取得するには、apiKeys.getAll
メソッドを呼び出します。マップの各エントリは、value
とキーが最後に更新された時間 (lastUpdated
, ミリ秒単位) を含みます。
const result = await squid.secrets.apiKeys.getAll();
// {
// 'API_KEY_NAME': {
// key: 'API_KEY_NAME',
// value: 'a123b456-cd78-9e90-f123-gh45i678j901e',
// lastUpdated: 1692306991724
// }
// }
API keyの作成または更新
新しいAPI keyの作成または既存のAPI keyのローテーションを行うには、apiKeys.upsert
メソッドを使用します。キーの名前をパラメータとして渡します。Squidは新しいキーを生成し、レスポンス内でその値を返します。
const result = await squid.secrets.apiKeys.upsert('API_KEY_NAME');
// {
// key: 'API_KEY_NAME',
// value: 'a123b456-cd78-9e90-f123-gh45i678j901e',
// lastUpdated: 1692306991724
// }
API keyの削除
API keyを削除するには、キーの名前を渡して delete
メソッドを呼び出します。
await squid.secrets.apiKey.delete('API_KEY_NAME');
Squidバックエンドにおけるシークレット
Squidバックエンドでは、this.secrets
を使ってシークレットを直接含むオブジェクトにアクセスできます。たとえば、'SECRET_NAME'
というシークレットの値にアクセスするには、次のようにします:
this.secrets['SECRET_NAME']; // 'your_value'
例: スケジュールに基づくAPI keyのローテーション
シークレットおよびAPI keyの管理は、Squidのバックエンド機能(schedulersやtriggers)と組み合わせることで強力になります。以下の例は、プログラムによるシークレット管理のユースケースを示しています。
@scheduler("rotate-api-key", CronExpression.EVERY_DAY_AT_MIDNIGHT)
async rotateApiKey() {
const { lastUpdated } = await this.squid.secrets.apiKeys.get('MY_API_KEY');
// If the key is over 30 days old
if (lastUpdated < Date.now() - (30 * 86400000)) {
await this.squid.secrets.apiKeys.upsert('MY_API_KEY')
}
}
スケジューラーについて詳しく知りたい場合は、documentation on schedulers をご覧ください。