ブログに戻る

AWS LambdaでのパーシングとAPIのためのプロキシ設定方法:例付き完全ガイド

AWS Lambdaでのプロキシ設定に関するステップバイステップガイド。パース、APIリクエスト、自動化のためのPythonおよびNode.jsのコード例、一般的な問題の解決策。

📅2026年2月18日
```html

AWS Lambdaは、サーバーを管理することなくコードを実行できるサーバーレスプラットフォームです。しかし、ウェブサイトの解析、マーケットプレイスのAPI、またはタスクの自動化を行う際には、Lambda関数がAWSのIPアドレスを使用するため、簡単に検出されてブロックされるという問題が頻繁に発生します。このガイドでは、Lambdaにプロキシを統合し、IPのローテーションを設定し、一般的なエラーを回避する方法を説明します。

この記事は、AWS Lambdaを通じてタスクを自動化する開発者を対象としています:保護されたウェブサイトからのデータ解析、競合の価格監視、ソーシャルメディアやマーケットプレイスのAPIとの連携。読んだ後すぐに使用できるPythonとNode.jsのコード例を提供します。

AWS Lambdaにおけるプロキシの必要性

AWS LambdaはデフォルトでAmazon Web ServicesのプールからIPアドレスを使用します。これらのアドレスは公開リストにあり、ボット対策システムによって簡単に特定されます。プロキシが必要となる主なシナリオは以下の通りです:

実際のケース: 開発者がWildberriesの価格を15分ごとに監視するためにLambdaを設定しました。2日後、マーケットプレイスは403 Forbiddenエラーを返し始めました — AWS IPがブラックリストに載ったのです。居住用プロキシを接続した後、解析は6ヶ月間安定して動作しています。

Lambdaでプロキシを使用する主な理由:

  • 保護されたウェブサイトの解析: 多くのウェブサイトはAWSデータセンターのIPからのリクエストをブロックします。プロキシを使用することで、Lambdaを通常のユーザーとして偽装できます。
  • 地理的制限: 特定の国からのみアクセス可能なウェブサイトからデータを取得する必要がある場合(例:Ozonの地域価格)、必要な地理的ロケーションを持つプロキシが問題を解決します。
  • レート制限の回避: 多くのサービスのAPIは、1つのIPからのリクエスト数を制限しています。プロキシのローテーションにより、負荷を分散できます。
  • A/Bテストの広告: 競合分析のために異なる地域からの広告表示を確認します。
  • マーケットプレイスの監視: Wildberries、Ozon、Avitoでの商品の位置、競合の価格をブロックなしで追跡します。

Lambda関数は、スケジュールに従って(CloudWatch Eventsを介して)またはトリガーによって実行されることが多く、自動化のための理想的なツールです。しかし、プロキシなしでは、これらのタスクはターゲットリソースからのブロックにすぐに直面します。

Lambdaに最適なプロキシの種類

プロキシの種類の選択は、Lambda関数が解決するタスクによって異なります。サーバーレスアーキテクチャにおける3つの主要なタイプとその適用を見てみましょう:

プロキシの種類 速度 匿名性 Lambdaに最適なシナリオ
データセンターのプロキシ 非常に高い(50-200 ms) 中程度 厳重な保護がないAPIの解析、大規模なウェブサイトの可用性チェック、SEOモニタリング
居住用プロキシ 中程度(300-800 ms) 非常に高い 保護されたウェブサイトの解析(マーケットプレイス、ソーシャルメディア)、Cloudflareの回避、Instagram/Facebook APIとの連携
モバイルプロキシ 中程度(400-1000 ms) 最大 モバイルAPI(TikTok、Instagram)との連携、モバイル広告のテスト、最も厳しい保護の回避

選択に関する推奨事項:

  • Wildberries、Ozon、Avitoの解析の場合: ロシアの地理的ロケーションを持つ居住用プロキシを使用してください。これらのプラットフォームはデータセンターのIPを積極的にブロックします。
  • 厳重な保護がないAPIの監視の場合: データセンターのプロキシで十分です。これらは安価で高速です。
  • Instagram、Facebook、TikTok APIとの連携の場合: モバイルまたは居住用プロキシのみを使用してください — これらのプラットフォームはデータセンターを検出して禁止します。
  • Cloudflare、PerimeterXの回避の場合: ローテーション付きの居住用プロキシを使用することをお勧めします。特に、sticky sessions(IPを5-30分保持する)を使用することが望ましいです。

重要: Lambda関数には実行時間の制限があります(最大15分)。遅いプロキシ(居住用/モバイル)を使用する場合は遅延を考慮してください — プロキシを介したリクエストが2秒かかる場合、15分間で最大約450リクエストを行うことができます。

PythonでのLambdaにおけるプロキシの設定(requests、urllib3)

Pythonは、特に解析や自動化のタスクにおいて、Lambda関数で最も人気のある言語です。ここでは、90%のケースで使用されるrequestsライブラリを使用したプロキシの設定を見てみましょう。

HTTPプロキシの基本設定

プロキシを接続する最も簡単な方法は、proxiesパラメータをrequests.get()メソッドに渡すことです:

import requests
import os

def lambda_handler(event, context):
    # 環境変数からプロキシの資格情報を取得
    proxy_host = os.environ['PROXY_HOST']  # 例:proxy.example.com
    proxy_port = os.environ['PROXY_PORT']  # 例:8080
    proxy_user = os.environ['PROXY_USER']
    proxy_pass = os.environ['PROXY_PASS']
    
    # 認証付きプロキシのURLを形成
    proxy_url = f"http://{proxy_user}:{proxy_pass}@{proxy_host}:{proxy_port}"
    
    proxies = {
        'http': proxy_url,
        'https': proxy_url
    }
    
    try:
        # プロキシを介してリクエストを行う
        response = requests.get(
            'https://api.example.com/data',
            proxies=proxies,
            timeout=10  # 重要!タイムアウトを設定してください
        )
        
        return {
            'statusCode': 200,
            'body': response.text
        }
    
    except requests.exceptions.ProxyError as e:
        print(f"プロキシエラー: {e}")
        return {
            'statusCode': 500,
            'body': 'プロキシ接続に失敗しました'
        }
    
    except requests.exceptions.Timeout as e:
        print(f"タイムアウトエラー: {e}")
        return {
            'statusCode': 504,
            'body': 'リクエストがタイムアウトしました'
        }

このコードの重要なポイント:

  • 環境変数: プロキシの資格情報をコード内に直接保存しないでください!Lambdaの設定で環境変数を使用してください。
  • タイムアウト: タイムアウト(10-30秒)を必ず設定してください。これがないと、Lambdaは最大実行時間が経過するまでハングする可能性があります。
  • エラーハンドリング: プロキシが利用できない場合や遅い場合があります — 常にProxyErrorおよびTimeoutの例外を処理してください。
  • HTTPとHTTPS: 使用するプロトコルがHTTPSのみであっても、proxies辞書に両方のプロトコルを指定してください。

SOCKS5プロキシの設定

SOCKS5プロキシは、より高い匿名性を提供し、TCPレベルで動作するため、一部の保護システムに対して目立たなくなります。requestsでSOCKS5を使用するには、requests[socks]ライブラリが必要です:

import requests
import os

def lambda_handler(event, context):
    proxy_host = os.environ['PROXY_HOST']
    proxy_port = os.environ['PROXY_PORT']
    proxy_user = os.environ['PROXY_USER']
    proxy_pass = os.environ['PROXY_PASS']
    
    # 認証付きSOCKS5プロキシ
    proxy_url = f"socks5://{proxy_user}:{proxy_pass}@{proxy_host}:{proxy_port}"
    
    proxies = {
        'http': proxy_url,
        'https': proxy_url
    }
    
    try:
        response = requests.get(
            'https://www.wildberries.ru/catalog/12345/detail.aspx',
            proxies=proxies,
            timeout=15
        )
        
        # データを解析
        return {
            'statusCode': 200,
            'body': response.text
        }
    
    except Exception as e:
        print(f"エラー: {e}")
        return {
            'statusCode': 500,
            'body': str(e)
        }

Lambdaへのデプロイ時に重要: SOCKS5を使用する場合は、requirements.txtに追加してください:

requests[socks]
PySocks

プロキシを介したIPの確認

メインロジックを実行する前に、プロキシが機能しており、必要なIPを返していることを確認するのが便利です:

def check_proxy_ip(proxies):
    """プロキシを介して外部が見えるIPを確認します"""
    try:
        response = requests.get(
            'https://api.ipify.org?format=json',
            proxies=proxies,
            timeout=10
        )
        ip_data = response.json()
        print(f"プロキシを介した現在のIP: {ip_data['ip']}")
        return ip_data['ip']
    except Exception as e:
        print(f"プロキシチェックに失敗しました: {e}")
        return None

def lambda_handler(event, context):
    # ... プロキシの設定 ...
    
    # メイン作業の前にIPを確認
    current_ip = check_proxy_ip(proxies)
    if not current_ip:
        return {
            'statusCode': 500,
            'body': 'プロキシの検証に失敗しました'
        }
    
    # メインの解析ロジック
    # ...

Node.jsでのLambdaにおけるプロキシの設定(axios、got)

Node.jsは、特にAPIとの連携時に高いパフォーマンスが求められるLambda関数で2番目に人気のある言語です。ここでは、axiosおよびgotライブラリを使用したプロキシの設定を見てみましょう。

axiosを使用した設定

Axiosは、Node.js用の最も人気のあるHTTPライブラリです。プロキシを使用するには、追加のパッケージhttps-proxy-agentが必要です:

const axios = require('axios');
const HttpsProxyAgent = require('https-proxy-agent');

exports.handler = async (event) => {
    // 環境変数から資格情報を取得
    const proxyHost = process.env.PROXY_HOST;
    const proxyPort = process.env.PROXY_PORT;
    const proxyUser = process.env.PROXY_USER;
    const proxyPass = process.env.PROXY_PASS;
    
    // プロキシのURLを形成
    const proxyUrl = `http://${proxyUser}:${proxyPass}@${proxyHost}:${proxyPort}`;
    
    // プロキシ用のエージェントを作成
    const agent = new HttpsProxyAgent(proxyUrl);
    
    try {
        const response = await axios.get('https://api.example.com/data', {
            httpsAgent: agent,
            timeout: 10000  // 10秒
        });
        
        return {
            statusCode: 200,
            body: JSON.stringify(response.data)
        };
    } catch (error) {
        console.error('リクエストに失敗しました:', error.message);
        
        return {
            statusCode: 500,
            body: JSON.stringify({
                error: error.message
            })
        };
    }
};

