「AWS無料相談会」をオンラインで開催中

Amazon Elastic Container Service (ECS)にsquidでプロキシサーバーを構築した

Amazon Elastic Container Service (ECS) で、 squid でプロキシサーバー構築した際に、いろいろと考慮する点があったので、備忘録も兼ねてまとめてみる。

Docker のイメージは alpine

Docker のイメージとしては alpine を使った。
やはりサイズが小さいのが良い。
イメージが小さいと、 docker pushdocker 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/*

環境変数 TZAsia/Tokyo と設定。
apk --update add tzdatatzdata パッケージをインストール。
/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