03-6417-9339

平日 9:30 ~ 12:00 / 13:00 ~ 17:30

Fargate上のコンテナパッケージ情報の登録・更新


本ページでは、AWS Fargate上で実行中のLinuxコンテナからパッケージ情報を収集し、SIDfm VMへ自動的に登録・更新する手順をご案内します。

1. 概要

  • 本手順は、Fargate 環境において、AWS CLI の ECS Exec 機能を利用してコンテナ内部でコマンドを実行します。
  • 本手順では、次の2通りの実行パターンに対応しています。
    • 状況 1:AWS CLI を実行する環境(ローカルなど)から、VMサーバへ直接アクセス可能
      → パッケージ情報の収集と登録を同一場所で実行
    • 状況 2:AWS CLI を実行する環境(ローカルなど)から、VMサーバへ直接アクセス不可
      → パッケージ情報収集後、別のサーバからVM登録処理を実行

    ご利用中の環境に応じて、該当する手順に従ってください。

  • 対応しているコンテナの OS は こちら をご参照ください。

    ※ Windows 系のコンテナには現在対応しておりません。

  • 以下の OS は、Red Hat Enterprise Linux として登録することで脆弱性を検出できます。
    • RockyLinux 8 / 9
    • Oracle Linux 8 / 9

    検出される脆弱性は Red Hat Enterprise Linux のものとなりますので、詳細は対象 OS の公式情報をご確認ください。

2. 必要な条件

  • 概要で記載した対応OSを使用しているコンテナが Fargate 上で動作していること
  • ECS Exec を実行するためのツールと環境構成
    • ローカル環境のツール
      以下のツールがインストール済みであること:
      • AWS CLI
      • Session Manager Plugin for AWS CLI
    • ECS 環境構成
      以下の構成が完了していること:
      • Fargate クラスタおよびサービスが作成済みであること
      • タスク定義およびサービス設定で ECS Exec が有効化されていること
      • タスク実行ロールに ECS Exec に必要な IAM 権限が付与されていること

    ※ ECS Exec の設定方法や必要な IAM 権限については、以下の公式ドキュメントをご参照ください。

  • VM APIへのアクセスが可能なこと(以下を把握していること)
    • VMサーバのホスト名(APIエンドポイントURL内のホスト名)
    • APIキー
      • SIDfm VM 管理者権限またはSIDfm VM 報告者権限のユーザに紐付けられた VM API キー
    • システムカテゴリID
    • カスタムカテゴリID

    ※ 設定メニューの「カテゴリ設定」画面でエクスポートを行うことで、カテゴリIDを確認できます。
       ただし、エクスポートが可能なのは SIDfm VM 管理者権限を持つユーザのみです。
    こちらの VM API エンドポイントを使用すれば、APIキーに紐付けられたユーザがアクセス可能なカテゴリ一覧を取得でき、カテゴリIDも確認できます。


3. 手順

