プライベートネットワークへのデプロイやファイアウォールによる分離など、ネットワーク制限によりアプリケーションが OpenAPI を呼び出せない場合は、プロキシサーバーを使用してパブリックネットワークにアクセスします。Alibaba Cloud SDK は、HTTP と HTTPS の両方のプロキシ設定を完全にサポートします。プロキシのアドレス、ポート、認証パラメーターを設定することで、OpenAPI リクエストをプロキシ経由でルーティングできます。このトピックでは、Tengine を例として、SDK を使用してプロキシ経由で OpenAPI を呼び出す方法を説明します。
シナリオ例
たとえば、アプリケーションがプライベートネットワーク内にあり、プロキシサーバー経由でパブリックネットワークにアクセスする必要がある場合、VPC 内の以下の ECS インスタンスを使用してこの環境をシミュレートできます。
-
ECS インスタンス A:アプリケーションを実行します。パブリックネットワークに直接アクセスできず、VPC 内のリソースにのみアクセスできます (プライベート IP:10.0.0.115)。
-
ECS インスタンス B:プロキシサーバーとして機能します。パブリックネットワークにアクセスでき、ECS インスタンス A と同じ VPC 内にあります (プライベート IP:10.0.0.112)。
説明インスタンス A と B が同じ VPC 内にない場合は、VPC ピアリング接続またはエンタープライズ版トランジットルーターを使用して、プライベートネットワーク接続を有効にできます。
プロキシサーバーのセットアップ
この例では、Tengine をプロキシサーバーとして使用し、ECS インスタンス B にデプロイします。
Tengine のインストール
-
パッケージをダウンロードして展開します。
wget https://tengine.taobao.org/download/tengine-3.1.0.tar.gz tar zxvf tengine-3.1.0.tar.gz -
システムパッケージを更新します。
Alibaba Cloud Linux / CentOS
sudo yum update -yUbuntu / Debian
sudo apt-get update sudo apt-get upgrade -y -
必要な依存関係をインストールします。
Alibaba Cloud Linux / CentOS
sudo yum install pcre pcre-devel openssl openssl-devel zlib-devel -y sudo yum groupinstall "Development Tools" -yUbuntu / Debian
sudo apt-get install libpcre3 libpcre3-dev zlib1g-dev openssl libssl-dev build-essential -y -
Tengine をビルドしてインストールします。
cd tengine-3.1.0 ./configure --with-http_stub_status_module --with-http_ssl_module --with-http_gzip_static_module --add-module=./modules/ngx_http_proxy_connect_module make && make install -
Tengine を起動します。
次のコマンドを実行して、Tengine の実行可能ファイルのパスを確認します。たとえば、パスは
/root/tengine-3.1.0/objs/nginxになる場合があります。find / -name nginx 2>/dev/null | grep tengine実行可能ファイルを実行して Tengine を起動します。
sudo /root/tengine-3.1.0/objs/nginx -
Tengine が正常に起動したことを確認します。
# Tengine プロセスが存在するかどうかを確認します。 ps aux | grep nginx
HTTP および HTTPS プロキシの設定
-
次のコマンドを実行して、Tengine 設定ファイルを編集します。
vim /usr/local/nginx/conf/nginx.conf設定ファイルで、
httpモジュールに次の内容を追加します。警告以下の設定は参考用です。本番ワークロードでは、特定のシナリオに基づいてプロキシ設定を構成してください。
# HTTPS プロキシ server { listen 8089; access_log /var/log/host.access.log; access_log "pipe:rollback /var/log/host.access_log interval=1d baknum=7 maxsize=2G"; # CONNECT リクエスト用のフォワードプロキシ proxy_connect; proxy_connect_allow 443 563; proxy_connect_connect_timeout 10s; proxy_connect_read_timeout 10s; proxy_connect_send_timeout 10s; # CONNECT 以外のリクエスト用のフォワードプロキシ location / { proxy_pass $scheme://$http_host$request_uri; } } # HTTP プロキシ server { listen 8088; location / { proxy_pass $scheme://$http_host$request_uri; } }内容を追加したら、ファイルを保存します。
-
Tengine をリロードします。
# Tengine を停止します /usr/local/nginx/sbin/nginx -s stop # 設定を適用します /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf # Tengine をリロードします /usr/local/nginx/sbin/nginx -s reload
SDK プロキシを使用した API の呼び出し
ECS インスタンス A にアプリケーションコードをデプロイします。次のサンプルコードはテスト専用です。
# pip install alibabacloud_ecs20140526
import os
from alibabacloud_ecs20140526.client import Client as EcsClient
from alibabacloud_ecs20140526.models import DescribeRegionsRequest
from alibabacloud_tea_openapi.models import Config
from alibabacloud_tea_util.models import RuntimeOptions
config = Config(
access_key_id=os.environ.get('ALIBABA_CLOUD_ACCESS_KEY_ID'),
access_key_secret=os.environ.get('ALIBABA_CLOUD_ACCESS_KEY_SECRET'),
endpoint='ecs-cn-hangzhou.aliyuncs.com',
protocol='https', # プロトコルはプロキシタイプと一致する必要があります。HTTPS プロキシの場合は 'https'、HTTP プロキシの場合は 'http' を使用します。
)
ecs_client = EcsClient(config)
runtime_options = RuntimeOptions(
# http_proxy='http://10.0.0.112:8088', # HTTP プロキシ:プロキシサーバーの IP アドレスとポート。
https_proxy='http://10.0.0.112:8089' # HTTPS プロキシ:プロキシサーバーの IP アドレスとポート。
)
request = DescribeRegionsRequest(
accept_language='en-US',
)
response = ecs_client.describe_regions_with_options(request, runtime_options)
print(response.body)
次の出力が返されます。
{'headers': {'server': 'nginx/1.24.0 (Ubuntu)', 'date': 'Mon, 26 May 2025 10:04:19 GMT', 'content-type': 'application/json;charset=utf-8', 'transfer-encoding': 'chunked', 'connection': 'keep-alive', 'vary': 'Accept-Encoding, Accept-Encoding', 'access-control-allow-origin': '*', 'access-control-expose-headers': '*', 'x-acs-request-id': '39B6068B-E4F3-5FC4-3817-ED3D62BAEFCA', 'x-acs-trace-id': 'aa08b2d7a0f35d1f054164675f23cc98', 'statusCode': 200, 'body': {'Regions': {'Region': [{'LocalName': 'China (Qingdao)', 'RegionEndpoint': 'ecs.cn-qingdao.aliyuncs.com', 'RegionId': 'cn-qingdao'}, {'LocalName': 'China (Beijing)', 'RegionEndpoint': 'ecs.cn-beijing.aliyuncs.com', 'RegionId': 'cn-beijing'}, {'LocalName': 'China (Zhangjiakou)', 'RegionEndpoint': 'ecs.cn-zhangjiakou.aliyuncs.com', 'RegionId': 'cn-zhangjiakou'}, {'LocalName': 'China (Hohhot)', 'RegionEndpoint': 'ecs.cn-huhehaote.aliyuncs.com', 'RegionId': 'cn-huhehaote'}, {'LocalName': 'China (Ulanqab)', 'RegionEndpoint': 'ecs.cn-wulanchabu.aliyuncs.com', 'RegionId': 'cn-wulanchabu'}, {'LocalName': 'China (Hangzhou)', 'RegionEndpoint': 'ecs.aliyuncs.com', 'RegionId': 'cn-hangzhou'}, {'LocalName': 'China (Shanghai)', 'RegionEndpoint': 'ecs.cn-shanghai.aliyuncs.com', 'RegionId': 'cn-shanghai'}, {'LocalName': 'China (Nanjing - Local Region)', 'RegionEndpoint': 'ecs.cn-nanjing.aliyuncs.com', 'RegionId': 'cn-nanjing'}, {'LocalName': 'China (Shenzhen)', 'RegionEndpoint': 'ecs.cn-shenzhen.aliyuncs.com', 'RegionId': 'cn-shenzhen'}, {'LocalName': 'China (Heyuan)', 'RegionEndpoint': 'ecs.cn-heyuan.aliyuncs.com', 'RegionId': 'cn-heyuan'}, {'LocalName': 'China (Guangzhou)', 'RegionEndpoint': 'ecs.cn-guangzhou.aliyuncs.com', 'RegionId': 'cn-guangzhou'}, {'LocalName': 'China (Fuzhou – Local Region)', 'RegionEndpoint': 'ecs.cn-fuzhou.aliyuncs.com', 'RegionId': 'cn-fuzhou'}, {'LocalName': 'China (Wuhan – Local Region)', 'RegionEndpoint': 'ecs.cn-wuhan-lr.aliyuncs.com', 'RegionId': 'cn-wuhan-lr'}, {'LocalName': 'China (Chengdu)', 'RegionEndpoint': 'ecs.cn-chengdu.aliyuncs.com', 'RegionId': 'cn-chengdu'}, {'LocalName': 'China (Hong Kong)', 'RegionEndpoint': 'ecs.cn-hongkong.aliyuncs.com', 'RegionId': 'cn-hongkong'}, {'LocalName': 'Japan (Tokyo)', 'RegionEndpoint': 'ecs.ap-northeast-1.aliyuncs.com', 'RegionId': 'ap-northeast-1'}, {'LocalName': 'South Korea (Seoul)', 'RegionEndpoint': 'ecs.ap-northeast-2.aliyuncs.com', 'RegionId': 'ap-northeast-2'}, {'LocalName': 'Singapore', 'RegionEndpoint': 'ecs.ap-southeast-1.aliyuncs.com', 'RegionId': 'ap-southeast-1'}, {'LocalName': 'Malaysia (Kuala Lumpur)', 'RegionEndpoint': 'ecs.ap-southeast-3.aliyuncs.com', 'RegionId': 'ap-southeast-3'}, {'LocalName': 'Philippines (Manila)', 'RegionEndpoint': 'ecs.ap-southeast-6.aliyuncs.com', 'RegionId': 'ap-southeast-6'}, {'LocalName': 'Indonesia (Jakarta)', 'RegionEndpoint': 'ecs.ap-southeast-5.aliyuncs.com', 'RegionId': 'ap-southeast-5'}, {'LocalName': 'Thailand (Bangkok)', 'RegionEndpoint': 'ecs.ap-southeast-7.aliyuncs.com', 'RegionId': 'ap-southeast-7'}, {'LocalName': 'US (Virginia)', 'RegionEndpoint': 'ecs.us-east-1.aliyuncs.com', 'RegionId': 'us-east-1'}, {'LocalName': 'US (Silicon Valley)', 'RegionEndpoint': 'ecs.us-west-1.aliyuncs.com', 'RegionId': 'us-west-1'}, {'LocalName': 'Mexico', 'RegionEndpoint': 'ecs.na-south-1.aliyuncs.com', 'RegionId': 'na-south-1'}, {'LocalName': 'UK (London)', 'RegionEndpoint': 'ecs.eu-west-1.aliyuncs.com', 'RegionId': 'eu-west-1'}, {'LocalName': 'UAE (Dubai)', 'RegionEndpoint': 'ecs.me-east-1.aliyuncs.com', 'RegionId': 'me-east-1'}, {'LocalName': 'Germany (Frankfurt)', 'RegionEndpoint': 'ecs.eu-central-1.aliyuncs.com', 'RegionId': 'eu-central-1'}]}, 'RequestId': 'F90A5B33-FE86-55EF-B453-052AD7B0440F'}}}