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
