This product is not supported for your selected Datadog site. ().
Join the Preview!

デプロイメントゲートはプレビュー版です。この機能に関心がある場合は、フォームに記入してアクセスをリクエストしてください。

Request Access

事前構成されたデプロイメントゲートでは、ゲートとルールが Datadog に保持され、評価時にサービスおよび環境によって参照されます。事前構成されたゲートは、多くのデプロイメント間でルールを共有したい場合、Terraform で構成を管理したい場合、または CI ユーザー以外のユーザーに Datadog UI でルールを編集させたい場合に適しています。

デプロイ構成でルールをインラインで定義することをご希望ですか。Just-In-Time (JIT) デプロイメントゲート を参照してください。

ゲートを作成する

デプロイメントゲート UI の使用に加えて、デプロイメントゲート API または Datadog Terraform プロバイダーを使用して、ゲートとルールをプログラムで管理することができます。
  1. Software Delivery > Deployment Gates > Configuration の順に移動します。
  2. Create Gate をクリックします。
  3. 次の設定を構成します。
    • Service: サービス名 (例: transaction-backend)。
    • Environment: ターゲット環境 (例: dev)。
    • Identifier (オプション、デフォルト値は default): 同じサービス/環境上の複数のゲートに対する一意の名前。これを使用して、以下を実行します。
      • 異なるデプロイ戦略を許可する (例: fast-deploy と default)
      • デプロイフェーズを区別する (例: pre-deploy と post-deploy)
      • カナリーステージを定義する (例: pre-deploy と canary-20pct)。
    • Evaluation Mode: デプロイに影響を与えずにゲートの動作をテストするには、Dry Run を有効にしてください。ドライランゲートの評価は常に合格ステータスで応答しますが、アプリ内の結果には実際の評価が反映されます。これは、デプロイパイプラインに影響を与えずにゲート動作の初期評価を行う場合に便利です。

ゲートにルールを追加する

各ゲートには、評価対象となるルールが 1 つ以上必要です。ゲートが成功するには、すべてのルールに合格する必要があります。各ルールについて、以下を指定します。

  1. Name: デプロイメントゲート評価 ページに表示される説明ラベル (例: Check all P0 monitors)。
  2. Type: Monitor または Faulty Deployment Detection を選択します。
  3. 選択したルールタイプに基づく追加の設定。利用可能なオプションについては、ルールタイプを参照してください。
  4. Evaluation Mode: ルールが Dry Run として設定されている場合、その結果はゲート全体の計算時には考慮されません。

ルールタイプ

完全なスキーマおよび利用可能なすべてのオプションについては、デプロイメントゲート API リファレンス を参照してください。

モニタールールは、構成可能な期間にわたって一連のモニターの状態を評価します。検索クエリまたは明示的なモニターのリストを使用して、モニターを選択します。これらの選択方法は相互に排他的です。評価期間中に以下のいずれかが発生した場合、ルールは失敗する可能性があります。

  • 構成された選択条件に一致するモニターグループがありません。
  • 明示的なモニター ID が存在しないか、組織で利用できません。
  • 構成された選択条件に 300 を超えるモニターが一致しています。
  • 一致するモニターグループがいずれも ALERT または NO_DATA 状態です。
コンフィギュレーション設定
  • Monitors matching query: 検索モニター構文 に基づいてクエリを入力します。モニタータグでフィルタリングします。
    • モニターの静的タグ: service:transaction-backend
    • モニターのクエリ内のタグ: scope:"service:transaction-backend"
    • モニターのグループ化 内のタグ: group:"service:transaction-backend"
  • Specific monitors: 個別のモニターを選択し、必要に応じて各モニターの評価対象の正確なグループを選択します。グループが選択されていない場合、そのモニターのすべてのグループが評価されます。
  • Duration: 選択したモニターが評価される期間 (秒単位)。デフォルトは 0 です (モニターは即座に評価されます)。最大値は 7200 秒 (2 時間) です。