依存関係のインストール: package.jsonに追加してください:

{
  "dependencies": {
    "axios": "^1.6.0",
    "https-proxy-agent": "^7.0.0"
  }
}

axiosを使用したSOCKS5の設定

SOCKS5プロキシには、socks-proxy-agentパッケージを使用します:

const axios = require('axios');
const { SocksProxyAgent } = require('socks-proxy-agent');

exports.handler = async (event) => {
    const proxyUrl = `socks5://${process.env.PROXY_USER}:${process.env.PROXY_PASS}@${process.env.PROXY_HOST}:${process.env.PROXY_PORT}`;
    
    const agent = new SocksProxyAgent(proxyUrl);
    
    try {
        const response = await axios.get('https://www.ozon.ru/api/products', {
            httpAgent: agent,
            httpsAgent: agent,
            timeout: 15000
        });
        
        return {
            statusCode: 200,
            body: JSON.stringify(response.data)
        };
    } catch (error) {
        console.error('エラー:', error.message);
        return {
            statusCode: 500,
            body: JSON.stringify({ error: error.message })
        };
    }
};

代替案:gotライブラリ

Gotは、プロキシをネイティブにサポートする現代的なHTTPライブラリです(別のエージェントを必要としません):

const got = require('got');

exports.handler = async (event) => {
    const proxyUrl = `http://${process.env.PROXY_USER}:${process.env.PROXY_PASS}@${process.env.PROXY_HOST}:${process.env.PROXY_PORT}`;
    
    try {
        const response = await got('https://api.example.com/data', {
            agent: {
                http: new (require('http-proxy-agent'))(proxyUrl),
                https: new (require('https-proxy-agent'))(proxyUrl)
            },
            timeout: {
                request: 10000
            },
            responseType: 'json'
        });
        
        return {
            statusCode: 200,
            body: JSON.stringify(response.body)
        };
    } catch (error) {
        console.error('エラー:', error.message);
        return {
            statusCode: 500,
            body: JSON.stringify({ error: error.message })
        };
    }
};

