バルク更新APIキーAPI

リクエスト

POST /_security/api_key/_bulk_update

前提条件

  • このAPIを使用するには、少なくともmanage_own_api_keyクラスターの権限が必要です。ユーザーは、自分が作成したAPIキーまたは自分に付与されたAPIキーのみを更新できます。他のユーザーのAPIキーを更新するには、run_as機能を使用して、他のユーザーの代理としてリクエストを送信してください。

このAPIの認証資格情報としてAPIキーを使用することはできません。APIキーを更新するには、所有者ユーザーの資格情報が必要です。

説明

このAPIは、単一APIキーの更新に似ていますが、1回のAPI呼び出しで複数のAPIキーに同じ更新を適用できます。この操作は、個別の更新を行うよりもパフォーマンスを大幅に向上させることができます。

期限切れのAPIキーや無効化されたAPIキーを更新することはできません。

このAPIは、APIキーのアクセススコープ、メタデータ、および有効期限の更新をサポートしています。各APIキーのアクセススコープは、リクエストで指定したrole_descriptorsと、リクエスト時の所有者ユーザーの権限のスナップショットから派生します。所有者の権限のスナップショットは、すべての呼び出しで自動的に更新されます。

リクエストでrole_descriptorsを指定しない場合でも、このAPIへの呼び出しはAPIキーのアクセススコープを変更する可能性があります。この変更は、APIキーが作成されたり最後に変更されたりしてから、所有者ユーザーの権限が変更された場合に発生する可能性があります。

リクエストボディ