クエリの例
  • env:prod service:transaction-backend
  • env:prod (service:transaction-backend OR group:"service:transaction-backend" OR scope:"service:transaction-backend")
  • tag:"use_deployment_gates" team:payment
  • tag:"use_deployment_gates" AND (NOT group:("team:frontend"))
特定のモニター API の例
"options": {
  "monitor_ids": [
    {"id": "12345678", "groups": []},
    {"id": "87654321", "groups": ["service:api", "env:prod"]}
  ],
  "duration": 300
}

各 id は 10 進数で表されるモニター ID です。グループ値は正確なグループ名です。query を monitor_ids と一緒に送信しないでください。

注:

  • group クエリフィルターと monitor_ids[].groups は、一致するグループのみを評価します。
  • 存在しないか、組織で利用できない明示的なモニター ID は、ルールが失敗する原因となります。モニターが存在するもののミュートされているか、選択されたグループにデータがないために除外される場合、ルールは一致するグループがない動作を適用します。
  • ミュートされたモニターは、両方の選択モードから自動的に除外されます。

このルールタイプは、Watchdog の APM Faulty Deployment Detection 解析を使用して、デプロイバージョンと同一サービスの以前のバージョンを比較します。この解析によって以下が検出されます。

  • 新しいエラーのタイプ。
  • 以前のバージョンと比較したエラー率の大幅な増加。

解析はすべての APM インスツルメンテーションサービスに対して自動的に実行され、事前の設定は不要です。

コンフィギュレーション設定
  • Operation Name: サービスの APM プライマリオペレーション 設定から自動的に入力されます。
  • Duration: 解析が実行される時間 (秒単位)。最適な解析の信頼性を確保するため、この値はデプロイ開始後少なくとも 900 秒 (15 分) でなければなりません。最大値は 7200 秒 (2 時間) です。
  • Allowed Resources(オプション): 解析に含める APM リソース のカンマ区切りのリスト。指定された場合、リストにあるリソースのみが解析されます。Excluded Resources とは相互に排他的です。
  • Excluded Resources(オプション): 無視する APM リソース のカンマ区切りのリスト (例: 低ボリュームまたは優先度の低いエンドポイント)。Allowed Resources とは相互に排他的です。

注:

  • このルールは各 追加のプライマリタグ の値と集計解析の両方について評価されます。単一のプライマリタグのみを考慮するには、ゲート評価をリクエストする際に指定してください。
  • リソースレベルで新しいエラーやエラー率の増加が検出されます。
  • このルールタイプは、database または inferred service としてマークされたサービスをサポートしていません。

パイプラインからゲートを評価する

ゲートの構成後、関連サービスをデプロイする際に評価をリクエストし、その結果に基づいてデプロイをブロックするか続行するかを決定します。

datadog-ci deployment gateコマンドは、単一のコマンドで評価を実行します。

datadog-ci deployment gate --service transaction-backend --env staging --identifier default

デプロイメントゲートに APM Faulty Deployment Detection ルールが含まれている場合は、バージョンも指定してください (例: --version 1.0.1)。

コマンド:

  • ゲート評価を開始するリクエストを送信し、評価が完了するまでブロックします。
  • 評価の待機時間を構成できるタイムアウトを提供します。
  • エラーに対する組み込みの自動再試行機能があります。
  • 予期しない Datadog エラー時の動作をカスタマイズするための --fail-on-error を受け付けます。

deployment gate コマンドは、datadog-ci バージョン v3.17.0 以降で使用可能です。

必要な環境変数:

完全な構成オプションと使用例については、deployment gate コマンドのドキュメント を参照してください。

AnalysisTemplate または ClusterAnalysisTemplate を作成して、Argo Rollouts Kubernetes Resource からデプロイメントゲートを呼び出します。このテンプレートは、datadog-ci デプロイメントゲートコマンド を実行して、Deployment Gates API とのやり取りを行います。

