このトピックでは、Alibaba Cloud SDK for Pythonを介してAPI操作を呼び出すことにより、複数のアプリケーションがEIP帯域幅プランの帯域幅を共有できるようにする方法について説明します。 これにより、データ出力コストが削減されます。

シナリオ

このトピックでは、次のシナリオを例として使用します。 会社は2つのECS (Elastic Compute Service) インスタンスを作成し、各ECSインスタンスにアプリケーションをデプロイします。 ECSインスタンスは、インターネットからリクエストを受信する必要があります。 サービスポートはポート80です。 2つのECSインスタンスに必要な帯域幅は、1日以内に異なります。
  • ECS 1のピーク時間は13:00:00から18:00:00の範囲です。 この期間中、ECS1が必要とする帯域幅は1,000 Mbit/sです。 1日の残りの時間の間、ECS 1が必要とする帯域幅は500 Mbit/sです。
  • ECS 2のピーク時間は19:00:00から23:00:00の範囲です。 この期間中、ECS 2が必要とする帯域幅は1,000 Mbit/sです。 1日の残りの時間の間、ECS 2が必要とする帯域幅は500 Mbit/sです。

ECSインスタンスの帯域幅を個別に購入する場合は、合計2,000 Mbit/sの帯域幅プランを2つ購入する必要があります。 ただし、ECSインスタンスはオフピーク時に帯域幅を最大限に活用することはできません。 これは、帯域幅リソースの浪費を引き起こす。

この問題を解決するには、NATゲートウェイで宛先ネットワークアドレス変換 (DNAT) を設定し、EIP帯域幅プランを購入します。
  • DNATは、elastic IPアドレス (EIP) を仮想プライベートクラウド (VPC) のECSインスタンスにマッピングします。 これにより、ECSインスタンスはインターネットからリクエストを受信できます。
  • EIP帯域幅プランは、インターネットデータ転送のコストを削減するために複数のアプリケーション間で共有できます。
シナリオ

前提条件

開始する前に、次の要件が満たされていることを確認してください。

  • Alibaba Cloud アカウントが作成済みであること。 Alibaba Cloudアカウントをお持ちでない場合は、create one が必要です。
  • AccessKey ペアが作成されていること。 AccessKeyペアがない場合は、[セキュリティ管理] ページに移動し、AccessKeyペアを作成します。
  • Python開発環境が準備され、Alibaba Cloud SDK for Pythonがインストールされます。 詳細については、「Classic SDK For Pythonの使用を開始する」をご参照ください。
  • 仮想プライベートクラウド (VPC) とvSwitchが作成されます。 詳細については、「CreateVpc」をご参照ください。
  • ECS (Elastic Compute Service) インスタンスがvSwitchに作成されます。 アプリケーションはECSインスタンスにデプロイされています。 詳細については、「CreateInstance」をご参照ください。
  • NATゲートウェイ用に2つのelastic IPアドレス (EIP) が作成されます。 EIPは次の要件を満たす必要があります。
    • EIPとNATゲートウェイは同じリージョンに属している必要があります。
    • EIPは従量課金で請求されます。

    詳細については、「AllocateEipAddress」をご参照ください。

手順

手順

ステップ1: NATゲートウェイの作成

NATゲートウェイは、ネットワークアドレス変換サービスを提供するエンタープライズクラスのゲートウェイです。 DNATエントリを作成する前に、NATゲートウェイを作成する必要があります。
説明 拡張NATゲートウェイを作成するときは、NATゲートウェイにvSwitchを指定する必要があります。 次に、システムはvSwitchからNATゲートウェイにアイドルプライベートIPアドレスを割り当てます。
  • 拡張NATゲートウェイを作成して既存のvSwitchにアタッチする場合は、vSwitchが属するゾーンが拡張NATゲートウェイをサポートしていることを確認してください。 さらに、vSwitchにはアイドルIPアドレスが必要です。
  • vSwitchがない場合は、拡張NATゲートウェイを作成する前に、拡張NATゲートウェイをサポートするゾーンにvSwitchを作成する必要があります。 次に、拡張NATゲートウェイのvSwitchを指定できます。