3.1 状況 1: AWS CLI を実行する環境(ローカルなど)から、VMサーバへ直接アクセス可能

    ここでは、AWS CLI を実行可能な環境で 2 種類のスクリプトを実行します。
    1つ目のスクリプトは、指定されたFargateクラスター内の全コンテナに対して ECS Exec を使い、パッケージ情報を収集します。
    2つ目のスクリプトは、収集された JSON データを VM API に送信します。


  1. コンテナパッケージ情報収集スクリプトの実行

    AWS CLI を実行可能な環境で、以下のスクリプトを実行します。
    実行方法については、後述の「実行方法」をご参照ください。

    クリックしてスクリプト全文を表示
    #!/bin/bash
    set -e
    
    # 結果保存先ディレクトリ
    OUTPUT_DIR="$HOME/sidfmvm_container_jsons"
    mkdir -p "$OUTPUT_DIR"
    
    # 対象のクラスター
    CLUSTER="YourClusterName"
    
    # クラスター内の全実行中タスクのARN一覧を取得する
    TASK_ARNS=$(aws ecs list-tasks --cluster "$CLUSTER" --desired-status RUNNING --query 'taskArns[*]' --output text)
    echo "対象タスク: $TASK_ARNS"
    
    # 全タスクの詳細を一括で取得する
    TASKS_JSON=$(aws ecs describe-tasks --cluster "$CLUSTER" --tasks $TASK_ARNS --output json)
    
    # jq を使用して各タスクを処理する
    TASK_COUNT=$(echo "$TASKS_JSON" | jq '.tasks | length')
    echo "タスク数: $TASK_COUNT"
    
    for (( i=0; i<$TASK_COUNT; i++ )); do
        TASK_ARN=$(echo "$TASKS_JSON" | jq -r ".tasks[$i].taskArn")
        echo "処理中タスク: $TASK_ARN"
        # タスクID(ARNの最後の部分)を抽出する
        TASK_ID_SHORT=$(echo "$TASK_ARN" | awk -F'/' '{print $NF}')
        
        # タスク内のコンテナ数を取得する
        CONTAINER_COUNT=$(echo "$TASKS_JSON" | jq ".tasks[$i].containers | length")
        for (( j=0; j<$CONTAINER_COUNT; j++ )); do
            CONTAINER_NAME=$(echo "$TASKS_JSON" | jq -r ".tasks[$i].containers[$j].name")
            
            # "ecs-service-connect-"で始まるコンテナはスキップする
            if [[ "$CONTAINER_NAME" == ecs-service-connect-* ]]; then
                echo "タスク $TASK_ARN のコンテナ [$CONTAINER_NAME] はスキップします。"
                continue
            fi
            
            echo "タスク $TASK_ARN のコンテナ: $CONTAINER_NAME"
            
            # コンテナ内で実行するシェルコマンドを定義する
            COMMAND="sh -c ' \
    container_id=\$(cat /proc/self/cgroup | grep -oE \"[0-9a-f]{64}\" | head -n 1 | tr -d \"\r\"); \
    if [ -z \"\$container_id\" ]; then container_id=\"unknown\"; fi; \
    os_info=\$(if [ -f /etc/os-release ]; then . /etc/os-release && echo \"\$ID,\$VERSION_ID,\$NAME\"; else echo \"unknown,unknown,unknown\"; fi | tr -d \"\r\"); \
    echo \"\${container_id}\"; \
    echo \"\${os_info}\"; \
    echo \"###PACKAGES###\"; \
    SHELL_CMD=\$(command -v sh || command -v bash || command -v ash); \
    if [ -z \"\${SHELL_CMD}\" ]; then echo \"サポートされるシェルがありません\"; exit 1; fi; \
    if command -v dpkg-query >/dev/null; then \
      dpkg-query --show --showformat='\''\${Package}_\${Version}\n'\''; \
    elif command -v rpm >/dev/null; then \
      if [ -f /etc/os-release ]; then \
        . /etc/os-release; \
        major_version=\$(echo \"\$VERSION_ID\" | cut -d. -f1); \
        if [ \"\$ID\" = \"amzn\" ]; then \
          rpm -qa --qf \"%{name}-%{version}-%{release}.%{arch}\n\"; \
        elif [ \"\$major_version\" -ge 8 ]; then \
          rpm -qa --qf \"%{name}-%{version}-%{release}.%{arch} %{modularitylabel}\n\"; \
        else \
          rpm -qa --qf \"%{name}-%{version}-%{release}.%{arch}\n\"; \
        fi; \
      else \
        rpm -qa --qf \"%{name}-%{version}-%{release}.%{arch}\n\"; \
      fi; \
    else \
      echo \"サポートされていないパッケージマネージャーです\"; \
    fi'"
    
            echo "タスク $TASK_ARN, コンテナ $CONTAINER_NAME 内でコマンドを実行中..."
            
            # ECS Execを使用してコンテナ内でコマンドを実行し、その出力をキャプチャする
            set +e
            OUTPUT=$(aws ecs execute-command \
              --cluster "$CLUSTER" \
              --task "$TASK_ARN" \
              --container "$CONTAINER_NAME" \
              --command "$COMMAND" \
              --interactive \
              --output text)
            EC=$?
            set -e
            
            if [ "$EC" -ne 0 ]; then
              echo "タスク $TASK_ARN のコンテナ [$CONTAINER_NAME] でコマンド実行に失敗しました。スキップします。"
              continue
            fi
    
            # Session Manager関連の不要なメッセージを除去する
            CLEANED_OUTPUT=$(echo "$OUTPUT" \
              | grep -v "The Session Manager plugin was installed successfully" \
              | grep -v "Starting session with SessionId:" \
              | sed '/^\s*$/d')
            
            # 出力をパースする
            EXTRACTED_CONTAINER_ID=$(echo "$CLEANED_OUTPUT" | sed -n '1p' | tr -d '\r')
            OS_INFO=$(echo "$CLEANED_OUTPUT" | sed -n '2p' | tr -d '\r')
            PACKAGE_OUTPUT=$(echo "$CLEANED_OUTPUT" | sed -n '4,$p' | tr -d '\r')
            
            # もし抽出されたコンテナIDが "unknown" であれば、代わりにタスクIDとコンテナ名を識別子として利用する
            if [ "$EXTRACTED_CONTAINER_ID" = "unknown" ]; then
                IDENTIFIER="${TASK_ID_SHORT}_${CONTAINER_NAME}"
            else
                IDENTIFIER="$EXTRACTED_CONTAINER_ID"
            fi
            
            # OS情報(CSV)をカンマ区切りで分割する(例: almalinux,9.5,AlmaLinux)
            OS_ID=$(echo "$OS_INFO" | cut -d',' -f1)
            OS_VERSION=$(echo "$OS_INFO" | cut -d',' -f2)
            OS_NAME=$(echo "$OS_INFO" | cut -d',' -f3)
            if [ "$OS_ID" = "rocky" ] || [ "$OS_ID" = "oracle" ]; then
                OS_ID="rhel"
            fi
            
            # パッケージ情報の各行をJSON配列の要素としてエスケープし、保存する
            ESCAPED_PACKAGES=""
            while IFS= read -r line; do
                escaped_line=$(echo "$line" | sed 's/"/\\"/g')
                ESCAPED_PACKAGES="${ESCAPED_PACKAGES}\"${escaped_line}\","
            done <<< "$PACKAGE_OUTPUT"
            ESCAPED_PACKAGES="[${ESCAPED_PACKAGES%,}]"
            
            # 最終的なJSONオブジェクトを作成する("hostname"キーには識別用文字列を格納する)
            CONTAINER_JSON="{\"hostname\":\"${IDENTIFIER}\",\"os\":{\"id\":\"${OS_ID}\",\"version\":\"${OS_VERSION}\",\"os\":\"${OS_NAME}\"},\"packages\":${ESCAPED_PACKAGES}}"
            
            # JSONファイルとして保存する(ファイル名はタスクIDとコンテナ名の組み合わせ)
            OUTPUT_FILE="${OUTPUT_DIR}/${TASK_ID_SHORT}_${CONTAINER_NAME}.json"
            echo "$CONTAINER_JSON" > "$OUTPUT_FILE"
            echo "タスク $TASK_ARN のコンテナ [$CONTAINER_NAME] のJSONデータを ${OUTPUT_FILE} に保存しました。"
        done
    done

    ・スクリプトは、指定された Fargate クラスター内の実行中タスクに含まれるすべてのコンテナに対して ECS Exec を用いてコマンドを実行し、
       各コンテナの ID、OS 情報、インストールされているパッケージリストを抽出します。
    CLUSTER 変数には、処理対象とする Fargate クラスター名を設定してください。
    execute-command の実行に失敗したコンテナについては、エラーメッセージが表示され、そのコンテナの処理をスキップして、次のコンテナに進みます。
    ・抽出された情報は、~/sidfmvm_container_jsons ディレクトリ内に、
       タスク ID とコンテナ名を組み合わせたファイル名の JSON 形式で保存されます。(例:123456789abcdefghi123456789abcde_my-container.json)
    hostname フィールドには、コンテナ IDが取得できた場合はコンテナ ID を、
       取得に失敗した場合はタスク ID とコンテナ名を組み合わせた値が割り当てられます。
    ecs-service-connect- で始まるコンテナは ECS エージェントに該当するため、情報収集の対象から除外されます。

    実行方法
    1. クリプトを保存するディレクトリを作成します。
      mkdir -p ~/sidfmvm_scripts
    2. 上記のスクリプトを vm_fargate_container_collect.sh という名前で保存します。
      nano ~/sidfmvm_scripts/vm_fargate_container_collect.sh
      または、vimechocat > ファイル名 など任意の方法でも構いません。
    3. 保存したスクリプトに実行権限を付与します。
      chmod +x ~/sidfmvm_scripts/vm_fargate_container_collect.sh
    4. 以下のコマンドでスクリプトを実行します。
      bash ~/sidfmvm_scripts/vm_fargate_container_collect.sh

  2. VM APIを使用したホスト登録スクリプトの実行

    ステップ1と同じ環境で、以下のスクリプトを実行します。
    実行方法については、後述の「実行方法」をご参照ください。

    クリックしてスクリプト全文を表示
    #!/bin/bash
    # =====================================
    # ユーザー設定:下記の値を環境に合わせて変更してください
    # =====================================
    API_ENDPOINT="http://ホスト名/redmine/sidfm/api/upload_offline_data"
    API_KEY="APIキー"
    SYSTEM_CATEGORY_ID="システムカテゴリID"
    CUSTOM_CATEGORY_ID="カスタムカテゴリID"
    OUTPUT_DIR="$HOME/sidfmvm_container_jsons"   # JSONファイルが保存されているディレクトリ
    
    # =====================================
    # OUTPUT_DIR内のすべてのJSONファイルに対してAPIへ送信する
    # =====================================
    for file in "$OUTPUT_DIR"/*.json; do
        echo "ファイルを処理中: $file"
    
        # ファイル内容を読み込む
        file_data=$(cat "$file")
    
        # curlコマンドでPOSTリクエストを実行 (JSONデータはURLエンコードされる)
        response=$(curl -s -X POST "$API_ENDPOINT" \
            --data "q[api_key]=$API_KEY" \
            --data "q[system_category_id]=$SYSTEM_CATEGORY_ID" \
            --data "q[custom_category_id]=$CUSTOM_CATEGORY_ID" \
            --data-urlencode "q[file_data]=$file_data")
    
        echo "ファイル [$file] の送信結果:"
        echo "$response"
        echo "----------------------------------"
    done

    ・スクリプトは、指定されたディレクトリ内のすべての JSON ファイルを読み込み、VM API に送信し、応答結果を出力します。
    API_ENDPOINTAPI_KEYSYSTEM_CATEGORY_IDCUSTOM_CATEGORY_ID の変数は、実際の VM API 情報に合わせて設定してください。
    OUTPUT_DIR は、ステップ 1 で生成された JSON ファイルが保存されているディレクトリのパスを指定してください。必要に応じて変更可能です。

    実行方法
    1. スクリプトを保存するディレクトリを作成します。
      ※ すでに作成済みの場合は、この手順はスキップして構いません。
      mkdir -p ~/sidfmvm_scripts
    2. 上記のスクリプトを vm_fargate_container_send.sh という名前で保存します。
      nano ~/sidfmvm_scripts/vm_fargate_container_send.sh
      または、vimechocat > ファイル名 など任意の方法でも構いません。
    3. 保存したスクリプトに実行権限を付与します。
      chmod +x ~/sidfmvm_scripts/vm_fargate_container_send.sh
    4. 以下のコマンドでスクリプトを実行します。
      bash ~/sidfmvm_scripts/vm_fargate_container_send.sh

3.2 状況 2: AWS CLI を実行する環境(ローカルなど)から、VMサーバへ直接アクセス不可

    ここでは、AWS CLI を実行可能な環境で Fargate クラスターからパッケージ情報を収集します。
    その後、JSON ファイルを VM サーバにアクセス可能な別のサーバへ転送し、VM API に送信します。


  1. コンテナパッケージ情報収集スクリプトの実行

    AWS CLI を実行可能な環境で、以下のスクリプトを実行します。
    実行方法については、後述の「実行方法」をご参照ください。

    クリックしてスクリプト全文を表示
    #!/bin/bash
    set -e
    
    # 結果保存先ディレクトリ
    OUTPUT_DIR="$HOME/sidfmvm_container_jsons"
    mkdir -p "$OUTPUT_DIR"
    
    # 対象のクラスター
    CLUSTER="YourClusterName"
    
    # クラスター内の全実行中タスクのARN一覧を取得する
    TASK_ARNS=$(aws ecs list-tasks --cluster "$CLUSTER" --desired-status RUNNING --query 'taskArns[*]' --output text)
    echo "対象タスク: $TASK_ARNS"
    
    # 全タスクの詳細を一括で取得する
    TASKS_JSON=$(aws ecs describe-tasks --cluster "$CLUSTER" --tasks $TASK_ARNS --output json)
    
    # jq を使用して各タスクを処理する
    TASK_COUNT=$(echo "$TASKS_JSON" | jq '.tasks | length')
    echo "タスク数: $TASK_COUNT"
    
    for (( i=0; i<$TASK_COUNT; i++ )); do
        TASK_ARN=$(echo "$TASKS_JSON" | jq -r ".tasks[$i].taskArn")
        echo "処理中タスク: $TASK_ARN"
        # タスクID(ARNの最後の部分)を抽出する
        TASK_ID_SHORT=$(echo "$TASK_ARN" | awk -F'/' '{print $NF}')
        
        # タスク内のコンテナ数を取得する
        CONTAINER_COUNT=$(echo "$TASKS_JSON" | jq ".tasks[$i].containers | length")
        for (( j=0; j<$CONTAINER_COUNT; j++ )); do
            CONTAINER_NAME=$(echo "$TASKS_JSON" | jq -r ".tasks[$i].containers[$j].name")
            
            # "ecs-service-connect-"で始まるコンテナはスキップする
            if [[ "$CONTAINER_NAME" == ecs-service-connect-* ]]; then
                echo "タスク $TASK_ARN のコンテナ [$CONTAINER_NAME] はスキップします。"
                continue
            fi
            
            echo "タスク $TASK_ARN のコンテナ: $CONTAINER_NAME"
            
            # コンテナ内で実行するシェルコマンドを定義する
            COMMAND="sh -c ' \
    container_id=\$(cat /proc/self/cgroup | grep -oE \"[0-9a-f]{64}\" | head -n 1 | tr -d \"\r\"); \
    if [ -z \"\$container_id\" ]; then container_id=\"unknown\"; fi; \
    os_info=\$(if [ -f /etc/os-release ]; then . /etc/os-release && echo \"\$ID,\$VERSION_ID,\$NAME\"; else echo \"unknown,unknown,unknown\"; fi | tr -d \"\r\"); \
    echo \"\${container_id}\"; \
    echo \"\${os_info}\"; \
    echo \"###PACKAGES###\"; \
    SHELL_CMD=\$(command -v sh || command -v bash || command -v ash); \
    if [ -z \"\${SHELL_CMD}\" ]; then echo \"サポートされるシェルがありません\"; exit 1; fi; \
    if command -v dpkg-query >/dev/null; then \
      dpkg-query --show --showformat='\''\${Package}_\${Version}\n'\''; \
    elif command -v rpm >/dev/null; then \
      if [ -f /etc/os-release ]; then \
        . /etc/os-release; \
        major_version=\$(echo \"\$VERSION_ID\" | cut -d. -f1); \
        if [ \"\$ID\" = \"amzn\" ]; then \
          rpm -qa --qf \"%{name}-%{version}-%{release}.%{arch}\n\"; \
        elif [ \"\$major_version\" -ge 8 ]; then \
          rpm -qa --qf \"%{name}-%{version}-%{release}.%{arch} %{modularitylabel}\n\"; \
        else \
          rpm -qa --qf \"%{name}-%{version}-%{release}.%{arch}\n\"; \
        fi; \
      else \
        rpm -qa --qf \"%{name}-%{version}-%{release}.%{arch}\n\"; \
      fi; \
    else \
      echo \"サポートされていないパッケージマネージャーです\"; \
    fi'"
    
            echo "タスク $TASK_ARN, コンテナ $CONTAINER_NAME 内でコマンドを実行中..."
            
            # ECS Execを使用してコンテナ内でコマンドを実行し、その出力をキャプチャする
            set +e
            OUTPUT=$(aws ecs execute-command \
              --cluster "$CLUSTER" \
              --task "$TASK_ARN" \
              --container "$CONTAINER_NAME" \
              --command "$COMMAND" \
              --interactive \
              --output text)
            EC=$?
            set -e
            
            if [ "$EC" -ne 0 ]; then
              echo "タスク $TASK_ARN のコンテナ [$CONTAINER_NAME] でコマンド実行に失敗しました。スキップします。"
              continue
            fi
    
            # Session Manager関連の不要なメッセージを除去する
            CLEANED_OUTPUT=$(echo "$OUTPUT" \
              | grep -v "The Session Manager plugin was installed successfully" \
              | grep -v "Starting session with SessionId:" \
              | sed '/^\s*$/d')
            
            # 出力をパースする
            EXTRACTED_CONTAINER_ID=$(echo "$CLEANED_OUTPUT" | sed -n '1p' | tr -d '\r')
            OS_INFO=$(echo "$CLEANED_OUTPUT" | sed -n '2p' | tr -d '\r')
            PACKAGE_OUTPUT=$(echo "$CLEANED_OUTPUT" | sed -n '4,$p' | tr -d '\r')
            
            # もし抽出されたコンテナIDが "unknown" であれば、代わりにタスクIDとコンテナ名を識別子として利用する
            if [ "$EXTRACTED_CONTAINER_ID" = "unknown" ]; then
                IDENTIFIER="${TASK_ID_SHORT}_${CONTAINER_NAME}"
            else
                IDENTIFIER="$EXTRACTED_CONTAINER_ID"
            fi
            
            # OS情報(CSV)をカンマ区切りで分割する(例: almalinux,9.5,AlmaLinux)
            OS_ID=$(echo "$OS_INFO" | cut -d',' -f1)
            OS_VERSION=$(echo "$OS_INFO" | cut -d',' -f2)
            OS_NAME=$(echo "$OS_INFO" | cut -d',' -f3)
            if [ "$OS_ID" = "rocky" ] || [ "$OS_ID" = "oracle" ]; then
                OS_ID="rhel"
            fi
            
            # パッケージ情報の各行をJSON配列の要素としてエスケープし、保存する
            ESCAPED_PACKAGES=""
            while IFS= read -r line; do
                escaped_line=$(echo "$line" | sed 's/"/\\"/g')
                ESCAPED_PACKAGES="${ESCAPED_PACKAGES}\"${escaped_line}\","
            done <<< "$PACKAGE_OUTPUT"
            ESCAPED_PACKAGES="[${ESCAPED_PACKAGES%,}]"
            
            # 最終的なJSONオブジェクトを作成する("hostname"キーには識別用文字列を格納する)
            CONTAINER_JSON="{\"hostname\":\"${IDENTIFIER}\",\"os\":{\"id\":\"${OS_ID}\",\"version\":\"${OS_VERSION}\",\"os\":\"${OS_NAME}\"},\"packages\":${ESCAPED_PACKAGES}}"
            
            # JSONファイルとして保存する(ファイル名はタスクIDとコンテナ名の組み合わせ)
            OUTPUT_FILE="${OUTPUT_DIR}/${TASK_ID_SHORT}_${CONTAINER_NAME}.json"
            echo "$CONTAINER_JSON" > "$OUTPUT_FILE"
            echo "タスク $TASK_ARN のコンテナ [$CONTAINER_NAME] のJSONデータを ${OUTPUT_FILE} に保存しました。"
        done
    done

    ・スクリプトは、指定された Fargate クラスター内の実行中タスクに含まれるすべてのコンテナに対して ECS Exec を用いてコマンドを実行し、
       各コンテナの ID、OS 情報、インストールされているパッケージリストを抽出します。
    CLUSTER 変数には、処理対象とする Fargate クラスター名を設定してください。
    execute-command の実行に失敗したコンテナについては、エラーメッセージが表示され、そのコンテナの処理をスキップして、次のコンテナに進みます。
    ・抽出された情報は、~/sidfmvm_container_jsons ディレクトリ内に、
       タスク ID とコンテナ名を組み合わせたファイル名の JSON 形式で保存されます。(例:123456789abcdefghi123456789abcde_my-container.json)
    hostname フィールドには、コンテナ IDが取得できた場合はコンテナ ID を、
       取得に失敗した場合はタスク ID とコンテナ名を組み合わせた値が割り当てられます。
    ecs-service-connect- で始まるコンテナは ECS エージェントに該当するため、情報収集の対象から除外されます。

    実行方法
    1. クリプトを保存するディレクトリを作成します。
      mkdir -p ~/sidfmvm_scripts
    2. 上記のスクリプトを vm_fargate_container_collect.sh という名前で保存します。
      nano ~/sidfmvm_scripts/vm_fargate_container_collect.sh
      または、vimechocat > ファイル名 など任意の方法でも構いません。
    3. 保存したスクリプトに実行権限を付与します。
      chmod +x ~/sidfmvm_scripts/vm_fargate_container_collect.sh
    4. 以下のコマンドでスクリプトを実行します。
      bash ~/sidfmvm_scripts/vm_fargate_container_collect.sh


  2. パッケージ情報が保存された JSON ファイルの移動

    ステップ1で収集された ~/sidfmvm_container_jsons ディレクトリ内の JSON ファイルを、VM サーバにアクセス可能なサーバにコピーします。
    ※ ステップ1で、保存するディレクトリ(OUTPUT_DIR)を変更した場合は、こちらも同様に変更内容に合わせてパスを指定してください。
    以下は、ローカル環境で scp を使用してファイルを転送するコマンド例です。

    クリックしてコマンド例を表示
    scp -r ~/sidfmvm_container_jsons \
    <コピー先ユーザ>@<コピー先サーバのホスト名またはIPアドレス>:~/sidfmvm_container_jsons

    ※ このコマンドは、ローカル環境から VM サーバにアクセス可能な別のサーバ へ JSON ファイルを転送する例です。
    <コピー先ユーザ><コピー先サーバのホスト名またはIPアドレス> は、実際の環境に合わせて変更してください。
    ※ コピー先のディレクトリ(~/sidfmvm_container_jsons)は必要に応じて変更可能です。



  3. VMサーバにアクセス可能なサーバで、VM APIを使用したホスト登録スクリプトの実行

    VMサーバにアクセス可能なサーバで、以下のスクリプトを実行します。
    実行方法については、後述の「実行方法」をご参照ください。

    クリックしてスクリプト全文を表示
    #!/bin/bash
    # =====================================
    # ユーザー設定:下記の値を環境に合わせて変更してください
    # =====================================
    API_ENDPOINT="http://ホスト名/redmine/sidfm/api/upload_offline_data"
    API_KEY="APIキー"
    SYSTEM_CATEGORY_ID="システムカテゴリID"
    CUSTOM_CATEGORY_ID="カスタムカテゴリID"
    OUTPUT_DIR="$HOME/sidfmvm_container_jsons"   # JSONファイルが保存されているディレクトリ
    
    # =====================================
    # OUTPUT_DIR内のすべてのJSONファイルに対してAPIへ送信する
    # =====================================
    for file in "$OUTPUT_DIR"/*.json; do
        echo "ファイルを処理中: $file"
    
        # ファイル内容を読み込む
        file_data=$(cat "$file")
    
        # curlコマンドでPOSTリクエストを実行 (JSONデータはURLエンコードされる)
        response=$(curl -s -X POST "$API_ENDPOINT" \
            --data "q[api_key]=$API_KEY" \
            --data "q[system_category_id]=$SYSTEM_CATEGORY_ID" \
            --data "q[custom_category_id]=$CUSTOM_CATEGORY_ID" \
            --data-urlencode "q[file_data]=$file_data")
    
        echo "ファイル [$file] の送信結果:"
        echo "$response"
        echo "----------------------------------"
    done

    ・スクリプトは、指定されたディレクトリ内のすべての JSON ファイルを読み込み、VM API に送信し、応答結果を出力します。
    API_ENDPOINTAPI_KEYSYSTEM_CATEGORY_IDCUSTOM_CATEGORY_ID の変数は、実際の VM API 情報に合わせて設定してください。
    OUTPUT_DIR は、ステップ 1 で生成された JSON ファイルが保存されているディレクトリのパスを指定してください。必要に応じて変更可能です。

    実行方法
    1. スクリプトを保存するディレクトリを作成します。
      mkdir -p ~/sidfmvm_scripts
    2. 上記のスクリプトを vm_fargate_container_send.sh という名前で保存します。
      nano ~/sidfmvm_scripts/vm_fargate_container_send.sh
      または、vimechocat > ファイル名 など任意の方法でも構いません。
    3. 保存したスクリプトに実行権限を付与します。
      chmod +x ~/sidfmvm_scripts/vm_fargate_container_send.sh
    4. 以下のコマンドでスクリプトを実行します。
      bash ~/sidfmvm_scripts/vm_fargate_container_send.sh

4. 結果の確認

VM API呼び出しスクリプトの実行後、以下の2点をご確認ください。

  • スクリプトのレスポンス出力による確認

    各JSONファイルの送信結果は、APIのレスポンスにより確認できます。以下はレスポンスの形式例です。
    {
      "success": true,
      "response": {}
    }
    - "success": true の場合は送信成功を意味します。
    - "success": false の場合は送信失敗を意味し、response フィールドにエラーの詳細が格納されます。


  • SIDfm VM管理画面での確認

    SIDfm VMの管理画面にアクセスし、送信したホスト情報やパッケージ情報が正しく反映されているかご確認ください。
    • 設定メニューの「ホスト設定」をクリックします。


    • コンテナIDがホスト名として登録されたホストが存在するかを確認します。


    • ホスト登録後、約10分程で脆弱性照合が行われ、登録された情報から脆弱性が確認された場合は、登録したホストで脆弱性が検出されます。
      以降はホスト毎に1日1回脆弱性照合が行われます。