このトピックでは、Alibaba Cloud SDK for Pythonを介してAPI操作を呼び出して、複数のアプリケーションがインターネット共有帯域幅の帯域幅を共有できるようにする方法について説明します。 これにより、データ出力コストが削減されます。
シナリオ
会社は2つのECS (Elastic Compute Service) インスタンスを作成し、各ECSインスタンスにアプリケーションをデプロイします。 ECSインスタンスは、インターネットからリクエストを受信する必要があります。 サービスポートはポート80です。 2つのECSインスタンスに必要な帯域幅は、1日以内に異なります。
ECS 1のピーク時間は13:00:00から18:00:00の範囲です。 この期間中、必要な帯域幅は1,000 Mbit/sである。 1日の残りの時間の間、必要な帯域幅は500 Mbit/sです。
ECS 2のピーク時間は19:00:00から23:00:00の範囲です。 この期間中、必要な帯域幅は1,000 Mbit/sである。 1日の残りの時間の間、必要な帯域幅は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を指定できます。
ListEnhenhcedNatGatewayAvailableZonesを呼び出して拡張NATゲートウェイをサポートするゾーンを照会し、DescribeVSwitchを呼び出してvSwitchのアイドルIPアドレスを照会できます。
次のサンプルコードは、NATゲートウェイの作成方法を示しています。
from alibabacloud_credentials.client import Client as CredClient from aliyunsdkcore.client import AcsClient from aliyunsdkcore.acs_exception.exceptions import ClientException from aliyunsdkcore.acs_exception.exceptions import ServerException from aliyunsdkvpc.request.v20160428.CreateNatGatewayRequest import CreateNatGatewayRequest # Security risks may arise if you use the AccessKey pair of an Alibaba Cloud account because the account has permissions on all API operations. We recommend that you use a RAM user to call API operations or perform routine O&M. # We do not recommend that you save the AccessKey ID and AccessKey secret in your project code. Otherwise, the AccessKey pair may be leaked and the security of your resources may be compromised. # In this example, the AccessKey pair is obtained by using the Alibaba Cloud Credentials tool to authenticate API access. cred = CredClient() access_key_id = cred.get_access_key_id() access_key_secret = cred.get_access_key_secret() # Create an AcsClient instance. client = AcsClient(access_key_id, access_key_secret, '<your-region-id>') # Create a NAT gateway. request = CreateNatGatewayRequest() request.set_accept_format('json') # The ID of the VPC where the NAT gateway is deployed. request.set_VpcId("vpc-bp1fu6qir3kh9017q****") # The name of the NAT gateway. request.set_Name("test") # The description of the NAT gateway. request.set_Description("test") # The billing method of the NAT gateway. # Set the value to PostPaid. This is the default value. request.set_InstanceChargeType("PostPaid") # The ID of the vSwitch to which the NAT gateway is attached. # When you create an enhanced NAT gateway, you must specify a vSwitch. The system automatically assigns an idle private IP address from the vSwitch to the enhanced NAT gateway. request.set_VSwitchId("vsw-bp1nz9748zh312m37****") # The type of the NAT gateway. # Valid values: Normal and Enhanced. Normal: indicates a standard NAT gateway. Enhanced: indicates an enhanced NAT gateway. # Enhanced NAT gateways are an upgrade from standard NAT gateways and use a more advanced architecture. Compared with standard NAT gateways, enhanced NAT gateways offer higher elasticity and stability. This improves how you can manage data transfer. request.set_NatType("Enhanced") # The metering method of the NAT gateway. # Set the value to PayByLcu, which indicates the pay-by-LCU metering method. request.set_InternetChargeType("PayByLcu") # Make an API request and print the response. response = client.do_action_with_exception(request) # python2: print(response) print(str(response, encoding='utf-8'))
コマンド出力:
{ "RequestId":"8859BB3B-47F5-*****************", "SnatTableIds":{ "SnatTableId":[ "stb-bp1d09opt**********" ] }, "ForwardTableIds":{ "ForwardTableId":[ "ftb-bp1h*************" ] }, "BandwidthPackageIds":{ "BandwidthPackageId":[] }, "NatGatewayId":""ngw-uf6htj15rgyp8ivix****"" }
次のサンプルコードは、NATゲートウェイの詳細を照会する方法を示しています。
from alibabacloud_credentials.client import Client as CredClient from aliyunsdkcore.client import AcsClient from aliyunsdkcore.acs_exception.exceptions import ClientException from aliyunsdkcore.acs_exception.exceptions import ServerException from aliyunsdkvpc.request.v20160428.DescribeNatGatewaysRequest import DescribeNatGatewaysRequest # Security risks may arise if you use the AccessKey pair of an Alibaba Cloud account because the account has permissions on all API operations. We recommend that you use a RAM user to call API operations or perform routine O&M. # We do not recommend that you save the AccessKey ID and AccessKey secret in your project code. Otherwise, the AccessKey pair may be leaked and the security of your resources may be compromised. # In this example, the AccessKey pair is obtained by using the Alibaba Cloud Credentials tool to authenticate API access. cred = CredClient() access_key_id = cred.get_access_key_id() access_key_secret = cred.get_access_key_secret() # Create an AcsClient instance. client = AcsClient(access_key_id, access_key_secret, '<your-region-id>') # Query the details of the NAT gateway. request = DescribeNatGatewaysRequest() request.set_accept_format('json') # The ID of the NAT gateway that you want to query. request.set_NatGatewayId("ngw-uf6htj15rgyp8ivix****") # Make an API request and print the response. response = client.do_action_with_exception(request) # python2: print(response) print(str(response, encoding='utf-8'))
コマンド出力:
{ "TotalCount":1, "PageSize":10, "RequestId":"6928DB33-84E0-**************", "PageNumber":1, "NatGateways":{ "NatGateway":[ { "Description":"test", "ResourceGroupId":"rg-acfmyxp******", "InstanceChargeType":"PostPaid", "EipBindMode":"MULTI_BINDED", "FullNatTableIds":{ "FullNatTableId":[] }, "BandwidthPackageIds":{ "BandwidthPackageId":[] }, "BusinessStatus":"Normal", "Name":"test", "NetworkType":"internet", "ExpiredTime":"", "Tags":{ "Tag":[] }, "Status":"Available", "ForwardTableIds":{ "ForwardTableId":[ "ftb-bp1h*************" ] }, "SecurityProtectionEnabled":false, "IpLists":{ "IpList":[] }, "AutoPay":false, "DeletionProtection":false, "NatType":"Enhanced", "InternetChargeType":"PayByLcu", "NatGatewayPrivateInfo":{ "MaxSessionEstablishRate":100000, "IzNo":"cn-hangzhou-g", "PrivateIpAddress":"10.4.0.57", "MaxSessionQuota":2000000, "MaxBandwidth":5120, "EniInstanceId":"eni-bp19ray**********", "EniType":"", "VswitchId":"vsw-bp1nz97***********" }, "EcsMetricEnabled":false, "VpcId":"vpc-bp1fu6***********", "SnatTableIds":{ "SnatTableId":[ "stb-bp1d09opt**********" ] }, "CreationTime":"2023-02-10T07:07:03Z", "IcmpReplyEnabled":true, "RegionId":"cn-hangzhou", "Spec":"", "NatGatewayId":""ngw-uf6htj15rgyp8ivix****"" } ] }
ステップ2: EIPをNATゲートウェイに関連付ける
NATゲートウェイは、EIPに関連付けられた後にのみ、期待どおりに機能します。
次のサンプルコードは、EIPをNATゲートウェイに関連付ける方法を示しています。
from alibabacloud_credentials.client import Client as CredClient
from aliyunsdkcore.client import AcsClient
from aliyunsdkcore.acs_exception.exceptions import ClientException
from aliyunsdkcore.acs_exception.exceptions import ServerException
from aliyunsdkvpc.request.v20160428.AssociateEipAddressRequest import AssociateEipAddressRequest
# The IDs of the EIPs that you want to associate with the NAT gateway. In this example, the IDs of EIP 1 and EIP 2 are specified.
allocationIds = ["eip-uf6pvlaprugu1azc8****", "eip-uf69ls0f3qgv0alk6****"]
# Security risks may arise if you use the AccessKey pair of an Alibaba Cloud account because the account has permissions on all API operations. We recommend that you use a RAM user to call API operations or perform routine O&M.
# We do not recommend that you save the AccessKey ID and AccessKey secret in your project code. Otherwise, the AccessKey pair may be leaked and the security of your resources may be compromised.
# In this example, the AccessKey pair is obtained by using the Alibaba Cloud Credentials tool to authenticate API access.
cred = CredClient()
access_key_id = cred.get_access_key_id()
access_key_secret = cred.get_access_key_secret()
# Create an AcsClient instance.
client = AcsClient(access_key_id, access_key_secret, '<your-region-id>')
# Associate the EIPs with the NAT gateway.
for i in range(0, 2):
request = AssociateEipAddressRequest()
request.set_accept_format('json')
# The ID of the NAT gateway with which you want to associate the EIPs.
request.set_InstanceId("ngw-uf6htj15rgyp8ivix****")
# The IDs of the EIPs that you want to associate with the NAT gateway.
request.set_AllocationId(allocationIds[i])
# The type of resource with which you want to associate the EIPs.
request.set_InstanceType("NAT")
# Make an API request and print the response.
response = client.do_action_with_exception(request)
# python2: print(response)
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 |
次のサンプルコードは、ECS 1のDNATエントリを作成する方法を示しています。
from alibabacloud_credentials.client import Client as CredClient from aliyunsdkcore.client import AcsClient from aliyunsdkcore.acs_exception.exceptions import ClientException from aliyunsdkcore.acs_exception.exceptions import ServerException from aliyunsdkvpc.request.v20160428.CreateForwardEntryRequest import CreateForwardEntryRequest # Security risks may arise if you use the AccessKey pair of an Alibaba Cloud account because the account has permissions on all API operations. We recommend that you use a RAM user to call API operations or perform routine O&M. # We do not recommend that you save the AccessKey ID and AccessKey secret in your project code. Otherwise, the AccessKey pair may be leaked and the security of your resources may be compromised. # In this example, the AccessKey pair is obtained by using the Alibaba Cloud Credentials tool to authenticate API access. cred = CredClient() access_key_id = cred.get_access_key_id() access_key_secret = cred.get_access_key_secret() # Create an AcsClient instance. client = AcsClient(access_key_id, access_key_secret, '<your-region-id>') # Create a DNAT entry. request = CreateForwardEntryRequest() request.set_accept_format('json') # The ID of the DNAT table to which you want to add the DNAT entry. request.set_ForwardTableId("ftb-uf6hdobgppflyr2ng****") # Specify the EIP that is used to communicate with the Internet. In this example, the IP address of EIP 1 is specified. request.set_ExternalIp("101.xx.xx.137") # The external port that is used in port forwarding. Valid values: 1 to 65535. In this example, this parameter is set to 80. request.set_ExternalPort("80") # Specify the private IP address of the ECS instance that wants to receive requests from the Internet. In this example, this parameter is set to the private IP address of ECS 1. request.set_InternalIp("192.xx.xx.100") # The internal port that is used in port forwarding. Valid values: 1 to 65535. In this example, this parameter is set to 80. request.set_InternalPort("80") # The protocol that is used by the ports. # Valid values: TCP, UDP, and Any. TCP: Only TCP packets are forwarded. UDP: Only UDP packets are forwarded. Any: All packets are forwarded. request.set_IpProtocol("TCP") # The name of the DNAT entry. In this example, the name is set to DNAT1. request.set_ForwardEntryName("DNAT1") # Make an API request and print the response. response = client.do_action_with_exception(request) # python2: print(response) print(str(response, encoding='utf-8'))
コマンド出力:
{ "RequestId": "93A6E13E-C168-4444-9DF1-F4B22B1E0A12", "ForwardEntryId": "fwd-uf69gp4nyj8b9aa2n****" }
次のサンプルコードは、ECS 2のDNATエントリを作成する方法を示しています。
from alibabacloud_credentials.client import Client as CredClient from aliyunsdkcore.client import AcsClient from aliyunsdkcore.acs_exception.exceptions import ClientException from aliyunsdkcore.acs_exception.exceptions import ServerException from aliyunsdkvpc.request.v20160428.CreateForwardEntryRequest import CreateForwardEntryRequest # Security risks may arise if you use the AccessKey pair of an Alibaba Cloud account because the account has permissions on all API operations. We recommend that you use a RAM user to call API operations or perform routine O&M. # We do not recommend that you save the AccessKey ID and AccessKey secret in your project code. Otherwise, the AccessKey pair may be leaked and the security of your resources may be compromised. # In this example, the AccessKey pair is obtained by using the Alibaba Cloud Credentials tool to authenticate API access. cred = CredClient() access_key_id = cred.get_access_key_id() access_key_secret = cred.get_access_key_secret() # Create an AcsClient instance. client = AcsClient(access_key_id, access_key_secret, '<your-region-id>') # Create a DNAT entry. request = CreateForwardEntryRequest() request.set_accept_format('json') # The ID of the DNAT table to which you want to add the DNAT entry. request.set_ForwardTableId("ftb-uf6hdobgppflyr2ng****") # Specify the EIP that is used to communicate with the Internet. In this example, the IP address of EIP 1 is specified. request.set_ExternalIp("106.xx.xx.94") # The external port that is used in port forwarding. Valid values: 1 to 65535. In this example, this parameter is set to 80. request.set_ExternalPort("80") # Specify the private IP address of the ECS instance that wants to receive requests from the Internet. In this example, this parameter is set to the private IP address of ECS 1. request.set_InternalIp("192.xx.xx.101") # The internal port that is used in port forwarding. Valid values: 1 to 65535. In this example, this parameter is set to 80. request.set_InternalPort("80") # The protocol that is used by the ports. # Valid values: TCP, UDP, and Any. TCP: Only TCP packets are forwarded. UDP: Only UDP packets are forwarded. Any: All packets are forwarded. request.set_IpProtocol("TCP") # The name of the DNAT entry. In this example, the name is set to DNAT2. request.set_ForwardEntryName("DNAT2") # Make an API request and print the response. response = client.do_action_with_exception(request) # python2: print(response) print(str(response, encoding='utf-8'))
コマンド出力:
{ "RequestId": "EB455CB3-222E-4F62-AF20-FAF908615717", "ForwardEntryId": "fwd-uf6g8gu2ld36nohly****" }
ステップ4: インターネット共有帯域幅の作成
インターネット共有帯域幅インスタンスは、地域規模での帯域幅の共有と多重化をサポートします。 インターネット共有帯域幅インスタンスを使用して、帯域幅リソースコストを削減できます。
次のサンプルコードは、インターネット共有帯域幅を作成する方法を示しています。
from alibabacloud_credentials.client import Client as CredClient
from aliyunsdkcore.client import AcsClient
from aliyunsdkcore.acs_exception.exceptions import ClientException
from aliyunsdkcore.acs_exception.exceptions import ServerException
from aliyunsdkvpc.request.v20160428.CreateCommonBandwidthPackageRequest import CreateCommonBandwidthPackageRequest
# Security risks may arise if you use the AccessKey pair of an Alibaba Cloud account because the account has permissions on all API operations. We recommend that you use a RAM user to call API operations or perform routine O&M.
# We do not recommend that you save the AccessKey ID and AccessKey secret in your project code. Otherwise, the AccessKey pair may be leaked and the security of your resources may be compromised.
# In this example, the AccessKey pair is obtained by using the Alibaba Cloud Credentials tool to authenticate API access.
cred = CredClient()
access_key_id = cred.get_access_key_id()
access_key_secret = cred.get_access_key_secret()
# Create an AcsClient instance.
client = AcsClient(access_key_id, access_key_secret, '<your-region-id>')
# Create an EIP bandwidth plan.
request = CreateCommonBandwidthPackageRequest()
request.set_accept_format('json')
# Specify the maximum bandwidth of the EIP bandwidth plan. Valid values: 1000 to 5000. Unit: Mbit/s. In this example, this parameter is set to 1500. You can set the parameter based on your business requirements.
request.set_Bandwidth(1500)
# The connection type.
# Valid values: BGP and BGP_PRO. BGP: BGP (Multi-ISP). BGP_PRO: BGP (Multi-ISP) Pro.
request.set_ISP("BGP")
# The name of the EIP bandwidth plan.
request.set_Name("test")
# The description of the EIP bandwidth plan.
request.set_Description("test")
# The metering method of the EIP bandwidth plan.
# Valid values: PayByBandwidth and PayBy95. PayByBandwidth: The EIP bandwidth plan is charged based on bandwidth usage. PayBy95: The EIP bandwidth plan is charged based on the enhanced 95th percentile bandwidth. Default value: PayByBandwidth.
request.set_InternetChargeType("PayByBandwidth")
# Make an API request and print the response.
response = client.do_action_with_exception(request)
# python2: print(response)
print(str(response, encoding='utf-8'))
コマンド出力:
{
"RequestId": "592C8AB6-09AC-4751-9B17-231BF8FEEA44",
"ResourceGroupId": "rg-acfmx2k5unk****",
"BandwidthPackageId": "cbwp-uf6jvfp1wqps1vywa****"
}
ステップ5: EIPをインターネット共有帯域幅に関連付ける
EIP 1とEIP 2をインターネット共有帯域幅に関連付けることができます。 EIPがインターネット共有帯域幅に関連付けられた後:
EIPが関連付けられているNATゲートウェイにアタッチされたサービスは、インターネット共有帯域幅の帯域幅を共有します。
EIPの以前の最大帯域幅が無効です。 EIPの最大帯域幅の合計は、インターネット共有帯域幅の最大帯域幅に等しくなります。
EIPの以前の課金方法が無効になります。 EIPはパブリックIPアドレスとして機能します。 データ転送と帯域幅の使用はEIPに対して課金されません。
次のサンプルコードは、EIP 1とEIP 2をインターネット共有帯域幅に関連付ける方法を示しています。
from alibabacloud_credentials.client import Client as CredClient
from aliyunsdkcore.client import AcsClient
from aliyunsdkcore.acs_exception.exceptions import ClientException
from aliyunsdkcore.acs_exception.exceptions import ServerException
from aliyunsdkvpc.request.v20160428.AddCommonBandwidthPackageIpRequest import AddCommonBandwidthPackageIpRequest
# Specify the EIPs that you want to associate with the EIP bandwidth plan. In this example, EIP 1 and EIP 2 are specified.
IpInstanceIds = ["eip-uf6pvlaprugu1azc8****","eip-uf69ls0f3qgv0alk6****"]
# Security risks may arise if you use the AccessKey pair of an Alibaba Cloud account because the account has permissions on all API operations. We recommend that you use a RAM user to call API operations or perform routine O&M.
# We do not recommend that you save the AccessKey ID and AccessKey secret in your project code. Otherwise, the AccessKey pair may be leaked and the security of your resources may be compromised.
# In this example, the AccessKey pair is obtained by using the Alibaba Cloud Credentials tool to authenticate API access.
cred = CredClient()
access_key_id = cred.get_access_key_id()
access_key_secret = cred.get_access_key_secret()
# Create an AcsClient instance.
client = AcsClient(access_key_id, access_key_secret, '<your-region-id>')
for i in range(0, 2):
# Associate the EIPs with the EIP bandwidth plan.
request = AddCommonBandwidthPackageIpRequest()
request.set_accept_format('json')
# The ID of the EIP bandwidth plan.
request.set_BandwidthPackageId("cbwp-uf6jvfp1wqps1vywa****")
# The EIPs that you want to associate with the EIP bandwidth plan.
request.set_IpInstanceId(IpInstanceIds[i])
# Make an API request and print the response.
response = client.do_action_with_exception(request)
# python2: print(response)
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インスタンスがインターネットからのリクエストを受信できるようにします。
インターネットにアクセスできるコンピューターでブラウザーを開きます。
NATゲートウェイに関連付けられているEIPの1つをブラウザのアドレスバーに入力し、ECSインスタンスで実行されるアプリケーションにアクセスします。
結果は、コンピューターがインターネット経由でECS 1およびECS 2上のアプリケーションにアクセスできることを示しています。 さらに、ECSインスタンスはインターネット共有帯域幅の帯域幅を共有し、トラフィックスパイクに対処できます。