ListEnhancedNatGatewayAvailableZones を呼び出して拡張NATゲートウェイをサポートするゾーンを照会し、DescribeVSwitchesを呼び出してvSwitchのアイドルIPアドレスを照会できます。

  1. 次のサンプルコードは、NATゲートウェイを作成する方法を示しています。
    aliyunsdkcore.clientインポートからAcsClient
    からaliyunsdkcore.acs_exception.exceptions import ClientException
    aliyunsdkcore.acs_exception.exceptionsからServerExceptionをインポート
    aliyunsdkvpc.request. v20160428.からCreateNatGatewayRequestインポートCreateNatGatewayRequest
    
    # AcsClientインスタンスを作成します。
    # yourAccessKeyId: AccessKey ID。
    # yourAccessKeySecret: AccessKeyシークレット。
    # yourRegionId: リージョンID。
    client = AcsClient("yourAccessKeyId","yourAccessKeySecret","yourRegionId")
    
    # NATゲートウェイを作成します。
    request = CreateNatGatewayRequest()
    request.set_accept_format('json')
    
    # NATゲートウェイがデプロイされているVPCのID。
    request.set_VpcId("vpc-uf68wppzf839896z7 ****")
    
    # NATゲートウェイの名前。
    request.set_Name("test")
    
    # NATゲートウェイの説明。
    request.set_Description("test")
    
    # NATゲートウェイのサイズ。
    # 有効な値: Small、Medium、Large。 デフォルト値: Small。 この例では、パラメータはSmallに設定されています。 ビジネス要件を満たすゲートウェイのサイズを選択できます。
    request.set_Spec("Small")
    
    # NAT gatewayの課金方法。
    # 有効な値: PostPaidとPrePaid。 PostPaid: 従量課金の課金方法を示します。 PrePaid: サブスクリプションの課金方法を示します。 デフォルト値:PostPaid。
    request.set_InstanceChargeType("PrePaid")
    
    # サブスクリプションNAT gatewayの課金サイクル。
    # 有効な値: 月と年。 デフォルト値:Month。
    # InstanceChargeTypeがPrePaidに設定されている場合、このパラメーターは必須です。 InstanceChargeTypeがPostPaidに設定されている場合、このパラメーターを設定する必要はありません。
    request.set_PricingCycle("月")
    
    # サブスクリプション期間。
    # PricingCycleをMonthに設定した場合、Periodを1〜9の値に設定できます。 PricingCycleをYearに設定すると、Periodを1から3の値に設定できます。
    request.set_Duration("1")
    
    # 自動支払い。
    # 有効値: falseとtrue。 false: 自動支払いを無効にします。 このパラメーターをfalseに設定した場合、注文が生成された後に注文センターに移動して支払いを完了する必要があります。 true:自動支払いを有効化します。 このパラメーターをtrueに設定すると、支払いは自動的に完了します。
    request.set_AutoPay(True)
    
    # NAT gatewayが接続されているvSwitchのID。
    # 拡張NATゲートウェイを作成するときは、vSwitchを指定する必要があります。 システムは、vSwitchから拡張NATゲートウェイにアイドル状態のプライベートIPアドレスを自動的に割り当てます。
    request.set_VSwitchId("vsw-uf6gnat6e5tk0gnbm ****")
    
    # NATゲートウェイのタイプ。
    # 有効な値: NormalとEnhanced。 Normal: 標準NATゲートウェイを示します。 Enhanced: 拡張NATゲートウェイを示します。
    # 拡張NATゲートウェイは、標準NATゲートウェイからのアップグレードであり、より高度なアーキテクチャを使用します。 標準NATゲートウェイと比較して、拡張NATゲートウェイはより高い弾力性と安定性を提供します。 これにより、データ転送の管理方法が向上します。
    request.set_NatType("Enhanced")
    
    # NATゲートウェイの計測方法。
    # 有効な値: PayBySpecおよびPayByLcu。 PayBySpec: 従量課金方式を示します。 PayByLcu: CU単位の課金方法を示します。
    request.set_InternetChargeType("PayBySpec")
    
    # APIリクエストを作成してレスポンスを印刷します。
    response = client.do_action_with_exception (リクエスト)
    
    # python2: プリント (レスポンス)
    print(str(response, encoding='utf-8 '))
    コマンド出力:
    {
        "RequestId": "3164006B-33DB-46BB-B77D-FC80094D1F10" 、
        "SnatTableIds": {
            "SnatTableId": []
        },
        "ForwardTableIds": {
            "ForwardTableId": []
        },
        "NatGatewayId": "ngw-uf6htj15rgyp8ivix ****"
    }
  2. 次のサンプルコードは、NATゲートウェイの詳細を照会する方法を示しています。
    aliyunsdkcore.clientインポートからAcsClient
    からaliyunsdkcore.acs_exception.exceptions import ClientException
    aliyunsdkcore.acs_exception.exceptionsからServerExceptionをインポート
    aliyunsdkvpc.request.v20160428.DescribeNatGatewaysRequest import DescribeNatGatewaysRequestから
    
    # AcsClientインスタンスを作成します。
    # yourAccessKeyId: AccessKey ID。
    # yourAccessKeySecret: AccessKeyシークレット。
    # yourRegionId: リージョンID。
    client = AcsClient("yourAccessKeyId","yourAccessKeySecret","yourRegionId")
    
    # NATゲートウェイの詳細を照会します。
    request = DescribeNatGatewaysRequest()
    request.set_accept_format('json')
    
    # 照会するNATゲートウェイのID。
    request.set_NatGatewayId("ngw-uf6htj15rgyp8ivix ****")
    
    # APIリクエストを作成してレスポンスを印刷します。
    response = client.do_action_with_exception (リクエスト)
    
    # python2: プリント (レスポンス)
    print(str(response, encoding='utf-8 '))
    コマンド出力:
    {
        "TotalCount":1、
        "RequestId": "4040A37C-45C0-4C85-B16D-0F7EA3084108" 、
        "PageSize":10、
        "PageNumber":1、
        "NatGateways": {
            "NatGateway": [{
                "ステータス": "利用可能" 、
                "Description": "test" 、
                "ResourceGroupId": "rg-acfmx2k5un ****" 、
                "InstanceChargeType": "PrePaid" 、
                "ForwardTableIds": {
                    "ForwardTableId": ["ftb-uf6hdobgppflyr2ng ****"]
                },
                "IpLists": {
                    "IpList": []
                },
                "BandwidthPackageIds": {
                    "BandwidthPackageId": []
                },
                "AutoPay": false、
                "DeletionProtection": false,
                "BusinessStatus": "Normal" 、
                "NatType": "Enhanced" 、
                "Name": "test",
                "InternetChargeType": "PayBySpec" 、
                "NatGatewayPrivateInfo": {
                    "IzNo": "" 、
                    "PrivateIpAddress": "" 、
                    "EniInstanceId": "" 、
                    "VswitchId": "
                },
                "EcsMetricEnabled": false、
                "VpcId": "vpc-uf68wppzf839896z7 ****" 、
                "SnatTableIds": {
                    "SnatTableId": ["stb-uf6qneg0l83lxignc ****"]
                },
                "ExpiredTime": "2020-10-28T16:00Z" 、
                "CreationTime": "2020-09-28T07:24:09Z" 、
                "RegionId": "cn-shanghai",
                "スペック": "小さい" 、
                "NatGatewayId": "ngw-uf6htj15rgyp8ivix ****"
            }]
        }
    }