以下のテンプレートを開始点として使用します。

  • <YOUR_DD_SITE>を Datadog サイト名 (例:) に置き換えます。
  • API キー と アプリケーションキー を環境変数として定義します。この例では、datadog と呼ばれる Kubernetes Secret と、api-key および app-key の 2 つのデータ値を使用しています。value の代わりに valueFrom を使用して、値をプレーンテキストで渡すこともできます。
apiVersion: argoproj.io/v1alpha1
kind: ClusterAnalysisTemplate
metadata:
  name: datadog-job-analysis
spec:
  args:
    - name: service
    - name: env
  metrics:
    - name: datadog-job
      provider:
        job:
          spec:
            ttlSecondsAfterFinished: 300
            backoffLimit: 0
            template:
              spec:
                restartPolicy: Never
                containers:
                  - name: datadog-check
                    image: datadog/ci:v3.17.0
                    env:
                      - name: DD_BETA_COMMANDS_ENABLED
                        value: "1"
                      - name: DD_SITE
                        value: "<YOUR_DD_SITE>"
                      - name: DD_API_KEY
                        valueFrom:
                          secretKeyRef:
                            name: datadog
                            key: api-key
                      - name: DD_APP_KEY
                        valueFrom:
                          secretKeyRef:
                            name: datadog
                            key: app-key
                    command: ["/bin/sh", "-c"]
                    args:
                      - datadog-ci deployment gate --service {{ args.service }} --env {{ args.env }} --identifier default
  • 分析テンプレートは、Rollout リソースから引数 (service、env、versionなど) を受け取ることができます。詳細については、Argo Rollouts の公式ドキュメント を参照してください。
  • ttlSecondsAfterFinishedは、5 分後に完了したジョブを削除します。
  • backoffLimitは、ゲートの評価が失敗した場合にジョブを再試行されないよう 0 に設定されています。

分析テンプレートを作成した後、Argo Rollouts 戦略からそれを参照します。

apiVersion: argoproj.io/v1alpha1
kind: Rollout
metadata:
  name: rollouts-demo
  labels:
    tags.datadoghq.com/service: transaction-backend
    tags.datadoghq.com/env: dev
spec:
  replicas: 5
  strategy:
    canary:
      steps:
        ...
        - analysis:
            templates:
              - templateName: datadog-job-analysis
                clusterScope: true # Only needed for cluster analysis
            args:
              - name: env
                valueFrom:
                  fieldRef:
                    fieldPath: metadata.labels['tags.datadoghq.com/env']
              - name: service
                valueFrom:
                  fieldRef:
                    fieldPath: metadata.labels['tags.datadoghq.com/service']
              - name: version #Required for APM Faulty Deployment Detection rules
                valueFrom:
                  fieldRef:
                    fieldPath: metadata.labels['tags.datadoghq.com/version']
        - ...

Datadog Deployment Gate GitHub Action は、ワークフローの一部として評価を実行します。

既存のデプロイワークフローに DataDog/deployment-gate-github-action ステップを追加します。

name: Deploy with Datadog Deployment Gate
on:
  push:
    branches: [main]
jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - name: Deploy Canary
        run: |
          echo "Deploying canary release for service:'my-service' in 'production'. Version 1.0.1"
          # Your deployment commands here

      - name: Evaluate Deployment Gate
        uses: DataDog/deployment-gate-github-action@v2.1.0
        env:
          DD_API_KEY: ${{ secrets.DD_API_KEY }}
          DD_APP_KEY: ${{ secrets.DD_APP_KEY }}
        with:
          service: my-service
          env: production
          identifier: default

      - name: Deploy
        run: |
          echo "Deployment Gate passed, proceeding with deployment"
          # Your deployment commands here

デプロイメントゲートに APM Faulty Deployment Detection ルールが含まれている場合は、バージョンも指定してください (例: version: 1.0.1)。