Lambdaにおけるプロキシのローテーション:IPを自動的に変更する方法

プロキシのローテーションは、ブロックなしで多くのリクエストを行う必要があるタスクにとって非常に重要です。主に2つのアプローチがあります:自動ローテーションを提供するプロキシサービスの使用、またはプロキシプールを手動で管理することです。

プロバイダーによる自動ローテーション

ほとんどの居住用プロキシプロバイダー(ProxyCoveを含む)は、自動ローテーションを提供するエンドポイントを提供しています — 各リクエストまたはN分ごとにIPが自動的に変更されます:

import requests
import os

def lambda_handler(event, context):
    # 自動ローテーション付きプロキシ
    # フォーマット:rotating.proxy.com:port
    # 各リクエスト = 新しいIP
    proxy_url = f"http://{os.environ['PROXY_USER']}:{os.environ['PROXY_PASS']}@rotating.proxycove.com:8080"
    
    proxies = {
        'http': proxy_url,
        'https': proxy_url
    }
    
    results = []
    
    # 10回リクエストを行う — 各リクエストで新しいIP
    for i in range(10):
        try:
            response = requests.get(
                f'https://api.wildberries.ru/products/{i}',
                proxies=proxies,
                timeout=10
            )
            results.append({
                'product_id': i,
                'status': response.status_code,
                'data': response.json()
            })
        except Exception as e:
            results.append({
                'product_id': i,
                'error': str(e)
            })
    
    return {
        'statusCode': 200,
        'body': json.dumps(results)
    }