ステップ2: EIPをNATゲートウェイに関連付ける

NATゲートウェイは、EIPに関連付けられた後にのみ、期待どおりに機能します。

次のサンプルコードは、EIPをNATゲートウェイに関連付ける方法を示しています。
aliyunsdkcore.clientインポートからAcsClient
からaliyunsdkcore.acs_exception.exceptions import ClientException
aliyunsdkcore.acs_exception.exceptionsからServerExceptionをインポート
aliyunsdkvpc.request.v20160428.AssociateEipAddressRequestインポートAssociateEipAddressRequestから

# NATゲートウェイに関連付けるEIPのID。 この例では、EIP1とEIP2のIDが指定されています。
allocationIds = ["eip-uf6pvlaprugu1azc8 ****", "eip-uf69ls0f3qgv0alk6 ****"]

# AcsClientインスタンスを作成します。
# yourAccessKeyId: AccessKey ID。
# yourAccessKeySecret: AccessKeyシークレット。
# yourRegionId: リージョンID。
client = AcsClient("yourAccessKeyId","yourAccessKeySecret","yourRegionId")

# Associate the EIPs with the NAT gateway.
範囲内のi (0、2) の場合:
    request = AssociateEipAddressRequest()
    リクエスト .set_accept_format( 'JSON')

    # EIPを関連付けるNATゲートウェイのID。
    request.set_InstanceId("ngw-uf6htj15rgyp8ivix ****")

    # NATゲートウェイに関連付けるEIPのID。
    request.set_AllocationId(allocationIds[i])

    # EIPを関連付けるリソースのタイプ。
    request.set_InstanceType("NAT")
    
    # APIリクエストを作成してレスポンスを印刷します。
    response = client.do_action_with_exception(request)

    # python2: プリント (レスポンス)
    print(str(response, encoding='utf-8 '))