アクション:

  • ゲート評価を開始するリクエストを送信し、評価が完了するまでブロックします。
  • 評価の待機時間を構成できるタイムアウトを提供します。
  • エラーに対する組み込みの自動再試行機能があります。
  • 予期しない Datadog エラー時の動作をカスタマイズするための fail-on-error を受け付けます。

必要な環境変数:

完全な構成オプションと使用例については、DataDog/deployment-gate-github-action リポジトリ を参照してください。

このスクリプトを開始点として使用します。インラインルールなしで、事前構成されたゲートを評価します。

以下を置き換えます。

#!/bin/sh

# Configuration
MAX_RETRIES=3
DELAY_SECONDS=5
POLL_INTERVAL_SECONDS=15
MAX_POLL_TIME_SECONDS=10800 # 3 hours
API_URL="https://api.<YOUR_DD_SITE>/api/v2/deployments/gates/evaluation"
API_KEY="<YOUR_API_KEY>"
APP_KEY="<YOUR_APP_KEY>"

PAYLOAD=$(cat <<EOF
{
  "data": {
    "type": "deployment_gates_evaluation_request",
    "attributes": {
      "service": "$1",
      "env": "$2",
      "version": "$3"
    }
  }
}
EOF
)

# Step 1: Request evaluation
echo "Requesting evaluation..."
current_attempt=0
while [ $current_attempt -lt $MAX_RETRIES ]; do
   current_attempt=$((current_attempt + 1))
   RESPONSE=$(curl -s -w "%{http_code}" -o response.txt -X POST "$API_URL" \
       -H "Content-Type: application/json" \
       -H "DD-API-KEY: $API_KEY" \
       -H "DD-APPLICATION-KEY: $APP_KEY" \
       -d "$PAYLOAD")

   HTTP_CODE=$(echo "$RESPONSE" | tail -c 4)
   RESPONSE_BODY=$(cat response.txt)

   if [ ${HTTP_CODE} -ge 500 ]  &&  [ ${HTTP_CODE} -le 599 ]; then
       echo "Attempt $current_attempt: 5xx Error ($HTTP_CODE). Retrying in $DELAY_SECONDS seconds..."
       sleep $DELAY_SECONDS
       continue
   elif [ ${HTTP_CODE} -ge 400 ] && [ ${HTTP_CODE} -le 499 ]; then
       echo "Client error ($HTTP_CODE): $RESPONSE_BODY"
       exit 1
   fi

   EVALUATION_ID=$(echo "$RESPONSE_BODY" | jq -r '.data.attributes.evaluation_id')
   if [ "$EVALUATION_ID" = "null" ] || [ -z "$EVALUATION_ID" ]; then
       echo "Failed to extract evaluation_id from response: $RESPONSE_BODY"
       exit 1
   fi

   echo "Evaluation started with ID: $EVALUATION_ID"
   break
done

if [ $current_attempt -eq $MAX_RETRIES ]; then
   echo "All retries exhausted for evaluation request, but treating 5xx errors as success."
   exit 0
fi

# Step 2: Poll for results
echo "Polling for results..."
start_time=$(date +%s)
poll_count=0

