03-6417-9339

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

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


本ページでは、LinuxベースのEC2インスタンスにおいて、実行中のコンテナ内のパッケージ情報を収集し、SIDfm VMへ自動的に登録・更新する手順をご案内します。

1. 概要

  • 本手順は、EC2 インスタンス上で動作するコンテナに対し、AWS Systems Manager Run Command または SSH を利用してコマンドを実行します。
  • 本手順では、次の2通りの実行パターンに対応しています。
    • 状況 1:EC2インスタンスからVMサーバへ直接アクセス可能
      → パッケージ情報の収集と登録を同一サーバ上で実行
    • 状況 2:EC2インスタンスからVMサーバへ直接アクセス不可
      → パッケージ情報収集後、別のサーバからVM登録処理を実行

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

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

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

  • 以下のOSは、Red Hat Enterprise Linuxとして登録することで脆弱性を検出できます。
    • RockyLinux 8 / 9
    • Oracle Linux 8 / 9
    検出される脆弱性はRed Hat Enterprise Linuxのものとなりますので、詳しくは対応する対象OSの公式情報をご参照ください。

2. 必要な条件

  • 概要で記載した対応OSを使用しているコンテナが存在するEC2インスタンス
  • 対象のEC2インスタンスにDockerがインストールおよび稼働していること
  • スクリプトを実行するための権限(1と2のいずれか)
    • 1. AWS Systems Manager の Run Command を使用する場合
      Run Command を実行するには、対象の EC2 インスタンスが SSM 管理対象であること、および実行権限(IAM ロールなど)が付与されている必要があります。
    • 2. SSH で EC2 インスタンスに直接接続して実行する場合
      EC2 インスタンスに SSH でログイン可能な場合は、インスタンス内で直接実行することも可能です。
      この場合、操作するユーザが Docker コマンド実行の権限を持っている必要があります。
  • 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: EC2インスタンスからVMサーバへ直接アクセス可能な場合

    ここでは、対象となる EC2 インスタンスで 2 種類のスクリプトを実行し、各コンテナの情報を JSON ファイルとして保存・送信します。
    1つ目のスクリプトは、コンテナの OS 情報やパッケージリストを収集します。
    2つ目のスクリプトは、収集された JSON データを VM API に送信します。


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

    以下のスクリプトを EC2 インスタンス上で実行します。
    実行方法については、後述の「実行方法」をご参照ください。

    クリックしてスクリプト全文を表示
    #!/bin/bash
    
    # 結果の保存場所
    OUTPUT_DIR="/tmp/container_jsons"
    mkdir -p "$OUTPUT_DIR"
    
    # 実際にコマンドを実行しているユーザを表示する
    whoami_output=$(whoami)
    echo "User: $whoami_output"
    
    echo ""
    echo "[docker グループのメンバー一覧]"
    # dockerグループが存在するかチェック
    if getent group docker > /dev/null 2>&1; then
        members=$(getent group docker | cut -d: -f4)
        if [ -z "$members" ]; then
            echo "docker グループのメンバーは存在しません。"
        else
            IFS=',' read -r -a array <<< "$members"
            for member in "${array[@]}"; do
                echo "$member"
            done
        fi
    else
        echo "docker グループが存在しないか、取得できませんでした。"
    fi
    
    for container in $(docker ps --format "{{.ID}} {{.Image}}" | grep -v "ecs-agent" | awk '{print $1}'); do
        echo "=== パッケージ情報取得中 (コンテナID: $container) ==="
        os_info=$(docker exec -t "$container" sh -c 'if [ -f /etc/os-release ]; then . /etc/os-release && echo "$ID,$VERSION_ID,$NAME"; else echo "unknown,unknown,unknown"; fi' | tr -d '\r')
        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
    
        package_info=$(docker exec -t "$container" sh -c '
            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}.rpm\n'\''
                    elif [ "$major_version" -ge 8 ]; then
                        rpm -qa --qf '\''%{name}-%{version}-%{release}.%{arch}.rpm %{modularitylabel}\n'\''
                    else
                        rpm -qa --qf '\''%{name}-%{version}-%{release}.%{arch}.rpm\n'\''
                    fi
                else
                    rpm -qa --qf '\''%{name}-%{version}-%{release}.%{arch}.rpm\n'\''
                fi
            else 
                echo "サポートされていないパッケージマネージャーです"
            fi' | tr -d '\r')
    
        escaped_package_info=""
        while IFS= read -r line; do
            escaped_line=$(echo "$line" | sed 's/"/\\"/g')
            escaped_package_info="${escaped_package_info}\"$escaped_line\"," 
        done <<< "$package_info"
        escaped_package_info="[${escaped_package_info%,}]"
    
        container_json="{\"hostname\":\"${container}\",\"os\":{\"id\":\"${os_id}\",\"version\":\"${os_version}\",\"os\":\"${os_name}\"},\"packages\":${escaped_package_info}}"
    
        output_file="${OUTPUT_DIR}/${container}.json"
        echo "$container_json" > "$output_file"
        echo "コンテナ ${container} のJSONデータを ${output_file} に保存しました。"
    done

    ・スクリプトは、各コンテナのID、OS情報、インストールされているパッケージリストをJSON形式で /tmp/container_jsons ディレクトリに保存します。
    ・保存するディレクトリ(OUTPUT_DIR)は必要に応じて変更可能です。
    hostname フィールドには、コンテナIDが自動的に割り当てられます。

    実行方法
      1. Run Command の実行画面で、「AWS-RunShellScript」 ドキュメントを選択し、対象のEC2インスタンスを指定した上で
        上記のスクリプトを 直接貼り付けて 実行してください。
        ※ この方法は Linux または macOS の環境を前提としています。

      1. スクリプトを保存するディレクトリを作成します。
        mkdir -p ~/sidfmvm_scripts
      2. 上記のスクリプトを ~/sidfmvm_scripts/vm_ec2_container_collect.sh として保存します。
      3. スクリプトを base64 形式に変換します。
        Linux の場合:
        base64 -w 0 ~/sidfmvm_scripts/vm_ec2_container_collect.sh > vm_ec2_container_collect.b64
        macOS の場合:
        base64 -i ~/sidfmvm_scripts/vm_ec2_container_collect.sh -o vm_ec2_container_collect.b64
      4. 変換したスクリプトを、変数に格納します。
        ENCODED_CONTAINER_COLLECT=$(cat vm_ec2_container_collect.b64)
      5. 以下 AWS CLI コマンドを実行して、EC2 上でスクリプトを実行します。
        aws ssm send-command \
        --document-name "AWS-RunShellScript" \
        --targets '[{"Key":"InstanceIds","Values":["i-xxxxxxxxxxxxxxxxx"]}]' \
        --parameters "commands=[
          \"echo $ENCODED_CONTAINER_COLLECT | base64 -d > /tmp/vm_ec2_container_collect.sh\",
          \"chmod +x /tmp/vm_ec2_container_collect.sh\",
          \"bash /tmp/vm_ec2_container_collect.sh\"
        ]"

        i-xxxxxxxxxxxxxxxxx の部分には、対象の EC2 インスタンス ID を入力してください。
        ※ 詳しくは 公式チュートリアル をご参照ください。

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

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

    以下のスクリプトを EC2 インスタンス上で実行します。
    実行方法については、後述の「実行方法」をご参照ください。

    クリックしてスクリプト全文を表示
    #!/bin/bash
    
    API_ENDPOINT="http://ホスト名/redmine/sidfm/api/upload_offline_data"
    API_KEY="APIキー"
    SYSTEM_CATEGORY_ID="システムカテゴリID"
    CUSTOM_CATEGORY_ID="カスタムカテゴリID"
    OUTPUT_DIR="/tmp/container_jsons"
    
    for file in "$OUTPUT_DIR"/*.json; do
        echo "ファイルを処理中: $file"
        file_data=$(cat "$file")
        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

    ・スクリプトは、/tmp/container_jsonsディレクトリ内のすべてのJSONファイルを読み込み、VM APIに送信し、APIの応答結果を出力します。
    API_ENDPOINTAPI_KEYSYSTEM_CATEGORY_IDCUSTOM_CATEGORY_IDの変数を、実際のVM API情報に合わせて変更する必要があります。

    実行方法
      1. Run Command の実行画面で、「AWS-RunShellScript」 ドキュメントを選択し、対象のEC2インスタンスを指定した上で
        上記のスクリプトを 直接貼り付けて 実行してください。
        ※ この方法は Linux または macOS の環境を前提としています。

      1. スクリプトを保存するディレクトリを作成します。
        ※ すでに作成済みの場合は、この手順はスキップして構いません。
        mkdir -p ~/sidfmvm_scripts
      2. 上記のスクリプトを ~/sidfmvm_scripts/vm_ec2_container_send.sh として保存します。
      3. スクリプトを base64 形式に変換します。
        Linux の場合:
        base64 -w 0 ~/sidfmvm_scripts/vm_ec2_container_send.sh > vm_ec2_container_send.b64
        macOS の場合:
        base64 -i ~/sidfmvm_scripts/vm_ec2_container_send.sh -o vm_ec2_container_send.b64
      4. 変換したスクリプトを、変数に格納します。
        ENCODED_CONTAINER_SEND=$(cat vm_ec2_container_send.b64)
      5. 以下 AWS CLI コマンドを実行して、EC2 上でスクリプトを実行します。
        aws ssm send-command \
        --document-name "AWS-RunShellScript" \
        --targets '[{"Key":"InstanceIds","Values":["i-xxxxxxxxxxxxxxxxx"]}]' \
        --parameters "commands=[
          \"echo $ENCODED_CONTAINER_SEND | base64 -d > /tmp/vm_ec2_container_send.sh\",
          \"chmod +x /tmp/vm_ec2_container_send.sh\",
          \"bash /tmp/vm_ec2_container_send.sh\"
        ]"

        i-xxxxxxxxxxxxxxxxx の部分には、対象の EC2 インスタンス ID を入力してください。
        ※ 詳しくは 公式チュートリアル をご参照ください。

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


3.2 状況 2: EC2からVMへ直接アクセスできない場合

    ここでは、対象となる EC2 インスタンスでコンテナ情報を収集し、JSON ファイルとして保存します。
    その後、JSON ファイルを VM サーバにアクセス可能な別のサーバへ転送し、VM API に送信します。


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

    以下のスクリプトを EC2 インスタンス上で実行します。
    実行方法については、後述の「実行方法」をご参照ください。

    クリックしてスクリプト全文を表示
    #!/bin/bash
    
    # 結果の保存場所
    OUTPUT_DIR="/tmp/container_jsons"
    mkdir -p "$OUTPUT_DIR"
    
    # 実際にコマンドを実行しているユーザを表示する
    whoami_output=$(whoami)
    echo "User: $whoami_output"
    
    echo ""
    echo "[docker グループのメンバー一覧]"
    # dockerグループが存在するかチェック
    if getent group docker > /dev/null 2>&1; then
        members=$(getent group docker | cut -d: -f4)
        if [ -z "$members" ]; then
            echo "docker グループのメンバーは存在しません。"
        else
            IFS=',' read -r -a array <<< "$members"
            for member in "${array[@]}"; do
                echo "$member"
            done
        fi
    else
        echo "docker グループが存在しないか、取得できませんでした。"
    fi
    
    for container in $(docker ps --format "{{.ID}} {{.Image}}" | grep -v "ecs-agent" | awk '{print $1}'); do
        echo "=== パッケージ情報取得中 (コンテナID: $container) ==="
        os_info=$(docker exec -t "$container" sh -c 'if [ -f /etc/os-release ]; then . /etc/os-release && echo "$ID,$VERSION_ID,$NAME"; else echo "unknown,unknown,unknown"; fi' | tr -d '\r')
        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
    
        package_info=$(docker exec -t "$container" sh -c '
            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}.rpm\n'\''
                    elif [ "$major_version" -ge 8 ]; then
                        rpm -qa --qf '\''%{name}-%{version}-%{release}.%{arch}.rpm %{modularitylabel}\n'\''
                    else
                        rpm -qa --qf '\''%{name}-%{version}-%{release}.%{arch}.rpm\n'\''
                    fi
                else
                    rpm -qa --qf '\''%{name}-%{version}-%{release}.%{arch}.rpm\n'\''
                fi
            else 
                echo "サポートされていないパッケージマネージャーです"
            fi' | tr -d '\r')
    
        escaped_package_info=""
        while IFS= read -r line; do
            escaped_line=$(echo "$line" | sed 's/"/\\"/g')
            escaped_package_info="${escaped_package_info}\"$escaped_line\"," 
        done <<< "$package_info"
        escaped_package_info="[${escaped_package_info%,}]"
    
        container_json="{\"hostname\":\"${container}\",\"os\":{\"id\":\"${os_id}\",\"version\":\"${os_version}\",\"os\":\"${os_name}\"},\"packages\":${escaped_package_info}}"
    
        output_file="${OUTPUT_DIR}/${container}.json"
        echo "$container_json" > "$output_file"
        echo "コンテナ ${container} のJSONデータを ${output_file} に保存しました。"
    done

    ・スクリプトは、各コンテナのID、OS情報、インストールされているパッケージリストをJSON形式で /tmp/container_jsons ディレクトリに保存します。
    ・保存するディレクトリ(OUTPUT_DIR)は必要に応じて変更可能です。
    hostname フィールドには、コンテナIDが自動的に割り当てられます。

    実行方法
      1. Run Command の実行画面で、「AWS-RunShellScript」 ドキュメントを選択し、対象のEC2インスタンスを指定した上で
        上記のスクリプトを 直接貼り付けて 実行してください。
        ※ この方法は Linux または macOS の環境を前提としています。

      1. スクリプトを保存するディレクトリを作成します。
        mkdir -p ~/sidfmvm_scripts
      2. 上記のスクリプトを ~/sidfmvm_scripts/vm_ec2_container_collect.sh として保存します。
      3. スクリプトを base64 形式に変換します。
        Linux の場合:
        base64 -w 0 ~/sidfmvm_scripts/vm_ec2_container_collect.sh > vm_ec2_container_collect.b64
        macOS の場合:
        base64 -i ~/sidfmvm_scripts/vm_ec2_container_collect.sh -o vm_ec2_container_collect.b64
      4. 変換したスクリプトを、変数に格納します。
        ENCODED_CONTAINER_COLLECT=$(cat vm_ec2_container_collect.b64)
      5. 以下 AWS CLI コマンドを実行して、EC2 上でスクリプトを実行します。
        aws ssm send-command \
        --document-name "AWS-RunShellScript" \
        --targets '[{"Key":"InstanceIds","Values":["i-xxxxxxxxxxxxxxxxx"]}]' \
        --parameters "commands=[
          \"echo $ENCODED_CONTAINER_COLLECT | base64 -d > /tmp/vm_ec2_container_collect.sh\",
          \"chmod +x /tmp/vm_ec2_container_collect.sh\",
          \"bash /tmp/vm_ec2_container_collect.sh\"
        ]"

        i-xxxxxxxxxxxxxxxxx の部分には、対象の EC2 インスタンス ID を入力してください。
        ※ 詳しくは 公式チュートリアル をご参照ください。

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

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

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

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

    <EC2のホスト名またはIPアドレス><コピー先ユーザ><コピー先サーバのホスト名または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"
    
    for file in "$OUTPUT_DIR"/*.json; do
        echo "ファイルを処理中: $file"
        file_data=$(cat "$file")
        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

    ・スクリプトは、OUTPUT_DIRディレクトリ内のすべてのJSONファイルを読み込み、VM APIに送信し、APIの応答結果を出力します。
    API_ENDPOINTAPI_KEYSYSTEM_CATEGORY_IDCUSTOM_CATEGORY_IDの変数を、実際のVM API情報に合わせて変更する必要があります。
    OUTPUT_DIRには、JSONファイルが存在する正確なパスを指定する必要があります。

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

      1. Run Command の実行画面で、「AWS-RunShellScript」 ドキュメントを選択し、対象のEC2インスタンスを指定した上で
        上記のスクリプトを 直接貼り付けて 実行してください。
        ※ この方法は、コピー先のサーバが EC2 インスタンスであることを前提としています。
        ※ なお、Linux または macOS の環境を前提としています。

      1. スクリプトを保存するディレクトリを作成します。
        ※ すでに作成済みの場合は、この手順はスキップして構いません。
        mkdir -p ~/sidfmvm_scripts
      2. 上記のスクリプトを ~/sidfmvm_scripts/vm_ec2_container_send.sh として保存します。
      3. スクリプトを base64 形式に変換します。
        Linux の場合:
        base64 -w 0 ~/sidfmvm_scripts/vm_ec2_container_send.sh > vm_ec2_container_send.b64
        macOS の場合:
        base64 -i ~/sidfmvm_scripts/vm_ec2_container_send.sh -o vm_ec2_container_send.b64
      4. 変換したスクリプトを、変数に格納します。
        ENCODED_CONTAINER_SEND=$(cat vm_ec2_container_send.b64)
      5. 以下 AWS CLI コマンドを実行して、EC2 上でスクリプトを実行します。
        aws ssm send-command \
        --document-name "AWS-RunShellScript" \
        --targets '[{"Key":"InstanceIds","Values":["i-xxxxxxxxxxxxxxxxx"]}]' \
        --parameters "commands=[
          \"echo $ENCODED_CONTAINER_SEND | base64 -d > /tmp/vm_ec2_container_send.sh\",
          \"chmod +x /tmp/vm_ec2_container_send.sh\",
          \"bash /tmp/vm_ec2_container_send.sh\"
        ]"

        i-xxxxxxxxxxxxxxxxx の部分には、対象の EC2 インスタンス ID を入力してください。
        ※ 詳しくは 公式チュートリアル をご参照ください。



4. 結果の確認

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

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

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


  • SIDfm VM管理画面での確認

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


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


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