プロキシ環境でも AWS CLI で S3 エンドポイントを使ってみた

プロキシ環境でも AWS CLI で S3 エンドポイントを使ってみた

Clock Icon2024.10.23

こんにちは。テクニカルサポートチームのShiinaです。

はじめに

セキュリティ要件から EC2 インスタンスから直接インターネットへ通信することを禁止している場面はよくあります。
インターネットへ通信が必要な場合、専用のプロキシサーバを経由して通信を行うといった構成も多いのではないでしょうか。
S3 サービスに対する通信はエンドポイントを利用してプライベートで行いたいところですが、
環境変数でプロキシの設定を行うと、AWS CLI で S3 のエンドポイントを利用してくれないことがありました。
プロキシ環境でも AWS CLI で S3 エンドポイントを利用する方法についてご紹介します。

困っていたこと

環境変数 HTTP_PROXY HTTPS_PROXY のプロキシ設定を行うと、AWS CLI の S3 コマンドを利用した際に S3 サービスへの通信の向き先としてはプロキシ設定が優先されてしまい、プロキシサーバ経由となってしまう。

実現したいこと

環境変数 HTTP_PROXY HTTPS_PROXYのプロキシ設定を行っていても AWS CLI から S3 サービスの通信はエンドポイント経由でアクセスしたい。

proxys3endopoint

結論

プロキシ環境下でも AWS CLI から S3 にエンドポイント経由でアクセスする、代表的な方法として3つあります。

  • endpoint-url パラメータで S3 エンドポイントを指定
  • AWS_ENDPOINT_URL_S3 環境変数で S3 エンドポイントを指定
  • ~/.aws/config ファイルで S3 エンドポイントを設定

いずれの方法でも、事前に NO_PROXY に S3 エンドポイントを追加する必要があります。

やってみた

検証環境

  • S3 エンドポイント
    ゲートウェイ型エンドポイントをプライベートサブネットに作成

  • パブリックサブネットのルートテーブル
    下記ルートを追加
     送信先:0.0.0.0/0
     ターゲット:インターネットゲートウェイ ID

  • プライベートサブネットのルートテーブル
    下記ルートを追加
     送信先:プレフィックスリスト ID
     ターゲット:S3 ゲートウェイ型エンドポイント ID

  • AWS CLI 実行用 EC2 インスタンス
    Red Hat Enterprise Linux 9 の AMI を利用し、プライベートサブネットに作成

  • プロキシサーバ用 EC2 インスタンス
    Amazon Linux 2 の AMI を利用し、パブリックサブネットに作成
    プロキシは Squid を使用
    セキュリティーグループは下記インバウンド通信を許可
     ポート:3128
     ソース:プライベートサブネット CIDR

環境変数 HTTP_PROXY HTTPS_PROXY によるプロキシ設定時の動作確認

プロキシサーバ用の EC2 インスタンスに接続します。
Squid プロキシをインストールし、サービスを起動します。

sudo yum install squid -y
sudo systemctl start squid

次に AWS CLI 実行用 EC2 インスタンスに接続します。
環境変数 HTTP_PROXY HTTPS_PROXY の設定を行います。

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

プロキシ設定が行われた状態で AWS CLI の S3 コマンドを実行してみます。

aws s3 ls s3://proxy-use-test-bucket

2024-10-18 05:16:57        818 testdata.gz

結果が返ってきました!
プロキシサーバ用の EC2 インスタンスのプロキシアクセスログを見てます。

sudo cat /var/log/squid/access.log

1729229508.382     50 10.1.131.8 TCP_TUNNEL/200 7059 CONNECT proxy-use-test-bucket.s3.ap-northeast-1.amazonaws.com:443 - HIER_DIRECT/52.219.8.198 -

アクセスログが記録されており、プロキシサーバを経由して S3 サービスにアクセスしていることがわかります。

後述の方法でプロキシサーバ経由ではなく、S3 エンドポイントを利用して通信していることを確認するため、Squid サービスは停止させておきます。

sudo systemctl stop squid