コマンド出力:
{
    "RequestId": "8292A46D-F720-4AEE-98FB-7D3352BA2B63"
}
{
    "RequestId": "E62EEBF8-D327-440E-95BC-8884832C1326"
}

ステップ3: DNATエントリの作成

DNATエントリは、NATゲートウェイのEIPをECSインスタンスのプライベートIPアドレスにマッピングします。 これにより、ECSインスタンスはインターネット接続サービスを提供できます。 ECS 1およびECS 2に対して、次の表に記載されているDNATエントリを設定します。
エントリ名 EIP 外部ポート プロトコルタイプ プライベート IP アドレス 内部ポート
DNAT1 EIP1 80 TCP ECS1 80
DNAT2 EIP2 80 TCP ECS2 80
  1. 次のサンプルコードは、ECS 1のDNATエントリを作成する方法を示しています。
    aliyunsdkcore.clientインポートからAcsClient
    からaliyunsdkcore.acs_exception.exceptions import ClientException
    aliyunsdkcore.acs_exception.exceptionsからServerExceptionをインポート
    aliyunsdkvpc.request. v20160428.からCreateForwardEntryRequestインポートCreateForwardEntryRequest
    
    # AcsClientインスタンスを作成します。
    # yourAccessKeyId: AccessKey ID。
    # yourAccessKeySecret: AccessKeyシークレット。
    # yourRegionId: リージョンID。
    client = AcsClient("yourAccessKeyId","yourAccessKeySecret","yourRegionId")
    
    # DNATエントリを作成します。
    request = CreateForwardEntryRequest()
    request.set_accept_format('json')
    
    # DNATエントリを追加するDNATテーブルのID。
    request.set_ForwardTableId("ftb-uf6hdobgppflyr2ng ****")
    
    # インターネットとの通信に使用されるEIPを指定します。 この例では、EIP 1のIPアドレスが指定されています。
    request.set_ExternalIp("101.xx. xx.137")
    
    # ポート転送で使用される外部ポート。 有効な値: -1 から 65535 この例では、このパラメーターは80に設定されています。
    request.set_ExternalPort("80")
    
    # インターネットからリクエストを受信するECSインスタンスのプライベートIPアドレスを指定します。 この例では、このパラメーターはECS 1のプライベートIPアドレスに設定されています。
    request.set_InternalIp("192.xx. xx.100")
    
    # ポート転送で使用される内部ポート。 有効な値: -1 から 65535 この例では、このパラメーターは80に設定されています。
    request.set_InternalPort("80")
    
    # ポートによって使用されるプロトコル。
    # 有効な値: TCP、UDP、およびAny。 TCP: TCPパケットのみが転送されます。 UDP: UDPパケットのみが転送されます。 Any: すべてのパケットが転送されます。
    request.set_IpProtocol("TCP")
    
    # DNATエントリの名前。 この例では、名前はDNAT1に設定されます。
    request.set_ForwardEntryName("DNAT1")
    
    # APIリクエストを作成してレスポンスを印刷します。
    response = client.do_action_with_exception (リクエスト)
    
    # python2: プリント (レスポンス)
    print(str(response, encoding='utf-8 '))
    コマンド出力:
    {
        "RequestId": "93A6E13E-C168-4444-9DF1-F4B22B1E0A12" 、
        "ForwardEntryId": "fwd-uf69gp4nyj8b9aa2n ****"
    }
  2. 次のサンプルコードは、ECS 2のDNATエントリを作成する方法を示しています。
    aliyunsdkcore.clientインポートからAcsClient
    からaliyunsdkcore.acs_exception.exceptions import ClientException
    aliyunsdkcore.acs_exception.exceptionsからServerExceptionをインポート
    aliyunsdkvpc.request. v20160428.からCreateForwardEntryRequestインポートCreateForwardEntryRequest
    
    # AcsClientインスタンスを作成します。
    # yourAccessKeyId: AccessKey ID。
    # yourAccessKeySecret: AccessKeyシークレット。
    # yourRegionId: リージョンID。
    client = AcsClient("yourAccessKeyId","yourAccessKeySecret","yourRegionId")
    
    # DNATエントリを作成します。
    request = CreateForwardEntryRequest()
    request.set_accept_format('json')
    
    # DNATエントリを追加するDNATテーブルのID。
    request.set_ForwardTableId("ftb-uf6hdobgppflyr2ng ****")
    
    # インターネットとの通信に使用されるEIPを指定します。 この例では、EIP 2のIPアドレスが指定されています。
    request.set_ExternalIp("106.xx. xx.94")
    
    # ポート転送で使用される外部ポート。 有効な値: -1 から 65535 この例では、このパラメーターは80に設定されています。
    request.set_ExternalPort("80")
    
    # インターネットからリクエストを受信するECSインスタンスのプライベートIPアドレスを指定します。 この例では、このパラメーターはECS 2のプライベートIPアドレスに設定されています。
    request.set_InternalIp("192.xx. xx.101")
    
    # ポート転送で使用される内部ポート。 有効な値: -1 から 65535 この例では、このパラメーターは80に設定されています。
    request.set_InternalPort("80")
    
    # ポートによって使用されるプロトコル。
    # 有効な値: TCP、UDP、およびAny。 TCP: TCPパケットのみが転送されます。 UDP: UDPパケットのみが転送されます。 Any: すべてのパケットが転送されます。
    request.set_IpProtocol("TCP")
    
    # DNATエントリの名前。 この例では、名前はDNAT2に設定されます。
    request.set_ForwardEntryName("DNAT2")
    
    # APIリクエストを作成してレスポンスを印刷します。
    response = client.do_action_with_exception (リクエスト)
    
    # python2: プリント (レスポンス)
    print(str(response, encoding='utf-8 '))
    コマンド出力:
    {
        "RequestId": "EB455CB3-222E-4F62-AF20-FAF908615717" 、
        "ForwardEntryId": "fwd-uf6g8gu2ld36nohly ****"
    }