プロキシプールからの手動ローテーション

プロキシのリストがある場合は、手動でローテーションを実装できます。これは、各リクエストに使用されるプロキシを制御する必要がある場合に便利です:

import requests
import random
import json

def lambda_handler(event, context):
    # プロキシのリスト(DynamoDBやS3に保存可能)
    proxy_pool = [
        {
            'host': 'proxy1.example.com',
            'port': '8080',
            'user': 'user1',
            'pass': 'pass1'
        },
        {
            'host': 'proxy2.example.com',
            'port': '8080',
            'user': 'user2',
            'pass': 'pass2'
        },
        {
            'host': 'proxy3.example.com',
            'port': '8080',
            'user': 'user3',
            'pass': 'pass3'
        }
    ]
    
    results = []
    
    for i in range(10):
        # プールからランダムにプロキシを選択
        proxy = random.choice(proxy_pool)
        proxy_url = f"http://{proxy['user']}:{proxy['pass']}@{proxy['host']}:{proxy['port']}"
        
        proxies = {
            'http': proxy_url,
            'https': proxy_url
        }
        
        try:
            response = requests.get(
                f'https://api.example.com/item/{i}',
                proxies=proxies,
                timeout=10
            )
            results.append({
                'item': i,
                'proxy_used': proxy['host'],
                'status': response.status_code
            })
        except Exception as e:
            results.append({
                'item': i,
                'proxy_used': proxy['host'],
                'error': str(e)
            })
    
    return {
        'statusCode': 200,
        'body': json.dumps(results)
    }

