share facebook facebook2 twitter menu hatena pocket slack

2014.07.10 THU

S3 をプロキシサーバー経由でアクセスする

川原 洋平

WRITTEN BY川原 洋平

cloudpack の 自称 Sensu芸人 の かっぱこと 川原 洋平@inokara)です。

はじめに

Amazon S3 へのアクセスに関して S3 自身で Logging を有効にすることでログを取得することが出来ますが、独自にログを取りたいなあと思ったのでプロキシサーバーを経由させて取得してみることにしました。プロキシサーバーは皆が泣いて喜ぶ Squid を使います。

Squid のインストールと設定

インストール

インストール対象は CentOS 6.5 が稼働している EC2 インスタンスとなります。

yum install squid

簡単ですね。

設定

以下のように接続元の IP を設定します。

acl localnet src zzz.zzz.zzz.zz1/32

上記の localnet は

http_access allow localnet

で http のアクセスが許可されていますので必要な拠点毎に設定を行いましょう。

設定が終わったら squid のプロセスを再起動します。

/etc/init.d/squid restart

S3 の設定

バケットの作成

S3 に適当にバケットを作成します。せっかくなので aws-cli で作成しましょう。

aws s3api create-bucket --bucket hogehuga

aws s3 と aws s3api はうっかりしちゃいそうですが、バケットを作る際には aws s3api ですので注意しましょう。

role による権限の設定

以下のような内容で policy.json ファイルを作成しましょう。xxx.xxx.xxx.xxx にはプロキシサーバーの IP を設定します。

{
    "Version": "2008-10-17",
    "Id": "S3PolicyTechSketch",
    "Statement": [
        {
            "Sid": "IPAllow",
            "Effect": "Allow",
            "Principal": {
                "AWS": "*"
            },
            "Action": "s3:*",
            "Resource": "arn:aws:s3:::hogehuga/*",
            "Condition": {
                "IpAddress": {
                    "aws:SourceIp": "xxx.xxx.xxx.xxx/32"
                }
            }
        }
    ]
}

以下のように実行して policy を登録します。

aws s3api put-bucket-policy --bucket hogehuga --policy file://policy.json

この状態で プロキシ サーバーからバケットへのアクセスが許可されます。


AWS CLI からプロキシサーバーを経由してアクセスする

AWS CLI は Python 版を利用しますので適宜インストールと aws configure を終わらせておきましょう。尚、以下の方法は S3 に限らず、他の AWS サービスへの AWS CLI によるアクセスで有効です。

プロキシサーバーの設定

以下のように明示的にプロキシサーバーの設定を行います。

export HTTP_PROXY=http://xxx.xxx.xxx.xxx:3128
export HTTPS_PROXY=http://xxx.xxx.xxx.xxx:3128

また、Windows の場合には以下のようにコマンドプロンプト上から設定します。

set HTTP_PROXY=http://xxx.xxx.xxx.xxx:3128
set HTTPS_PROXY=http://xxx.xxx.xxx.xxx:3128

簡単ですな。

S3 にプロキシサーバー経由でアクセス

上記でプロキシサーバーの設定が出来ていればあとは簡単です。既に AWS CLI コマンドで S3 には接続出来ているアカウント(今回はアクセスキーとシークレットアクセスキーにて既に接続は確認)でプロキシサーバーを経由してアクセスしたいと思います。

以下のようにコマンドを実行してみます。

export HTTP_PROXY=http://xxx.xxx.xxx.xxx:3128
export HTTPS_PROXY=http://xxx.xxx.xxx.xxx:3128
aws s3 ls s3://hogehuga

既にアップロード済みの画像ファイルがリストアップされます。

01

ま、これだと本当にプロキシサーバーを経由しているか怪しいので Squid のログを tail しながら見てみましょう。

02

二回ほど叩くと…以下のように Squid のアクセスログに記録されました。

03

(1) には接続元の IP アドレスが…(2) には接続先の IP が記録されます。

他のサービスはどうなの?

ということで aws ec2 コマンドあたりを試してみることにします。

aws ec2 describe-instances

インスタンスの一覧を取得するコマンドをプロキシサーバー経由で投げてみたいと思います。

04

紙面の都合上、上記のような感じですいません…、とりあえず実行してみたところ…

05

ログが記録されました。


まとめ

やったこと

  • Squid を使ってプロキシサーバーを構築しました
  • プロキシサーバーを経由して AWS CLI を実行して S3 のバケットに保存されているオブジェクトを確認しました

プロキシサーバーを経由することで…

  • 独自のログが取得出来るようになりました
  • 外部インターネットへの接続がプロキシサーバー経由になっているようなネットワーク構成でも AWS CLI を実行することが出来るのが便利ですよね!

次回は…

  • IAM ロールを使ったアクセス制御を試してみたいと思います!

元記事はこちら