ステップ4: EIP帯域幅プランの作成

EIP帯域幅プランは、地域規模での帯域幅共有と多重化をサポートします。 EIP帯域幅プランを使用して、帯域幅リソースコストを削減できます。

次のサンプルコードは、EIP帯域幅プランを作成する方法を示しています。

aliyunsdkcore.clientインポートからAcsClient
からaliyunsdkcore.acs_exception.exceptions import ClientException
aliyunsdkcore.acs_exception.exceptionsからServerExceptionをインポート
aliyunsdkvpc.request.v20160428.CreateCommonBandwidthPackageRequest import CreateCommonBandwidthPackageRequestから

# AcsClientインスタンスを作成します。
# yourAccessKeyId: AccessKey ID。
# yourAccessKeySecret: AccessKeyシークレット。
# yourRegionId: リージョンID。
client = AcsClient("yourAccessKeyId","yourAccessKeySecret","yourRegionId")

# EIP帯域幅プランを作成します。
request = CreateCommonBandwidthPackageRequest()
request.set_accept_format('json')

# EIP帯域幅プランの最大帯域幅を指定します。 有効な値: 1000〜5000。 単位:Mbit/秒。 この例では、このパラメーターは1500に設定されています。 ビジネス要件に基づいてパラメーターを設定できます。
request.set_Bandwidth(1500)

# 接続タイプ。
# 有効値: BGPおよびBGP_PRO。 BGP: BGP (マルチISP) 。 BGP_PRO: BGP (マルチISP) プロ。
request.set_ISP("BGP")

# EIP帯域幅プランの名前。
request.set_Name("test")

# EIP帯域幅プランの説明。
request.set_Description("test")

# EIP帯域幅プランの計測方法。
# 有効な値: PayByBandwidthとPayBy95。 PayByBandwidth: EIP帯域幅プランは、帯域幅使用量に基づいて課金されます。 PayBy95: EIP帯域幅プランは、拡張95パーセンタイル帯域幅に基づいて課金されます。 デフォルト値: PayByBandwidth。
request.set_InternetChargeType("PayByBandwidth")

