Join us at MongoDB.local London on 7 May to unlock new possibilities for your data. Use WEB50 to save 50%.
Register now >
Docs Menu
Docs Home
/ /

チュートリアル: 予定されたトリガーでクラスターを自動化

このチュートリアルでは、Atlas のスケジュールされたトリガーを使用して、プログラムで Atlas Administration APIを呼び出し、クラスター マネジメント タスクを自動化します。

このチュートリアルには、次の手順が含まれています。

  • 初期設定: 既存の Atlas プロジェクトに対して サービス アカウントを、Project Owner権限で作成し、サービス アカウントの認証情報を値とシークレットとして保存し、これらの認証情報を使用して1 つのプロジェクトで 1 つのクラスターを更新するエンドポイントを呼び出す再利用可能な関数を作成します。

    注意

    APIキーの代わりにサービスアカウントを使用して、Project Owner権限を持つAtlas 管理APIに認証する場合、API公開キーと秘密キーを値とシークレットとして保存し、このチュートリアルの関数で使用できます。

  • スケジュールに基づいてクラスターを一時停止および再開: 予定されたトリガーを作成して、クラスターを毎晩自動的に一時停止し、毎平日の朝に再開します。

  • スケジュールでクラスターを増やす: スケジュールされたトリガーを作成して、ピーク時間帯にクラスターを自動的に増やすし、その後はダウンします。

このチュートリアルを完了するには、 MongoDB Atlasプロジェクトへの Project Owner アクセス権を持つユーザーが必要です。

この初期設定は一度だけ完了する必要があり、このページで予定されたトリガーを作成してクラスターマネジメントタスクを自動化できます。このチュートリアルを実行する前に、少なくとも 1 つのクラスターを含むMongoDB Atlasプロジェクトがあることを確認してください。この手順では、次のセットアップ タスクを実行します。

  • Atlas サービス アカウントの認証情報を作成して保存します。このアカウントは、Triggers が既存の Atlas プロジェクトに対するProject Owner 権限を持つ Atlas Administration API を呼び出すために使用します。

  • サービス アカウントの認証情報を使用してアクセス トークンを生成し、Atlas 管理APIを呼び出すための適切な認証ヘッダーを返す getAuthHeaders という再利用可能な関数を作成します。

  • 1 つのプロジェクトAPIの 1 つのクラスターの更新 をラップする modifyCluster という再利用可能な関数を作成します。

1