while true; do
  poll_count=$((poll_count + 1))
  current_time=$(date +%s)
  elapsed_time=$((current_time - start_time))

  if [ $elapsed_time -ge $MAX_POLL_TIME_SECONDS ]; then
      echo "Evaluation polling timeout after ${MAX_POLL_TIME_SECONDS} seconds"
      exit 1
  fi

  RESPONSE=$(curl -s -w "%{http_code}" -o response.txt -X GET "$API_URL/$EVALUATION_ID" \
      -H "DD-API-KEY: $API_KEY" \
      -H "DD-APPLICATION-KEY: $APP_KEY")

  HTTP_CODE=$(echo "$RESPONSE" | tail -c 4)
  RESPONSE_BODY=$(cat response.txt)

  if [ ${HTTP_CODE} -eq 404 ]; then
      echo "Evaluation not ready yet (404), retrying in $POLL_INTERVAL_SECONDS seconds... (attempt $poll_count, elapsed: ${elapsed_time}s)"
      sleep $POLL_INTERVAL_SECONDS
      continue
  elif [ ${HTTP_CODE} -ge 500 ]  &&  [ ${HTTP_CODE} -le 599 ]; then
      echo "Server error ($HTTP_CODE) while polling, retrying in $POLL_INTERVAL_SECONDS seconds... (attempt $poll_count, elapsed: ${elapsed_time}s)"
      sleep $POLL_INTERVAL_SECONDS
      continue
  elif [ ${HTTP_CODE} -ge 400 ] && [ ${HTTP_CODE} -le 499 ]; then
      echo "Client error ($HTTP_CODE) while polling: $RESPONSE_BODY"
      exit 1
  fi

  GATE_STATUS=$(echo "$RESPONSE_BODY" | jq -r '.data.attributes.gate_status')

  if [ "$GATE_STATUS" = "pass" ]; then
      echo "Gate evaluation PASSED"
      exit 0
  elif [ "$GATE_STATUS" = "fail" ]; then
      echo "Gate evaluation FAILED"
      exit 1
  else
      echo "Evaluation still in progress (status: $GATE_STATUS), retrying in $POLL_INTERVAL_SECONDS seconds... (attempt $poll_count, elapsed: ${elapsed_time}s)"
      sleep $POLL_INTERVAL_SECONDS
      continue
  fi
done

スクリプト:

  • 次の 3 つの入力を受け付けます。service、environment、version。ゲートに APM Faulty Deployment Detection ルールがある場合は、version が必要です。必要に応じて、identifier と primary_tag を追加することもできます。
  • 評価を開始するためのリクエストを送信し、evaluation_id を記録します。HTTP レスポンスコードを処理します。
    • 5xx: サーバーエラー、遅れて再試行します。
    • 4xx: クライアントエラー、評価が失敗します。
    • 2xx: 評価が開始されました。
  • 評価が完了するまで、evaluation_idを使用して評価ステータスエンドポイントをポーリングします。
    • 5xx: サーバーエラー、遅れて再試行します。
    • 404: 評価がまだ開始されていません。遅れて再試行します。
    • 4xx (404 を除く): クライアントエラー、評価が失敗します。
    • 2xx: gate_status をチェックし、完了していない場合は遅れて再試行します。
  • 評価が完了するか、最大ポーリング時間 (デフォルトで 10800 秒 = 3 時間) に達するまで 15 秒ごとにポーリングします。
  • 初期リクエスト (5xx レスポンス) のすべての再試行が使い果たされた場合、API 障害に対する回復力を確保するため、スクリプトはこれを成功として扱います。

ユースケースに合わせてスクリプトを調整してください。これは curl (リクエストを実行) と jq (返された JSON を処理) を使用します。これらのコマンドが利用できない場合は、スクリプトの冒頭で (例: apk add --no-cache curl jq を使用) インストールしてください。

デプロイメントゲートの評価は非同期です。評価をトリガーするとバックグラウンドで開始され、API は進捗状況を追跡するために使用できる評価 ID を返します。

  • まず、デプロイメントゲート評価をリクエストします。これによってプロセスが開始され、評価 ID が返されます。
  • 次に、評価ステータスエンドポイントを評価 ID で定期的にポーリングし、評価が完了した時点で結果を取得します。10 ~ 20 秒ごとのポーリングが推奨されます。

以下を置き換えます。

Datadog にすでに存在するゲートの評価をリクエストします。

curl -X POST "https://api.<YOUR_DD_SITE>/api/v2/deployments/gates/evaluation" \
-H "Content-Type: application/json" \
-H "DD-API-KEY: <YOUR_API_KEY>" \
-H "DD-APPLICATION-KEY: <YOUR_APP_KEY>" \
-d @- << EOF
{
  "data": {
    "type": "deployment_gates_evaluation_request",
    "attributes": {
      "service": "transaction-backend",
      "env": "staging",
      "identifier": "my-custom-identifier",
      "version": "v123-456",
      "primary_tag": "region:us-central-1"
    }
  }
}
EOF