方法①:S3 コマンド実行時に endpoint-url パラメータを利用して S3 エンドポイントを指定

環境変数 NO_PROXY にて S3 エンドポイントに対するプロキシ除外設定を追加します。

export HTTP_PROXY=http://xxx.xxx.xxx.xxx:3128
export HTTPS_PROXY=http://xxx.xxx.xxx.xxx:3128
export NO_PROXY=169.254.169.254,s3-ap-northeast-1.amazonaws.com

AWS CLI の endpoint-url パラメータを指定して S3 コマンドを実行してみます。

aws s3 ls s3://proxy-use-test-bucket --endpoint-url https://s3-ap-northeast-1.amazonaws.com

2024-10-18 05:16:57        818 testdata.gz

結果が返ってきました!
S3 エンドポイントを利用して S3 サービスにアクセスしていることがわかります。

方法②:環境変数 AWS_ENDPOINT_URL_S3 で S3 エンドポイントを指定

環境変数 NO_PROXY にて S3 エンドポイントに対するプロキシ除外設定を追加します。

export HTTP_PROXY=http://xxx.xxx.xxx.xxx:3128
export HTTPS_PROXY=http://xxx.xxx.xxx.xxx:3128
export NO_PROXY=169.254.169.254,s3-ap-northeast-1.amazonaws.com

環境変数 AWS_ENDPOINT_URL_S3 を設定します。

export AWS_ENDPOINT_URL_S3=https://s3-ap-northeast-1.amazonaws.com

AWS CLI の S3 コマンドを実行してみます。

aws s3 ls s3://proxy-use-test-bucket

2024-10-18 05:16:57        818 testdata.gz

結果が返ってきました!
S3 エンドポイントを利用して S3 サービスにアクセスしていることがわかります。

方法③:設定ファイル ~/.aws/config に S3 サービスのセクションタイプで S3 エンドポイントを指定

環境変数 NO_PROXY にて S3 エンドポイントに対するプロキシ除外設定を追加します。

export HTTP_PROXY=http://xxx.xxx.xxx.xxx:3128
export HTTPS_PROXY=http://xxx.xxx.xxx.xxx:3128
export NO_PROXY=169.254.169.254,s3-ap-northeast-1.amazonaws.com

AWS CLI の設定ファイル ~/.aws/config に S3 サービスのセクションタイプを追加し、S3 エンドポイントを指定してみます。

~/.aws/config
[default]
region = ap-northeast-1
output = json
services = s3

[services s3]
s3 = 
  endpoint_url = https://s3-ap-northeast-1.amazonaws.com

AWS CLI の S3 コマンドを実行してみます。

aws s3 ls s3://proxy-use-test-bucket

2024-10-18 05:16:57        818 testdata.gz

結果が返ってきました!
S3 エンドポイントを利用して S3 サービスにアクセスしていることがわかります。

エンドポイント設定の優先順序について

方法①、②、③それぞれ設定したらどうなるのでしょうか?
AWS CLI のエンドポイント設定では優先順序が決まっています。
記載の方法では①>②>③の順で優先されます。

まとめ

プロキシ環境でもプロキシサーバを経由せず、 AWS CLI で S3 エンドポイントを使うことができます。
方法①の場合、コマンドを実行するたびにパラメータを指定する必要があり、手間がかかります。
また、手順書も煩雑になりがちです。
特にエンドポイントを意識せずにコマンドを利用できる、方法②もしくは③が個人的にはおすすめです。
なお、AWS CLI のエンドポイント設定には優先順序がある点にはご注意ください。

本記事が誰かのお役に立てれば幸いです。

参考

https://docs.aws.amazon.com/ja_jp/cli/v1/userguide/cli-configure-envvars.html#envvars-list-AWS_ENDPOINT_URL_SERVICE
https://docs.aws.amazon.com/ja_jp/cli/v1/userguide/cli-configure-files.html#cli-configure-files-format-services
https://docs.aws.amazon.com/ja_jp/cli/v1/userguide/cli-configure-options.html#cli-configure-options-list

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.