IPを保持するためのSticky sessions

一部のタスクでは、セッションの間に1つのIPを保持する必要があります(例:ウェブサイトへの認証)。プロキシプロバイダーは、URLのパラメータを介してsticky sessionsを提供します:

import requests
import uuid

def lambda_handler(event, context):
    # ユニークなsession_idを生成
    session_id = str(uuid.uuid4())
    
    # Sticky session付きプロキシ(IPが10分保持される)
    proxy_url = f"http://{os.environ['PROXY_USER']}-session-{session_id}:{os.environ['PROXY_PASS']}@sticky.proxycove.com:8080"
    
    proxies = {
        'http': proxy_url,
        'https': proxy_url
    }
    
    # このLambda内のすべてのリクエストは同じIPで実行されます
    # 1. 認証
    login_response = requests.post(
        'https://example.com/login',
        data={'user': 'test', 'pass': 'test'},
        proxies=proxies
    )
    
    # 2. データの取得(同じIPが使用される)
    data_response = requests.get(
        'https://example.com/dashboard',
        proxies=proxies,
        cookies=login_response.cookies
    )
    
    return {
        'statusCode': 200,
        'body': data_response.text
    }

環境変数を使用したプロキシの資格情報の保存

プロキシの資格情報(ユーザー名、パスワード、ホスト)をLambda関数のコード内に直接保存しないでください。AWSは、機密データを保存するためのいくつかの安全な方法を提供しています:

1. 環境変数(基本的な方法)

AWS Lambdaコンソール → 設定 → 環境変数で以下を追加します:

  • PROXY_HOST = proxy.example.com
  • PROXY_PORT = 8080
  • PROXY_USER = your_username
  • PROXY_PASS = your_password

AWSは自動的に環境変数を静止状態で暗号化します。コード内でのアクセス方法:

# Python
import os
proxy_host = os.environ['PROXY_HOST']

// Node.js
const proxyHost = process.env.PROXY_HOST;

2. AWS Secrets Manager(本番環境向け推奨)

最大のセキュリティを確保するためにAWS Secrets Managerを使用してください — 自動的なシークレットのローテーションと詳細なアクセス制御を提供します:

import boto3
import json
from botocore.exceptions import ClientError

def get_proxy_credentials():
    secret_name = "proxy-credentials"
    region_name = "us-east-1"
    
    session = boto3.session.Session()
    client = session.client(
        service_name='secretsmanager',
        region_name=region_name
    )
    
    try:
        get_secret_value_response = client.get_secret_value(
            SecretId=secret_name
        )
        secret = json.loads(get_secret_value_response['SecretString'])
        return secret
    except ClientError as e:
        print(f"シークレットの取得エラー: {e}")
        raise e

def lambda_handler(event, context):
    # Secrets Managerから資格情報を取得
    creds = get_proxy_credentials()
    
    proxy_url = f"http://{creds['user']}:{creds['password']}@{creds['host']}:{creds['port']}"
    
    # プロキシを使用
    # ...

重要: Secrets Managerへのアクセス権をLambda関数に追加することを忘れないでください:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "secretsmanager:GetSecretValue"
      ],
      "Resource": "arn:aws:secretsmanager:us-east-1:123456789:secret:proxy-credentials-*"
    }
  ]
}

一般的なエラーとその解決策

Lambdaでプロキシを使用する際、開発者はしばしば同じ問題に直面します。最も一般的な問題とその解決策を見てみましょう:

エラー: ProxyError / Connection timeout

症状: requests.exceptions.ProxyError: HTTPConnectionPool(host='proxy.example.com', port=8080): 最大リトライ回数を超えました