オプションの属性:

  • identifier: オプション、デフォルトは default。
  • version: APM Faulty Deployment Detection ルールに必須です。
  • primary_tag: オプション。APM Faulty Deployment Detection の分析を選択したプライマリタグに絞り込みます。

注: 404 HTTP レスポンスは、ゲートが見つからなかったか、ゲートは見つかったもののルールが存在しないことを意味する場合があります。

ゲート評価が正常に開始された場合、202 HTTP ステータスコードが返されます。

{
   "data": {
       "id": "<random_response_uuid>",
        "type": "deployment_gates_evaluation_response",
        "attributes": {
            "evaluation_id": "e9d2f04f-4f4b-494b-86e5-52f03e10c8e9"
        }
    }
}

フィールド data.attributes.evaluation_id には、このゲート評価の一意の識別子が含まれます。

評価 ID を使用してステータスエンドポイントをポーリングし、ゲート評価のステータスを取得します。

curl -X GET "https://api.<YOUR_DD_SITE>/api/v2/deployments/gates/evaluation/<evaluation_id>" \
-H "DD-API-KEY: <YOUR_API_KEY>" \
-H "DD-APPLICATION-KEY: <YOUR_APP_KEY>"

注: 評価をリクエストした直後にこのエンドポイントを呼び出すと、評価がまだ開始されていないため、404 HTTP レスポンスが返される場合があります。数秒後に再試行してください。

200 HTTP レスポンスが返される場合、その形式は以下の通りです。

{
   "data": {
       "id": "<random_response_uuid>",
       "type": "deployment_gates_evaluation_result_response",
       "attributes": {
           "dry_run": false,
           "evaluation_id": "e9d2f04f-4f4b-494b-86e5-52f03e10c8e9",
           "evaluation_url": "https://app.datadoghq.com/ci/deployment-gates/evaluations?index=cdgates&query=level%3Agate+%40evaluation_id%3Ae9d2f14f-4f4b-494b-86e5-52f03e10c8e9",
           "gate_id": "e140302e-0cba-40d2-978c-6780647f8f1c",
           "gate_status": "pass",
           "rules": [
               {
                   "name": "Check service monitors",
                   "status": "fail",
                   "reason": "One or more monitors in ALERT state: https://app.datadoghq.com/monitors/34330981",
                   "dry_run": true
               }
           ]
       }
   }
}

data.attributes.gate_status フィールドには評価結果が含まれ、値は以下のいずれかです。

  • in_progress: デプロイメントゲート評価は進行中です。ポーリングを続けてください。
  • pass: デプロイメントゲート評価が成功しました。
  • fail: デプロイメントゲート評価が失敗しました。

注: data.attributes.dry_run フィールドが true の場合、data.attributes.gate_status フィールドは常に pass となります。

初めてオンボーディングを行う際の推奨事項

Continuous Delivery ワークフローにデプロイメントゲートを統合する際、評価フェーズを設けることで、デプロイメントに影響を与える前に製品が期待通りに動作していることを確認できます。ドライラン評価モードと Deployment Gates Evaluations ページを使用します。

  1. サービスのゲートを作成し、Evaluation Mode を Dry Run に設定します。
  2. デプロイメントプロセスにゲート評価を追加します。ゲートがドライランモードの間、API は常に pass を返し、デプロイメントはゲート結果の影響を受けません。
  3. 一定期間 (例: 1 〜 2 週間) 経過後、Deployment Gates Evaluations ページでゲートとルールの実行をチェックしてください。UI には実際のステータスが表示されるため、ゲートが失敗したタイミングとその理由を確認できます。
  4. ゲートの動作が期待通りであることを確認したら、ゲートを編集し、評価モードを Dry Run から Active に切り替えます。その後、API は実際のステータスを返すようになり、ゲートの結果に基づいてデプロイメントの昇格やロールバックが開始されます。

参考資料