AWSのエンドポイントにしか接続できないプロキシサーバーを構成する

インターネットに疎通できないEC2からAWSサービスを利用する場合、VPCエンドポイントが便利です。VPCエンドポイントが提供されていないサービスに接続するために、Amazon Linux 2にSquidをインストールし、そのサービス以外には接続できない設定を行う方法をご紹介します。本記事ではAmazon Athenaにだけ接続できるプロキシサーバーを構成します。

EC2からAWSサービスを使うためには?

AWSサービスを使うためには、AWSのエンドポイントに接続できる必要があります。インターネットに接続できないEC2では、VPCエンドポイントが便利です。プライベートIPを使ってAWSサービスを利用できます。執筆時点では、AthenaのVPCエンドポイントは提供されていません。このような場合、AWS サービスエンドポイントへの接続経路を用意します。東京リージョンのエンドポイントはathena.ap-northeast-1.amazonaws.comです。プロキシサーバーはこちらのエンドポイントのみに接続できるよう構成します。

Squidのインストール

Amazon Linux 2を作成し、Elastic IPアドレスを割り当てておきます。squidをインストールします。検証に利用したバージョンは3.5.20です。

# yum install -y squid
# squid -v
Squid Cache: Version 3.5.20
Service Name: squid
(略)

設定ファイルへの記載

設定ファイル/etc/squid/squid.confを編集します。ローカルネットからの接続を許可するhttp_access allow localnetをコメントにし、ホワイトリストへの接続を許可する# allowed sites以下を追加します。

#http_access allow localnet
http_access allow localhost

# allowed sites
acl whitelist dstdomain "/etc/squid/allowed-sites.squid"
http_access allow whitelist

ホワイトリストの作成

ホワイトリスト/etc/squid/allowed-sites.squidを作成し、athenaのエンドポイントを記載します。

athena.ap-northeast-1.amazonaws.com

squidを再起動(systemctl restart squid)し、設定を反映します。

テスト

Athenaの利用

プライベートサブネットのEC2のAWS CLIからAthenaを利用します。プロキシサーバーの情報を環境変数にセットします。

export HTTP_PROXY=http://proxy-server-privateip:3128
export HTTPS_PROXY=http://proxy-server-privateip:3128

IAMロールを利用する環境では、インスタンスメタデータへの接続はプロキシを使わないよう設定します。こちらを設定しないとIAMロールを認識できません。

export NO_PROXY=169.254.169.254

Athenaのコマンドを実行すると、コマンド結果が表示されます。

$ aws athena list-query-executions
{
    "QueryExecutionIds": [
        "12345678-9012-3456-7891-234567890123",
        "abcdefgh-ijkl-nmop-qrst-uvwxyzabcdef",
    ]
}
$

EC2コマンドの場合、EC2のエンドポイントに接続されます。EC2のエンドポイントはホワイトリストに登録されていないため、エラーになります。

$ aws ec2 describe-instances

Failed to connect to proxy URL: "http://10.0.0.4:3128"
$

Squidの接続ログ

/var/log/squid/access.logにアクセスログが残ります。Athenaへの接続は、TCP_TUNNEL/200です。

1567572911.222     51 10.0.0.119 TCP_TUNNEL/200 5856 CONNECT athena.ap-northeast-1.amazonaws.com:443 - HIER_DIRECT/52.193.39.132 -

EC2エンドポイントへの接続や、www.google.co.jpはSquidで許可されていないため、TCP_DENIED/403になります。

1567573059.814      0 10.0.0.119 TCP_DENIED/403 3979 CONNECT ec2.ap-northeast-1.amazonaws.com:443 - HIER_NONE/- text/html
1567573877.659      0 10.0.0.119 TCP_DENIED/403 4072 GET http://www.google.co.jp/ - HIER_NONE/- text/html

まとめ

インターネットに疎通できないEC2からAthenaを利用するためにプロキシサーバーを構成しました。プロキシサーバーではホワイトリストを利用し、指定したドメイン以外への接続を禁止しました。ご紹介した内容は、VPCエンドポイントが提供されていないほか、OSアップデートなどのために外部リポジトリへの接続が必要なケースや、外部サービスにhttp(s)で接続したいケースでもご利用いただけます。

参考