原因:

  • 無効なプロキシの資格情報(ユーザー名/パスワード)
  • プロキシサーバーが利用できないか、過負荷になっている
  • ファイアウォールがLambdaからのアウトバウンド接続をブロックしている
  • タイムアウトが短すぎる

解決策:

# 1. 資格情報を確認
print(f"使用しているプロキシ: {proxy_host}:{proxy_port}")
print(f"ユーザー: {proxy_user}")

# 2. タイムアウトを延長
response = requests.get(url, proxies=proxies, timeout=30)

# 3. リトライロジックを追加
from requests.adapters import HTTPAdapter
from requests.packages.urllib3.util.retry import Retry

session = requests.Session()
retry = Retry(
    total=3,
    backoff_factor=1,
    status_forcelist=[500, 502, 503, 504]
)
adapter = HTTPAdapter(max_retries=retry)
session.mount('http://', adapter)
session.mount('https://', adapter)

response = session.get(url, proxies=proxies, timeout=30)

エラー: SSL証明書の検証に失敗しました

症状: SSLError: [SSL: CERTIFICATE_VERIFY_FAILED]

原因: 一部のプロキシ(特に安価なもの)は自己署名のSSL証明書を使用しています。

解決策(注意して使用してください!):

# SSL検証を無効にする(テスト用のみ!)
response = requests.get(
    url,
    proxies=proxies,
    verify=False  # 本番環境では使用しないでください!
)

# より良い方法: CA証明書へのパスを指定
response = requests.get(
    url,
    proxies=proxies,
    verify='/path/to/ca-bundle.crt'
)

重要: SSL検証を無効にする(verify=False)と、man-in-the-middle攻撃に対して接続が脆弱になります。開発環境でのデバッグのみに使用してください!

エラー: Lambdaタイムアウト(タスクがX秒後にタイムアウトしました)

症状: Lambda関数がタイムアウトエラーで終了し、プロキシからの応答を待たずに終了します。

原因: 遅いプロキシ(特に居住用/モバイル) + 大量のリクエスト。

解決策:

  • Lambda関数のタイムアウトを延長します:設定 → 一般設定 → タイムアウト(最大15分)
  • 1回の実行でのリクエスト数を減らします
  • 非同期リクエストを使用します(Pythonのasyncio、Node.jsのPromise.all)
  • 重要でないタスクにはより高速なプロキシを切り替えます
# Python: パフォーマンスを向上させるための非同期リクエスト
import asyncio
import aiohttp

async def fetch_url(session, url, proxy):
    async with session.get(url, proxy=proxy, timeout=10) as response:
        return await response.text()

async def lambda_handler_async(event, context):
    proxy_url = f"http://{os.environ['PROXY_USER']}:{os.environ['PROXY_PASS']}@{os.environ['PROXY_HOST']}:{os.environ['PROXY_PORT']}"
    
    urls = [f'https://api.example.com/item/{i}' for i in range(50)]
    
    async with aiohttp.ClientSession() as session:
        tasks = [fetch_url(session, url, proxy_url) for url in urls]
        results = await asyncio.gather(*tasks)
    
    return {
        'statusCode': 200,
        'body': json.dumps({'count': len(results)})
    }

def lambda_handler(event, context):
    return asyncio.run(lambda_handler_async(event, context))

エラー: 407 Proxy Authentication Required

症状: プロキシを使用しようとしたときにHTTP 407エラーが発生します。

原因: 資格情報の送信形式が無効であるか、プロキシがユーザー名/パスワードの代わりにIP認証を要求しています。

解決策:

# プロキシのURL形式を確認
# 正しい:
proxy_url = f"http://{user}:{password}@{host}:{port}"

# 誤り(プロトコルが欠落):
proxy_url = f"{user}:{password}@{host}:{port}"  # ❌

# プロキシがIP認証を要求する場合:
# 1. Lambdaの外部IPを確認(変更される可能性があります!)
# 2. このIPをプロキシプロバイダーのホワイトリストに追加
# 3. ユーザー名/パスワードなしでプロキシを使用