リクエストボディで以下のパラメータを指定できます。

  • ids
  • (必須、リスト)更新するAPIキーのID。

  • role_descriptors
  • (オプション、オブジェクト)APIキーに割り当てるロール記述子。APIキーの有効な権限は、割り当てられた特権と所有者ユーザーの権限の時点スナップショットの交差点です。このパラメータで新しい特権を指定することで、特権を割り当てることができます。割り当てられた特権を削除するには、role_descriptorsパラメータを空のオブジェクト{}として提供します。APIキーに割り当てられた特権がない場合、所有者ユーザーの完全な権限を継承します。role_descriptorsパラメータを提供するかどうかにかかわらず、所有者の権限のスナップショットは常に更新されます。ロール記述子の構造は、APIキー作成APIのリクエストと同じです。
  • metadata
  • (オプション、オブジェクト)APIキーに関連付ける任意のネストされたメタデータ。
  1. - `````expiration
  • (オプション、文字列)APIキーの有効期限。デフォルトでは、APIキーは期限切れになりません。変更を加えずに省略できます。

レスポンスボディ

成功したリクエストは、更新されたすべてのAPIキーのID、要求された変更がすでに適用されていて更新を必要としなかったAPIキーのID、および失敗した更新のエラー詳細を含むJSON構造を返します。

以下の例では、ユーザーが2つのAPIキーを作成することを前提とします。ユーザーは最初のAPIキーを作成します:

Python

  1. resp = client.security.create_api_key(
  2. name="my-api-key",
  3. role_descriptors={
  4. "role-a": {
  5. "cluster": [
  6. "all"
  7. ],
  8. "indices": [
  9. {
  10. "names": [
  11. "index-a*"
  12. ],
  13. "privileges": [
  14. "read"
  15. ]
  16. }
  17. ]
  18. }
  19. },
  20. metadata={
  21. "application": "my-application",
  22. "environment": {
  23. "level": 1,
  24. "trusted": True,
  25. "tags": [
  26. "dev",
  27. "staging"
  28. ]
  29. }
  30. },
  31. )
  32. print(resp)

Js

  1. const response = await client.security.createApiKey({
  2. name: "my-api-key",
  3. role_descriptors: {
  4. "role-a": {
  5. cluster: ["all"],
  6. indices: [
  7. {
  8. names: ["index-a*"],
  9. privileges: ["read"],
  10. },
  11. ],
  12. },
  13. },
  14. metadata: {
  15. application: "my-application",
  16. environment: {
  17. level: 1,
  18. trusted: true,
  19. tags: ["dev", "staging"],
  20. },
  21. },
  22. });
  23. console.log(response);

コンソール

  1. POST /_security/api_key
  2. {
  3. "name": "my-api-key",
  4. "role_descriptors": {
  5. "role-a": {
  6. "cluster": ["all"],
  7. "indices": [
  8. {
  9. "names": ["index-a*"],
  10. "privileges": ["read"]
  11. }
  12. ]
  13. }
  14. },
  15. "metadata": {
  16. "application": "my-application",
  17. "environment": {
  18. "level": 1,
  19. "trusted": true,
  20. "tags": ["dev", "staging"]
  21. }
  22. }
  23. }

これにより、次のAPIキー情報を含むレスポンスが得られます。

コンソール-結果

  1. {
  2. "id": "VuaCfGcBCdbkQm-e5aOx",
  3. "name": "my-api-key",
  4. "api_key": "ui2lp2axTNmsyakw9tvNnw",
  5. "encoded": "VnVhQ2ZHY0JDZGJrUW0tZTVhT3g6dWkybHAyYXhUTm1zeWFrdzl0dk5udw=="
  6. }

ユーザーは2番目のAPIキーを作成します:

Python

  1. resp = client.security.create_api_key(
  2. name="my-other-api-key",
  3. metadata={
  4. "application": "my-application",
  5. "environment": {
  6. "level": 2,
  7. "trusted": True,
  8. "tags": [
  9. "dev",
  10. "staging"
  11. ]
  12. }
  13. },
  14. )
  15. print(resp)

Js

  1. const response = await client.security.createApiKey({
  2. name: "my-other-api-key",
  3. metadata: {
  4. application: "my-application",
  5. environment: {
  6. level: 2,
  7. trusted: true,
  8. tags: ["dev", "staging"],
  9. },
  10. },
  11. });
  12. console.log(response);

コンソール

  1. POST /_security/api_key
  2. {
  3. "name": "my-other-api-key",
  4. "metadata": {
  5. "application": "my-application",
  6. "environment": {
  7. "level": 2,
  8. "trusted": true,
  9. "tags": ["dev", "staging"]
  10. }
  11. }
  12. }

次のAPIキー情報が得られます。

コンソール-結果

  1. {
  2. "id": "H3_AhoIBA9hmeQJdg7ij",
  3. "name": "my-other-api-key",
  4. "api_key": "134G4ilmT_uGWXHRfJfXXA",
  5. "encoded": "SDNfQWhvSUJBOWhtZVFKZGc3aWo6MTM0RzRpbG1UX3VHV1hIUmZKZlhYQQ=="
  6. }

さらに、所有者ユーザーの権限は次のとおりです:

Js

  1. {
  2. "cluster": ["all"],
  3. "indices": [
  4. {
  5. "names": ["*"],
  6. "privileges": ["all"]
  7. }
  8. ]
  9. }

次の例では、上記で作成されたAPIキーを更新し、新しいロール記述子、メタデータを割り当て、有効期限を更新します。

Python

  1. resp = client.security.bulk_update_api_keys(
  2. body={
  3. "ids": [
  4. "VuaCfGcBCdbkQm-e5aOx",
  5. "H3_AhoIBA9hmeQJdg7ij"
  6. ],
  7. "role_descriptors": {
  8. "role-a": {
  9. "indices": [
  10. {
  11. "names": [
  12. "*"
  13. ],
  14. "privileges": [
  15. "write"
  16. ]
  17. }
  18. ]
  19. }
  20. },
  21. "metadata": {
  22. "environment": {
  23. "level": 2,
  24. "trusted": True,
  25. "tags": [
  26. "production"
  27. ]
  28. }
  29. },
  30. "expiration": "30d"
  31. },
  32. )
  33. print(resp)

Js

  1. const response = await client.security.bulkUpdateApiKeys({
  2. body: {
  3. ids: ["VuaCfGcBCdbkQm-e5aOx", "H3_AhoIBA9hmeQJdg7ij"],
  4. role_descriptors: {
  5. "role-a": {
  6. indices: [
  7. {
  8. names: ["*"],
  9. privileges: ["write"],
  10. },
  11. ],
  12. },
  13. },
  14. metadata: {
  15. environment: {
  16. level: 2,
  17. trusted: true,
  18. tags: ["production"],
  19. },
  20. },
  21. expiration: "30d",
  22. },
  23. });
  24. console.log(response);

コンソール

  1. POST /_security/api_key/_bulk_update
  2. {
  3. "ids": [
  4. "VuaCfGcBCdbkQm-e5aOx",
  5. "H3_AhoIBA9hmeQJdg7ij"
  6. ],
  7. "role_descriptors": {
  8. "role-a": {
  9. "indices": [
  10. {
  11. "names": ["*"],
  12. "privileges": ["write"]
  13. }
  14. ]
  15. }
  16. },
  17. "metadata": {
  18. "environment": {
  19. "level": 2,
  20. "trusted": true,
  21. "tags": ["production"]
  22. }
  23. },
  24. "expiration": "30d"
  25. }

成功した呼び出しは、APIキーが更新されたことを示すJSON構造を返します:

コンソール-結果

  1. {
  2. "updated": [
  3. "VuaCfGcBCdbkQm-e5aOx",
  4. "H3_AhoIBA9hmeQJdg7ij"
  5. ],
  6. "noops": []
  7. }

更新後の両方のAPIキーの有効な権限は、提供されたロール記述子と所有者ユーザーの権限の交差点になります:

Js

  1. {
  2. "indices": [
  3. {
  4. "names": ["*"],
  5. "privileges": ["write"]
  6. }
  7. ]
  8. }

次の例では、APIキーに以前割り当てられた権限を削除し、所有者ユーザーの完全な権限を継承させます。

Python

  1. resp = client.security.bulk_update_api_keys(
  2. body={
  3. "ids": [
  4. "VuaCfGcBCdbkQm-e5aOx",
  5. "H3_AhoIBA9hmeQJdg7ij"
  6. ],
  7. "role_descriptors": {}
  8. },
  9. )
  10. print(resp)

Js

  1. const response = await client.security.bulkUpdateApiKeys({
  2. body: {
  3. ids: ["VuaCfGcBCdbkQm-e5aOx", "H3_AhoIBA9hmeQJdg7ij"],
  4. role_descriptors: {},
  5. },
  6. });
  7. console.log(response);

コンソール

  1. POST /_security/api_key/_bulk_update
  2. {
  3. "ids": [
  4. "VuaCfGcBCdbkQm-e5aOx",
  5. "H3_AhoIBA9hmeQJdg7ij"
  6. ],
  7. "role_descriptors": {}
  8. }

次のレスポンスが返されます:

コンソール-結果

  1. {
  2. "updated": [
  3. "VuaCfGcBCdbkQm-e5aOx",
  4. "H3_AhoIBA9hmeQJdg7ij"
  5. ],
  6. "noops": []
  7. }

更新後のAPIキーの有効な権限は、所有者ユーザーの権限と同じになります:

Js

  1. {
  2. "cluster": ["all"],
  3. "indices": [
  4. {
  5. "names": ["*"],
  6. "privileges": ["all"]
  7. }
  8. ]
  9. }

次の例では、所有者ユーザーの権限が元の権限から次のように変更されたと仮定します:

Js

  1. {
  2. "cluster": ["manage_security"],
  3. "indices": [
  4. {
  5. "names": ["*"],
  6. "privileges": ["read"]
  7. }
  8. ]
  9. }

次のリクエストは、2つのAPIキーに関連付けられたユーザーの権限のスナップショットを自動的に更新します。

Python

  1. resp = client.security.bulk_update_api_keys(
  2. body={
  3. "ids": [
  4. "VuaCfGcBCdbkQm-e5aOx",
  5. "H3_AhoIBA9hmeQJdg7ij"
  6. ]
  7. },
  8. )
  9. print(resp)

Js

  1. const response = await client.security.bulkUpdateApiKeys({
  2. body: {
  3. ids: ["VuaCfGcBCdbkQm-e5aOx", "H3_AhoIBA9hmeQJdg7ij"],
  4. },
  5. });
  6. console.log(response);

コンソール

  1. POST /_security/api_key/_bulk_update
  2. {
  3. "ids": [
  4. "VuaCfGcBCdbkQm-e5aOx",
  5. "H3_AhoIBA9hmeQJdg7ij"
  6. ]
  7. }

次のレスポンスが返されます:

コンソール-結果

  1. {
  2. "updated": [
  3. "VuaCfGcBCdbkQm-e5aOx",
  4. "H3_AhoIBA9hmeQJdg7ij"
  5. ],
  6. "noops": []
  7. }

両方のAPIキーの有効な権限は次のようになります:

Js

  1. {
  2. "cluster": ["manage_security"],
  3. "indices": [
  4. {
  5. "names": ["*"],
  6. "privileges": ["read"]
  7. }
  8. ]
  9. }

APIキーの更新に失敗した場合、エラー詳細はerrorsフィールドに含まれます。例えば:

Js

  1. {
  2. "updated": ["VuaCfGcBCdbkQm-e5aOx"],
  3. "noops": [],
  4. "errors": {
  5. "count": 3,
  6. "details": {
  7. "g_PqP4IBcBaEQdwM5-WI": {
  8. "type": "resource_not_found_exception",
  9. "reason": "no API key owned by requesting user found for ID [g_PqP4IBcBaEQdwM5-WI]"
  10. },
  11. "OM4cg4IBGgpHBfLerY4B": {
  12. "type": "illegal_argument_exception",
  13. "reason": "cannot update invalidated API key [OM4cg4IBGgpHBfLerY4B]"
  14. },
  15. "Os4gg4IBGgpHBfLe2I7j": {
  16. "type": "exception",
  17. "reason": "bulk request execution failure",
  18. "caused_by": {
  19. "type" : "version_conflict_engine_exception",
  20. "reason" : "[1]: version conflict, required seqNo [1], primary term [1]. current document has seqNo [2] and primary term [1]"
  21. }
  22. }
  23. }
  24. }
  25. }
このフィールドは、countが0のときにレスポンスに存在しません。
エラーが発生したAPIキーのID。
エラー詳細には、caused_byフィールドも含まれる場合があります。