Amazon Elastic Container Service (ECS)にsquidでプロキシサーバーを構築した
Amazon Elastic Container Service (ECS)
で、 squid
でプロキシサーバー構築した際に、いろいろと考慮する点があったので、備忘録も兼ねてまとめてみる。
Docker
のイメージは alpine
Docker
のイメージとしては alpine
を使った。
やはりサイズが小さいのが良い。
イメージが小さいと、 docker push
や docker pull
が早いし、デプロイも早くなるから。
今回構築したプロキシサーバーのイメージも、6MBほどの小さいものとなった。
FROM alpine
squid
ユーザーをコンテナ内で使用
Dockerfile
内で、 USER
として squid
ユーザーを設定。
コンテナ内での、実行ユーザーを squid
とした。
USER squid
squid
ユーザーに sudo
権限を付与
squid
ユーザーに、ログ出力先のディレクトリと、キャッシュの出力先のディレクトリに対して、 chown
出来るように sudo
設定を追加。
squid ALL=(ALL) NOPASSWD: /bin/chown -R squid:squid /var/log/squid, /bin/chown -R squid:squid /var/cache/squid
Defaults:squid !requiretty
Dockerfile
内で上記のように /etc/sudoers.d/squid
を作成する。
RUN apk --update add squid sudo &&
rm -rf /var/cache/apk/*
RUN echo "squid ALL=(ALL) NOPASSWD: /bin/chown -R squid:squid /var/log/squid, /bin/chown -R squid:squid /var/cache/squid" >> /etc/sudoers.d/squid &&
echo "Defaults:squid !requiretty" >> /etc/sudoers.d/squid &&
chmod 440 /etc/sudoers.d/squid
ログのフォーマットを修正
デフォルトの設定だと、下記のようにログが出力されて、時間やユーザーエージェント等がわからない。
(下記は、 curl
で試してみたもの)
1518829122.573 118 172.20.0.1 TCP_TUNNEL/200 38074 CONNECT mmmcorp.co.jp:443 - HIER_DIRECT/52.196.192.109 -
/etc/squid/squid.conf
を下記のように設定して、ログのフォーマットを変更することで、
logformat combined [%tl] %>a %[ui %[un "%rm %ru HTTP/%rv" %>Hs %<st "%{Referer}>h" "%{User-Agent}>h" %Ss:%Sh
出力されるログも下記のようになる。
[17/Feb/2018:09:56:07 +0900] 172.20.0.1 - - "CONNECT mmmcorp.co.jp:443 HTTP/1.1" 200 38073 "-" "curl/7.54.0" TCP_TUNNEL:HIER_DIRECT
ログの出力を標準出力にする
ECS
を使う際には、標準出力されたものが CloudWatch Logs
にログとして残る。
ファイルとして出力してしまうと、ログの内容がコンテナ内に入らないと確認できないので、 squid
のログ出力も標準出力にするように /etc/squid/squid.conf
で設定を変更する。
access_log stdio:/proc/self/fd/1 combined
タイムゾーン設定
alpine
のイメージをそのまま使うと、タイムゾーンが UTC
になっているので、ログ等を確認する際にちょっと分かりづらい。JST
に変更する。
ENV TZ=Asia/Tokyo
RUN apk --update add squid tzdata sudo &&
cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime &&
rm -rf /var/cache/apk/*
環境変数 TZ
を Asia/Tokyo
と設定。apk --update add tzdata
で tzdata
パッケージをインストール。/usr/share/zoneinfo/Asia/Tokyo
を /etc/localtime
にコピーする。
起動スクリプト
squid
の起動スクリプト start-squid.sh
は下記のように設定した。
#!/bin/sh
set -e
CHOWN=$(/usr/bin/which chown)
SQUID=$(/usr/bin/which squid)
# Ensure permissions are set correctly on the Squid cache + log dir.
sudo "$CHOWN" -R squid:squid /var/cache/squid
sudo "$CHOWN" -R squid:squid /var/log/squid
# Prepare the cache using Squid.
echo "Initializing cache..."
"$SQUID" -z
# Give the Squid cache some time to rebuild.
sleep 5
# Launch squid
echo "Starting Squid..."
exec "$SQUID" -NYCd 1
Dockerfile
最終的な Dockerfile
は以下のような感じになった。
FROM alpine
ENV TZ=Asia/Tokyo
RUN apk --update add squid tzdata sudo &&
cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime &&
rm -rf /var/cache/apk/*
RUN echo "squid ALL=(ALL) NOPASSWD: /bin/chown -R squid:squid /var/log/squid, /bin/chown -R squid:squid /var/cache/squid" >> /etc/sudoers.d/squid &&
echo "Defaults:squid !requiretty" >> /etc/sudoers.d/squid &&
chmod 440 /etc/sudoers.d/squid
COPY start-squid.sh /usr/local/bin/
COPY squid.conf /etc/squid/
USER squid
EXPOSE 3128
CMD ["/usr/local/bin/start-squid.sh"]
参考URL
squid : logformat configuration directive
gmauleon/docker-squid: Squid docker image based on Alpine
Alpine Linux でタイムゾーンを変更する - Qiita