# APIリクエストを作成してレスポンスを印刷します。
response = client.do_action_with_exception (リクエスト)

# python2: プリント (レスポンス)
print(str(response, encoding='utf-8 '))
コマンド出力:
{
    "RequestId": "592C8AB6-09AC-4751-9B17-231BF8FEEA44" 、
    "ResourceGroupId": "rg-acfmx2k5unk ****" 、
    "BandwidthPackageId": "cbwp-uf6jvfp1wqps1vywa ****"
}

ステップ5: EIPをEIP帯域幅プランに関連付ける

EIP 1とEIP 2をEIP帯域幅プランに関連付けることができます。 EIPがEIP帯域幅プランに関連付けられた後:
  • EIPが関連付けられているNATゲートウェイにアタッチされたサービスは、EIP帯域幅プランの帯域幅を共有します。
  • EIPの以前の最大帯域幅が無効です。 EIPの最大帯域幅の合計は、EIP帯域幅プランの最大帯域幅に等しくなります。
  • EIPの以前の課金方法が無効になります。 EIPはパブリックIPアドレスとして機能します。 データ転送と帯域幅の使用はEIPに対して課金されません。
次のサンプルコードは、EIP 1およびEIP 2をEIP帯域幅プランに関連付ける方法を示しています。
aliyunsdkcore.clientインポートからAcsClient
からaliyunsdkcore.acs_exception.exceptions import ClientException
aliyunsdkcore.acs_exception.exceptionsからServerExceptionをインポート
aliyunsdkvpc.request.v20160428.AddCommonBandwidthPackageIpRequest importからAddCommonBandwidthPackageIpRequest

# EIP帯域幅プランに関連付けるEIPを指定します。 この例では、EIP 1とEIP 2が指定されています。
IpInstanceIds = ["eip-uf6pvlaprugu1azc8 ****" 、"eip-uf69ls0f3qgv0alk6 ****"]

# AcsClientインスタンスを作成します。
# yourAccessKeyId: AccessKey ID。
# yourAccessKeySecret: AccessKeyシークレット。
# yourRegionId: リージョンID。
client = AcsClient("yourAccessKeyId","yourAccessKeySecret","yourRegionId")

範囲内のi (0、2) の場合:
    # EIPをEIP帯域幅プランに関連付けます。
    request = AddCommonBandwidthPackageIpRequest()
    リクエスト .set_accept_format( 'JSON')
    
    # EIP帯域幅プランのID。
    request.set_BandwidthPackageId("cbwp-uf6jvfp1wqps1vywa ****")

    # EIP帯域幅プランに関連付けるEIP。
    request.set_IpInstanceId(IpInstanceIds[i])

    # APIリクエストを作成してレスポンスを印刷します。
    response = client.do_action_with_exception(request)

    # python2: プリント (レスポンス)
    print(str(response, encoding='utf-8 '))
                
コマンド出力:
{
    "RequestId": "658D8E3C-A85E-406C-AE49-EE6ECA2B9252"
}
{
    "RequestId": "166E9BF2-C12B-45B6-A712-633AD535B446"
}

ステップ6: ネットワーク接続を確認する

コンピューターを使用して、インターネット経由でECS 1およびECS 2上のアプリケーションにアクセスすることで、ネットワーク接続をテストできます。
説明 ECSインスタンスのセキュリティグループルールにより、ECSインスタンスがインターネットからのリクエストを受信できるようにします。
  1. インターネットにアクセスできるコンピューターでブラウザーを開きます。
  2. NATゲートウェイに関連付けられているEIPの1つをブラウザのアドレスバーに入力し、ECSインスタンスで実行されるアプリケーションにアクセスします。
    結果は、コンピューターがインターネット経由でECS 1およびECS 2上のアプリケーションにアクセスできることを示しています。 さらに、ECSインスタンスはEIP帯域幅プランの帯域幅を共有し、トラフィックスパイクに対処できます。
    図 1. ECS 1上のアプリケーションへのアクセス
    ECS 1へのネットワーク接続を確認する
    図 2. ECS 2上のアプリケーションへのアクセス
    ECS 2へのネットワーク接続を確認する