トリガーする が既存の Atlasプロジェクトに対する Project Owner 権限を持つ Atlas 管理API を呼び出すために使用できるサービス アカウントを作成するには、次の手順に従います。

  1. Atlasで、Go Users{0 ページに します。

    1. まだ表示されていない場合は、以下から目的の組織を選択しますナビゲーション バーのOrganizationsメニュー

    2. サイドバーの [Identity & Access] セクションの下の [All Projects] をクリックし、目的のプロジェクトを選択します。

    3. サイドバーの [Security] セクションの下の [Project Identity & Access] をクリックします。

    [ ユーザー ] ページが表示されます。

  2. [Create Application Service Account をクリックします。

  3. サービスアカウント情報を入力します。

    • 名前: サービス アカウントの名前。(例: TriggersServiceAccount

    • 説明: (任意)サービス アカウントの説明。(例: Atlas Functions が Atlas 管理APIを呼び出すためのサービス アカウント。)

    • サービス アカウントの権限: Project Owner

  4. [Create] をクリックします。

    これにより、サービス アカウントが作成され、権限 Organization Member を持つプロジェクトの親組織に自動的に追加されます。

  5. API Access Listを設定します。

    このサービス アカウントで Atlas 管理APIを呼び出せるIPアドレスを制限する場合は、API Access List にIPアドレスを追加します。

    注意

    組織で Require IP Access List for the Atlas Administration API が有効になっている場合、またはサービス アカウントの API Access List にIPアドレスを追加した場合、すべての Atlas 管理APIリクエストはIP アクセス リスト チェックに合格する必要があります。

    Atlas triggers と Functions は、特定のアウトバウンドIPアドレスのセットから送信HTTPリクエストを送信します。スケジュールされたトリガーで Atlas 管理APIやその他の外部サービスを呼び出すようにするには、これらのIPアドレスをサービス アカウントの API Access List に追加する必要があります。

    Atlas Functionで使用されるアウトバウンドIPアドレスの完全なリストについては、関数のセキュリティ アウトバウンドIPアクセス を参照してください。各IPアドレスを個別に追加する必要があります。

2

サービス アカウントの認証情報を保存するには、次の値とシークレットを作成します。

  • AtlasClientId サービス アカウントクライアントIDを含む値。

  • AtlasClientSecret サービス アカウントクライアントシークレットを含む シークレット

  • AtlasClientSecret シークレットにリンクする値。これにより、シークレットとして安全に保存されたままに、関数内のクライアントシークレット値にアクセスできるようになります。

  1. Atlas で、 Triggers ページに移動します。

    1. まだ表示されていない場合は、プロジェクトを含む組織をナビゲーション バーの Organizations メニューで選択します。

    2. まだ表示されていない場合は、ナビゲーション バーの Projects メニューからプロジェクトを選択します。

    3. サイドバーで、 Streaming Data見出しの下のTriggersをクリックします。

    Triggersページが表示されます。

  2. Values ページに移動します。

    1. Linked App Service: Triggersリンクをクリックします。

    2. サイドバーで、 Build見出しの下のValuesをクリックします。

  3. クライアントID を値 に保存します。

    1. クリック Create a Value

    2. Value Name として AtlasClientId を入力します。

    3. Valueタイプを選択します。

    4. Custom Content オプションを選択し、クライアントIDを入力します。

      注意

      クライアントID は、引用符("<clientId>")を含む文字列として入力する必要があります。

    5. [Save] をクリックします。

  4. クライアントシークレットを シークレット に保存し、それを 値にリンクします。

    注意

    シークレット値には直接アクセスできないため、シークレットにリンクする 2 番目の 値 を作成する必要があります。

    1. [Create a Value] をクリックします。

    2. Value Name として AtlasClientSecret を入力します。

    3. Valueタイプを選択します。

    4. Link to Secret オプションを選択します。

    5. シークレット値に名前を付けるには、「AtlasClientSecret」と入力し、Create "AtlasClientSecret" をクリックします。

      シークレット名の下に表示される Client Secretフィールドにクライアントシークレットを貼り付けます。

    6. シークレットと値の両方を作成するには、Save をクリックします。

3

サービス アカウントの認証情報を使用してアクセス トークンを検索し、 Atlas 管理APIを呼び出すための適切な認証ヘッダーを返す再利用可能な関数を作成するには、次の手順に従います。

  1. Functions ページに移動します。

    1. サイドバーで、 Build見出しの下のFunctionsをクリックします。

    2. [Create a Function] をクリックします。

      Settingsタブにはデフォルトで が表示されます。

  2. 関数の Name として getAuthHeaders を入力します。

  3. Privatetrue に設定します。この関数は、このチュートリアルでは他の関数によってのみ呼び出されます。

    Settingsタブのその他の構成オプションはデフォルト値のままにします。

  4. 関数コードを定義してください。

    [Function Editor ] タブをクリックし、次のコードを貼り付けて関数を定義します。

    1/*
    2 * Generate API request headers with a new Service Account Access Token.
    3 */
    4exports = async function getAuthHeaders() {
    5
    6 // Get stored credentials
    7 clientId = context.values.get("AtlasClientId");
    8 clientSecret = context.values.get("AtlasClientSecret");
    9
    10 // Throw an error if credentials are missing
    11 if (!clientId || !clientSecret) {
    12 throw new Error("Authentication credentials not found. Set AtlasClientId/AtlasClientSecret (service account auth credentials).");
    13 }
    14
    15 // Define the argument for the HTTP request to get the access token
    16 const tokenUrl = "https://cloud.mongodb.com/api/oauth/token";
    17 const credentials = Buffer.from(`${clientId}:${clientSecret}`).toString("base64");
    18
    19 const arg = {
    20 url: tokenUrl,
    21 headers: {
    22 "Authorization": [ `Basic ${credentials}` ],
    23 "Content-Type": [ "application/x-www-form-urlencoded" ]
    24 },
    25 body: "grant_type=client_credentials"
    26 }
    27
    28 // The response body is a BSON.Binary object; parse it to extract the access token
    29 const response = await context.http.post(arg);
    30 const tokenData = JSON.parse(response.body.text());
    31 const accessToken = tokenData.access_token;
    32
    33 // Define the Accept header with the resource version from env var or default to latest stable
    34 const resourceVersion = context.environment.ATLAS_API_VERSION || "2025-03-12";
    35 const acceptHeader = `application/vnd.atlas.${resourceVersion}+json`;
    36
    37 // Return the access token as headers for future API calls
    38 return {
    39 headers: {
    40 "Authorization": [ `Bearer ${accessToken}` ],
    41 "Accept": [ acceptHeader ],
    42 "Accept-Encoding": [ "bzip, deflate" ],
    43 "Content-Type": [ "application/json" ]
    44 }
    45 };
    46}
4

1 つのプロジェクトの 1 つのクラスターの更新 をラップする再利用可能な関数 エンドポイントとなる接続されたデバイスを作成するには、次の手順に従います。

  1. Functions ページから、Create a Function をクリックします。

    Settingsタブにはデフォルトで が表示されます。

  2. 関数の Name として modifyCluster を入力します。

  3. Privatetrue に設定します。この関数は、このチュートリアルでは他の関数によってのみ呼び出されます。

    Settingsタブのその他の構成オプションはデフォルト値のままにします。

  4. 関数コードを定義してください。

    [Function Editor ] タブをクリックし、次のコードを貼り付けて関数を定義します。

    1/*
    2 * Modifies the cluster as defined by the `body` parameter.
    3 * See https://www.mongodb.com/ja-jp/docs/atlas/reference/api-resources-spec/v2/#tag/Clusters/operation/updateCluster
    4 */
    5exports = async function(projectID, clusterName, body) {
    6
    7 // Easy testing from the console
    8 if (projectID === "Hello world!") {
    9 projectID = "<projectId>";
    10 clusterName = "<clusterName>";
    11 body = { paused: false };
    12 }
    13
    14 // Retrieve headers to authenticate with a new access token, and define the request URL for the Atlas API endpoint
    15 const authHeaders = await context.functions.execute("getAuthHeaders");
    16 const requestUrl = `https://cloud.mongodb.com/api/atlas/v2/groups/${projectID}/clusters/${clusterName}`;
    17
    18 // Build the argument for the HTTP request to the Atlas API to modify the cluster
    19 const arg = {
    20 url: requestUrl,
    21 headers: authHeaders.headers,
    22 body: JSON.stringify(body)
    23 };
    24
    25 // The response body is a BSON.Binary object; parse it and return the modified cluster description
    26 const response = await context.http.patch(arg);
    27 if (response.body) {
    28 return EJSON.parse(response.body.text());
    29 } else {
    30 throw new Error(`No response body returned from Atlas API. Status code: ${response.status}`);
    31 }
    32};

    注意

    関数エディターでコードをテストします。

    Testing Console で関数を実行すると、Function Editor は最初の引数として "Hello world!" を自動的に提供します。このコードはその入力をテストし、"Hello world!" が受信された場合は パラメーターに値を提供します。

    独自の入力で関数をテストするには、次のプレースホルダー値を独自の情報に置き換えます。

    • <projectId>

    • <clusterName>

    • body パラメーターでは、クラスターに加える変更を含むペイロードを指定します。例コードには、クラスターを一時停止するペイロードが含まれています。

この手順では、クラスターを自動的に一時停止し、各日の午前中に再開する予定されたトリガーが作成されます。これは、営業時間外で実行する必要がない非本番クラスターや、スケジュール時に自動的に一時停止して再開したいクラスターに便利です。

1
  1. Atlas で、 Triggers ページに移動します。

    1. まだ表示されていない場合は、プロジェクトを含む組織をナビゲーション バーの Organizations メニューで選択します。

    2. まだ表示されていない場合は、ナビゲーション バーの Projects メニューからプロジェクトを選択します。

    3. サイドバーで、 Streaming Data見出しの下のTriggersをクリックします。

    Triggersページが表示されます。

  2. Functionsページに移動します

    1. Linked App Service: Triggersリンクをクリックします。

    2. サイドバーで、 Build見出しの下のFunctionsをクリックします。

    3. [Create a Function] をクリックします。

      Settingsタブにはデフォルトで が表示されます。

  3. 関数の Name として pauseClusters を入力します。

  4. Privatetrue に設定します。この関数は、このチュートリアルでは pauseClusters trigger によってのみ呼び出されます。

    Settingsタブのその他の構成オプションはデフォルト値のままにします。

  5. 関数コードを定義してください。

    [Function Editor ] タブをクリックし、次のコードを貼り付けて関数を定義します。

    1/*
    2 * Iterates over the provided projects and clusters, pausing those clusters.
    3 */
    4exports = async function () {
    5
    6 // Supply project IDs and cluster names to pause
    7 const projectIDs = [
    8 {
    9 id: "<projectIdA>",
    10 names: [ "<clusterNameA>", "<clusterNameB>" ]
    11 },
    12 {
    13 id: "<projectIdB>",
    14 names: [ "<clusterNameC>" ]
    15 }
    16 ];
    17
    18 // Set desired state
    19 const body = { paused: true };
    20
    21 // Pause each cluster and log the response
    22 for (const project of projectIDs) {
    23 for (const cluster of project.names) {
    24 const result = await context.functions.execute(
    25 "modifyCluster",
    26 project.id,
    27 cluster,
    28 body,
    29 );
    30 console.log("Cluster " + cluster + ": " + EJSON.stringify(result));
    31 }
    32 }
    33
    34 return "Clusters Paused";
    35};

    projectIDs 配列を独自のプロジェクトとクラスター名に置き換えます。

    注意

    プロジェクトとクラスター名がハードコーディングされないようにするには、このチュートリアルの最後にヘルパー関数を使用して、Atlas 管理APIからプロジェクトとクラスターのリストを取得し、スケジュールでどのクラスターを一時停止および再開するかをプログラムで決定できます。

2
  1. Functions ページから、Build 見出しの下のサイドバーにある Triggers をクリックして、Triggers ページに移動します。

  2. Create a Triggerをクリックしてトリガー設定ページを開きます。

    既存の trigger がある場合は、次をクリックします Add a Trigger

  3. trigger 設定を構成します。

    Trigger Details で、次の構成を設定します。

    設定

    trigger タイプ

    予定

    スケジュールの種類

    高度。これにより、スケジュールにCRON式を指定できるようになります。

    62200これを曜日ごとに実行するには、次の [CRON式]を使用します。

    0 22 * * 1-5

    再有効化時にイベントをスキップ

    。これにより、trigger が無効になっている間にキューに入れられたスケジュールで trigger が実行されなくなります。

    eventType

    関数。ドロップダウンから pauseClusters 関数を選択します。

    trigger 名

    pauseClusters

  4. trigger を作成するには、Save をクリックします。

    テスト クラスターは、毎日午後 6 時(米国東部)に自動的に一時停止されるようになりました。

3
  1. pauseClusters 関数を resumeClusters という名前の新しい関数に複製します。

  2. Function Editorタブで、関数コードで paused 状態を false に更新します。

    1/*
    2 * Iterates over the provided projects and clusters, resuming those clusters.
    3 */
    4exports = async function () {
    5
    6 // Supply project IDs and cluster names to resume
    7 const projectIDs = [
    8 {
    9 id: "<projectIdA>",
    10 names: [ "<clusterNameA>", "<clusterNameB>" ]
    11 },
    12 {
    13 id: "<projectIdB>",
    14 names: [ "<clusterNameC>" ]
    15 }
    16 ];
    17
    18 // Set desired state
    19 const body = { paused: false };
    20
    21 // Resume each cluster and log the response
    22 for (const project of projectIDs) {
    23 for (const cluster of project.names) {
    24 const result = await context.functions.execute(
    25 "modifyCluster",
    26 project.id,
    27 cluster,
    28 body,
    29 );
    30 console.log("Cluster " + cluster + ": " + EJSON.stringify(result));
    31 }
    32 }
    33
    34 return "Clusters Resumed";
    35};
4
  1. Functions ページから、Build 見出しの下のサイドバーにある Triggers をクリックして、Triggers ページに移動します。

  2. trigger 設定を構成します。

    Trigger Details で、次の構成を設定します。

    設定

    trigger タイプ

    予定

    スケジュールの種類

    高度。これにより、スケジュールにCRON式を指定できるようになります。

    これを毎日午前 8 に米国東部(12:00 UTC)に実行するには、次の CRON式を使用します。

    0 12 * * 1-5

    再有効化時にイベントをスキップ

    。これにより、trigger が無効になっている間にキューに入れられたスケジュールで trigger が実行されなくなります。

    eventType

    関数。ドロップダウンから resumeClusters 関数を選択します。

    trigger 名

    resumeClusters

  3. trigger を作成するには、Save をクリックします。

これで、テスト クラスターは毎週ごとに一時停止され、毎週午前に自動的に再開されます。

この手順では、ピーク時間帯にクラスターを自動的に増やすアップし、その後はダウンするように予定されたトリガーを作成します。これは、ワークロードが増加する前に積極的に増やす、その後は増やすしてコストを節約したい、予測可能な使用パターンを持つクラスターに役立ちます。

注意

Atlas は、使用状況または予測された使用量に基づいて、クラスター オートスケーリング をサポートしており、クラスター階層またはストレージ キャパシティーを自動的に増やすことができます。ただし、予測可能なピーク使用ウィンドウがある場合は、予定されたトリガーを使用して、ワークロードが増加する前にクラスターを積極的に増やすことができます。

1
  1. Atlas で、 Triggers ページに移動します。

    1. まだ表示されていない場合は、プロジェクトを含む組織をナビゲーション バーの Organizations メニューで選択します。

    2. まだ表示されていない場合は、ナビゲーション バーの Projects メニューからプロジェクトを選択します。

    3. サイドバーで、 Streaming Data見出しの下のTriggersをクリックします。

    Triggersページが表示されます。

  2. Functionsページに移動します

    1. Linked App Service: Triggersリンクをクリックします。

    2. サイドバーで、 Build見出しの下のFunctionsをクリックします。

    3. [Create a Function] をクリックします。

      Settingsタブにはデフォルトで が表示されます。

  3. 関数の Name として scaleClusterUp を入力します。

  4. Privatetrue に設定します。この関数は、このチュートリアルでは scaleClusterUp trigger によってのみ呼び出されます。

    Settingsタブのその他の構成オプションはデフォルト値のままにします。

  5. 関数コードを定義してください。

    Create Function ページから、Function Editorタブをクリックし、次のコードを貼り付けて関数を定義します。

    1/*
    2 * Scales a single cluster up to a larger instance size.
    3 * This example scales an AWS cluster up to M30 in region US_EAST_1.
    4 */
    5exports = async function() {
    6 // Supply project ID and cluster name...
    7 const projectID = "<projectId>";
    8 const clusterName = "<clusterName>";
    9
    10 // Set the desired instance size and topology...
    11 const body = {
    12 replicationSpecs: [
    13 {
    14 regionConfigs: [
    15 {
    16 electableSpecs: {
    17 instanceSize: "M30", // for example, larger tier
    18 nodeCount: 3
    19 },
    20 priority: 7,
    21 providerName: "AWS",
    22 regionName: "US_EAST_1"
    23 }
    24 ]
    25 }
    26 ]
    27 };
    28
    29 // Scale up the cluster and log the response
    30 const result = await context.functions.execute(
    31 "modifyCluster",
    32 projectID,
    33 clusterName,
    34 body
    35 );
    36 console.log(EJSON.stringify(result));
    37
    38 return clusterName + " scaled up";
    39};

    <projectId><clusterName> のプレースホルダーを独自のグループ IDとクラスター名に置き換え、regionConfigs 配列を独自のトポロジーに合わせて調整します。

    クラスターの構成を変更するためにリクエスト本文に含めることができる利用可能なフィールドの詳細については、「1 つのプロジェクトで 1 つのクラスターを更新」エンドポイントとなる接続されたデバイスのドキュメントを参照してください。

2
  1. Functions ページから、Build 見出しの下のサイドバーにある Triggers をクリックして、Triggers ページに移動します。

  2. Create a Triggerをクリックしてトリガー設定ページを開きます。

    既存の trigger がある場合は、次をクリックします Add a Trigger

  3. trigger 設定を構成します。

    Trigger Details で、次の構成を設定します。

    設定

    trigger タイプ

    予定

    スケジュールの種類

    高度。これにより、スケジュールにCRON式を指定できるようになります。

    これを毎日午前 8 に米国東部(13:00 UTC)に実行するには、次の CRON式を使用します。

    0 13 * * *

    再有効化時にイベントをスキップ

    。これにより、trigger が無効になっている間にキューに入れられたスケジュールで trigger が実行されなくなります。

    eventType

    関数。ドロップダウンから pauseClusters 関数を選択します。

    trigger 名

    scaleClusterUp

  4. trigger を作成するには、Save をクリックします。

    テスト クラスターは、毎日午前 8 時(米国東部)にテスト クラスターが自動的に増やすアップされるようになりました。

3
  1. scaleClusterUp 関数を scaleClusterDown という名前の新しい関数に複製します。

  2. Function Editorタブで、次のコードを貼り付けて調整し、指定された構成にクラスターを増やすダウンします。

    1/*
    2 * Scales a single cluster down to a smaller instance size.
    3 * This example scales an AWS cluster down to M10 in region US_EAST_1.
    4 */
    5exports = async function() {
    6 const projectID = "<projectId>";
    7 const clusterName = "<clusterName>";
    8
    9 const body = {
    10 replicationSpecs: [
    11 {
    12 regionConfigs: [
    13 {
    14 electableSpecs: {
    15 instanceSize: "M10", // for example, smaller tier
    16 nodeCount: 3
    17 },
    18 priority: 7,
    19 providerName: "AWS",
    20 regionName: "US_EAST_1"
    21 }
    22 ]
    23 }
    24 ]
    25 };
    26
    27 // Scale down the cluster and log the response
    28 const result = await context.functions.execute(
    29 "modifyCluster",
    30 projectID,
    31 clusterName,
    32 body
    33 );
    34 console.log(EJSON.stringify(result));
    35
    36 return clusterName + " scaled down";
    37};

    <projectId><clusterName> のプレースホルダーを独自のグループ IDとクラスター名に置き換え、regionConfigs 配列を独自のトポロジーに合わせて調整します。

    クラスターの構成を変更するためにリクエスト本文に含めることができる利用可能なフィールドの詳細については、「1 つのプロジェクトで 1 つのクラスターを更新」エンドポイントとなる接続されたデバイスのドキュメントを参照してください。

4
  1. Functions ページから、Build 見出しの下のサイドバーにある Triggers をクリックして、Triggers ページに移動します。

  2. trigger 設定を構成します。

    Trigger Details で、次の構成を設定します。

    設定

    trigger タイプ

    予定

    スケジュールの種類

    高度。これにより、スケジュールにCRON式を指定できるようになります。

    これを毎日午後6時(米国東部時間、UTCでは22:00)に実行するには、次のCRON式を使用します。

    0 22 * * *

    再有効化時にイベントをスキップ

    。これにより、trigger が無効になっている間にキューに入れられたスケジュールで trigger が実行されなくなります。

    eventType

    関数。ドロップダウンから scaleClusterDown 関数を選択します。

    trigger 名

    scaleClusterDown

  3. trigger を作成するには、Save をクリックします。

これら 2 つの trigger を組み合わせると、クラスターがピーク時間帯により高いキャパシティーで実行され、その後はスケールダウンされます。

次のヘルパー関数は、Triggers 関数エディターからテスト実行して、組織内のプロジェクトとクラスターを一覧表示して、このチュートリアルの関数でターゲットにするクラスターを指定できます。また、他の関数からこれらの関数を呼び出して、プログラムでこの情報を検索することもできます。

戻る

予定されたTriggers

項目一覧