このトピックでは、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アドレスを照会できます。
ステップ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 |
ステップ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インスタンスがインターネットからのリクエストを受信できるようにします。