![EC2上のSysdigエージェントをプロキシ環境で動作させるには](https://images.ctfassets.net/ct0aopd36mqt/5zkB3nFmMJIeFpmkv06LBO/c6ff074d377e0827335f108633d5d549/eyecatch_sysdig_1200x630.png)
EC2上のSysdigエージェントをプロキシ環境で動作させるには
お疲れさまです。とーちです。
EC2上でSysdigエージェントを動作させる際に、プロキシ環境での設定で少し手こずったので、その解決方法を共有したいと思います。
前提環境
今回の環境は以下のような構成となっています。
EC2上にSysdigエージェントをコンテナ形式でインストールしています。インストール方法は公式ドキュメントに従っています。
Sysdigエージェントのインストール手順
EC2に対してコンテナ形式でSysdigエージェントをインストールするのは簡単です。後ほどの説明にも関連するので手順をざっと記載します。
- まずSysdig管理画面にログインし、 Integrations => Sysdig Agents を選択します
- 次にAdd Agentを押します
- インストール先の選択画面が表示されます。今回はEC2上にコンテナとしてエージェントを起動させるので、Dockerを選択します
- するとインストールするためのコマンドが表示されるので基本的にはこちらのコマンドをコピペしてEC2上で実行するだけです。
プロキシ環境での問題と対応
Sysdigエージェントのインストール時に遭遇したこと
最初に引っかかったのが、プロキシ環境下でのSysdigエージェント用コンテナイメージのpullでした。
以前のブログでも紹介しましたが、プロキシ環境下でコンテナイメージをpullするためには、Dockerデーモン側に環境変数の設定が必要になります。こちらについては詳しくは下記ブログをご参照ください。
Sysdigエージェントの通信エラー
コンテナイメージのpullが完了し、コンテナも正常に起動したように見えましたが、docker logs
コマンドでSysdigエージェントのコンテナのログを確認すると、以下のようなエラーが表示されていました。
2025-02-07 05:12:27.973, 10123.10158, Warning, endpoint:cm_collector_endpoint:872: Connection attempt failed. Retrying...
2025-02-07 05:12:29.041, 10123.10369, Error, cm_socket:1444: <今回の環境固有のエラーメッセージ>
エラーメッセージから、プロキシを経由せずに直接通信を試みていることがわかりました。
コンテナ上の環境変数を確認してみると、プロキシ設定は正しく行われているように見えます。
# docker exec <SysdigエージェントのコンテナID> env
<中略>
HTTPS_PROXY=<プロキシURL>
https_proxy=<プロキシURL>
HTTP_PROXY=<プロキシURL>
http_proxy=<プロキシURL>
HOME=/root
<以下略>
そのため、なぜプロキシを経由せずに通信しているのか少し悩みました。
解決策:Sysdig固有の設定
結論から言うとちゃんとSysdigの公式ドキュメントに記載がありました。
Sysdigエージェントでは、コンテナ内の /opt/draios/etc/dragent.yaml
に以下の設定を追加する必要があります。
collector_port: 6443
http_proxy:
proxy_host: $PROXY_HOST
proxy_port: $PROXY_PORT
今回のプロキシサーバでは上記の設定を追加すればOKでしたが、プロキシサーバによっては認証のためのユーザー名、パスワードなどが必要なものもあります。そういった場合の設定についても上記公式ドキュメントに記載があるのでぜひご確認ください。
なお、 dragent.yaml
はDockerfileでbuildすることでコンテナイメージに含めてもいいのですが、その場合はECR等も用意する必要があるので少し手間です。Sysdig公式ドキュメントにも記載のある以下の方法で、EC2上にdragent.yaml
ファイルを予め配置しておき、ボリュームマウントしてしまうのが楽です。
おまけ:自動化用のUserdata
今回はUserdataでSysdigエージェントのインストール、設定を行ったので、その内容もおまけとして載せておきます。
以下が実際に使用したUserdataのスクリプトを一部修正したものです。
#!/bin/bash
set -ex
SYSDIG_COLLECTOR_DOMAIN=""
SYSDIG_SECURE_ENDPOINT_DOMAIN=""
SYSDIG_SECURE_ENDPOINT_URL="https://$SYSDIG_SECURE_ENDPOINT_DOMAIN"
SYSDIG_AGENT_TAG=""
PROXY_HOST=""
PROXY_PORT=""
SYSDIG_CONFIG_DIR=""
# env for proxy setting
echo "env for proxy setting"
export HTTP_PROXY="http://$PROXY_HOST:$PROXY_PORT"
export HTTPS_PROXY="http://$PROXY_HOST:$PROXY_PORT"
# OS環境変数設定(ユーザーセッション)
tee -a /etc/environment << EOF
HTTP_PROXY="http://$PROXY_HOST:$PROXY_PORT"
HTTPS_PROXY="http://$PROXY_HOST:$PROXY_PORT"
EOF
# ロックが解除されるまで待機するfunction
wait_for_apt_locks() {
while fuser /var/lib/dpkg/lock >/dev/null 2>&1 || fuser /var/lib/apt/lists/lock >/dev/null 2>&1 || fuser /var/lib/dpkg/lock-frontend >/dev/null 2>&1; do
echo "Waiting for other software managers to finish..."
sleep 5
done
}
# Add Docker's official GPG key:
sudo apt-get update
wait_for_apt_locks
sudo apt-get install -y ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
# Add the repository to Apt sources:
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
wait_for_apt_locks
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
# docker daemon設定
sudo mkdir -p /etc/systemd/system/docker.service.d
tee /etc/systemd/system/docker.service.d/http-proxy.conf << EOF
[Service]
Environment="HTTP_PROXY=http://$PROXY_HOST:$PROXY_PORT"
Environment="HTTPS_PROXY=http://$PROXY_HOST:$PROXY_PORT"
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
# docker build時のプロキシ設定
sudo mkdir -p ~/.docker
tee -a ~/.docker/config.json << EOF
{
"proxies": {
"default": {
"httpProxy": "http://$PROXY_HOST:$PROXY_PORT",
"httpsProxy": "http://$PROXY_HOST:$PROXY_PORT"
}
}
}
EOF
# Sysdig エージェントのプロキシ設定
sudo mkdir -p $SYSDIG_CONFIG_DIR
tee -a $SYSDIG_CONFIG_DIR/dragent.yaml << EOF
customerid: ${sysdig_agent_accesskey}
tags: $SYSDIG_AGENT_TAG
collector: $SYSDIG_COLLECTOR_DOMAIN
ssl: true
collector_port: 6443
http_proxy:
proxy_host: $PROXY_HOST
proxy_port: $PROXY_PORT
EOF
# sysdigエージェント起動&常駐化
docker run -d --name sysdig-agent --restart always --privileged --net host --pid host \
-v $SYSDIG_CONFIG_DIR/dragent.yaml:/opt/draios/etc/dragent.yaml \
-e ACCESS_KEY=${sysdig_agent_accesskey} \
-e COLLECTOR=$SYSDIG_COLLECTOR_DOMAIN \
-e SECURE=true \
-v /var/run/docker.sock:/host/var/run/docker.sock \
-v /dev:/host/dev \
-v /proc:/host/proc:ro \
-v /boot:/host/boot:ro \
-v /lib/modules:/host/lib/modules:ro \
-v /usr:/host/usr:ro \
-v /etc:/host/etc:ro \
--shm-size=512m \
quay.io/sysdig/agent
まとめ
プロキシ環境でSysdigエージェントを動作させるためには、以下の3点の設定が必要というお話でした。
- Docker Daemon用のプロキシ設定
- Docker Build用のプロキシ設定
- Sysdigエージェント固有のプロキシ設定(dragent.yaml)
以上、とーちでした。