# Lambdaの外部IPを取得:
response = requests.get('https://api.ipify.org?format=json')
lambda_ip = response.json()['ip']
print(f"Lambdaの外部IP: {lambda_ip}")

プロキシを使用したLambdaのパフォーマンス最適化

プロキシを使用すると、各リクエストに遅延が追加されます。パフォーマンスへの影響を最小限に抑えるための検証済みの方法は以下の通りです:

1. 接続プーリング

各リクエストのために新しい接続を作成するのではなく、TCP接続を再利用します:

# Python: requests.get()の代わりにSessionを使用
import requests

# セッションを一度作成します(ハンドラーの外に出すことができます)
session = requests.Session()
session.proxies = {
    'http': proxy_url,
    'https': proxy_url
}

def lambda_handler(event, context):
    # すべてのリクエストが接続を再利用します
    for i in range(100):
        response = session.get(f'https://api.example.com/item/{i}')
        # 応答を処理...

2. 並列リクエスト

多くの独立したリクエストを行う必要がある場合は、並列に実行します:

// Node.js: Promise.allによる並列リクエスト
const axios = require('axios');
const HttpsProxyAgent = require('https-proxy-agent');

const agent = new HttpsProxyAgent(proxyUrl);

exports.handler = async (event) => {
    const urls = Array.from({length: 50}, (_, i) => 
        `https://api.example.com/item/${i}`
    );
    
    // すべてのリクエストが並列に実行されます
    const promises = urls.map(url => 
        axios.get(url, { 
            httpsAgent: agent,
            timeout: 10000
        })
    );
    
    try {
        const results = await Promise.all(promises);
        return {
            statusCode: 200,
            body: JSON.stringify({
                count: results.length,
                data: results.map(r => r.data)
            })
        };
    } catch (error) {
        console.error('エラー:', error.message);
        return {
            statusCode: 500,
            body: JSON.stringify({ error: error.message })
        };
    }
};

3. 結果のキャッシュ

データがあまり変更されない場合は、DynamoDBやS3に結果をキャッシュします:

import boto3
import json
import time

dynamodb = boto3.resource('dynamodb')
table = dynamodb.Table('proxy-cache')

def get_cached_or_fetch(url, proxies, cache_ttl=3600):
    """キャッシュからデータを取得するか、プロキシを介してリクエストを行います"""
    
    # キャッシュを確認
    try:
        response = table.get_item(Key={'url': url})
        if 'Item' in response:
            item = response['Item']
            if time.time() - item['timestamp'] < cache_ttl:
                print(f"{url}のキャッシュヒット")
                return item['data']
    except Exception as e:
        print(f"キャッシュエラー: {e}")
    
    # キャッシュが空または期限切れ — リクエストを行います
    print(f"{url}のキャッシュミス、取得中...")
    response = requests.get(url, proxies=proxies, timeout=10)
    data = response.text
    
    # キャッシュに保存
    try:
        table.put_item(Item={
            'url': url,
            'data': data,
            'timestamp': int(time.time())
        })
    except Exception as e:
        print(f"キャッシュ保存エラー: {e}")
    
    return data

4. 正しいプロキシの種類を選択

実際の条件下でのさまざまなプロキシの速度を比較します:

プロキシの種類 平均遅延 リクエスト数/分(Lambda 1GB RAM) 推奨事項
データセンター 50-200 ms 300-600 APIの大量解析
居住用 300-800 ms 100-200 保護されたウェブサイト
モバイル 500-1500 ms 50-100 モバイルAPIとの連携

選択に関する推奨事項:

  • データセンターのプロキシ: 大量のリクエストを行う場合に適しています。
  • 居住用プロキシ: 保護されたウェブサイトへのアクセスに最適です。
  • モバイルプロキシ: モバイルAPIとの連携や広告テストに使用します。
```