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

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

Docker のイメージは alpine

Docker のイメージとしては alpine を使った。
やはりサイズが小さいのが良い。
イメージが小さいと、 docker pushdocker pull が早いし、デプロイも早くなるから。
今回構築したプロキシサーバーのイメージも、6MBほどの小さいものとなった。

1
FROM alpine

squid ユーザーをコンテナ内で使用

Dockerfile 内で、 USER として squid ユーザーを設定。
コンテナ内での、実行ユーザーを squid とした。

1
USER squid

squid ユーザーに sudo 権限を付与

squid ユーザーに、ログ出力先のディレクトリと、キャッシュの出力先のディレクトリに対して、 chown 出来るように sudo 設定を追加。

1
2
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 を作成する。

1
2
3
4
5
6
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 で試してみたもの)

1
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 を下記のように設定して、ログのフォーマットを変更することで、

1
logformat combined [%tl] %>a %[ui %[un "%rm %ru HTTP/%rv" %>Hs %<st "%{Referer}>h" "%{User-Agent}>h" %Ss:%Sh

出力されるログも下記のようになる。

1
[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 で設定を変更する。

1
access_log stdio:/proc/self/fd/1 combined

タイムゾーン設定

alpine のイメージをそのまま使うと、タイムゾーンが UTC になっているので、ログ等を確認する際にちょっと分かりづらい。
JST に変更する。

1
2
3
4
5
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 は下記のように設定した。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#!/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 は以下のような感じになった。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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

このエントリーをはてなブックマークに追加