在 Amazon EC2 中使用弹性 IP 地址 - 适用于 C++ 的 AWS SDK

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

在 Amazon EC2 中使用弹性 IP 地址

先决条件

在开始之前,建议您先阅读开始使用适用于 C++ 的 AWS SDK

下载示例代码并按代码示例入门中所述构建解决方案。

要运行这些示例,您的代码用于发出请求的用户配置文件必须在 AWS 中具有适当的权限(用于服务和操作)。有关更多信息,请参阅提供 AWS 凭证

分配弹性 IP 地址

要使用弹性 IP 地址,您应首先向您的账户分配这样一个地址,然后将其与您的实例或网络接口关联。

要分配弹性 IP 地址,请使用包含网络类型(经典 EC2 或 VPC)的 AllocateAddressRequest 对象调用 EC2Client 的 AllocateAddress 函数。

警告

我们将于 2022 年 8 月 15 日停用 EC2-Classic。我们建议您从 EC2-Classic 迁移到 VPC。有关更多信息,请参阅适用于 Linux 实例的 Amazon EC2 用户指南适用于 Windows 实例的 Amazon EC2 用户指南中的从 EC2-Classic 迁移到 VPC。另请参阅 EC2-Classic Networking is Retiring – Here's How to Prepare 博客文章。

响应对象中的 AllocateAddressResponse 类包含一个分配 ID,您可以通过调用 EC2Client 的 AssociateAddress 函数并在 AssociateAddressRequest 中传入该分配 ID 和实例 ID,来将这个地址与一个实例相关联。

包含

#include <aws/ec2/EC2Client.h> #include <aws/ec2/model/AllocateAddressRequest.h> #include <aws/ec2/model/AssociateAddressRequest.h> #include <iostream>

代码

Aws::EC2::EC2Client ec2Client(clientConfiguration); Aws::EC2::Model::AllocateAddressRequest request; request.SetDomain(Aws::EC2::Model::DomainType::vpc); const Aws::EC2::Model::AllocateAddressOutcome outcome = ec2Client.AllocateAddress(request); if (!outcome.IsSuccess()) { std::cerr << "Failed to allocate Elastic IP address:" << outcome.GetError().GetMessage() << std::endl; return false; } const Aws::EC2::Model::AllocateAddressResponse &response = outcome.GetResult(); allocationID = response.GetAllocationId(); publicIPAddress = response.GetPublicIp(); Aws::EC2::Model::AssociateAddressRequest associate_request; associate_request.SetInstanceId(instanceId); associate_request.SetAllocationId(allocationID); const Aws::EC2::Model::AssociateAddressOutcome associate_outcome = ec2Client.AssociateAddress(associate_request); if (!associate_outcome.IsSuccess()) { std::cerr << "Failed to associate Elastic IP address " << allocationID << " with instance " << instanceId << ":" << associate_outcome.GetError().GetMessage() << std::endl; return false; } std::cout << "Successfully associated Elastic IP address " << allocationID << " with instance " << instanceId << std::endl;

请参阅完整示例

描述弹性 IP 地址

要列出分配到您的账户的弹性 IP 地址,请调用 EC2Client 的 DescribeAddresses 函数。它会返回一个结果对象,其中包含 DescribeAddressesResponse。您可以使用该对象获取一个 Address 对象列表,这些对象代表您账户中的弹性 IP 地址。

包含

#include <aws/ec2/EC2Client.h> #include <aws/ec2/model/DescribeAddressesRequest.h> #include <aws/ec2/model/DescribeAddressesResponse.h> #include <iomanip> #include <iostream>

代码

Aws::EC2::EC2Client ec2Client(clientConfiguration); Aws::EC2::Model::DescribeAddressesRequest request; Aws::EC2::Model::DescribeAddressesOutcome outcome = ec2Client.DescribeAddresses(request); if (outcome.IsSuccess()) { std::cout << std::left << std::setw(20) << "InstanceId" << std::setw(15) << "Public IP" << std::setw(10) << "Domain" << std::setw(30) << "Allocation ID" << std::setw(25) << "NIC ID" << std::endl; const Aws::Vector<Aws::EC2::Model::Address> &addresses = outcome.GetResult().GetAddresses(); for (const auto &address: addresses) { Aws::String domainString = Aws::EC2::Model::DomainTypeMapper::GetNameForDomainType( address.GetDomain()); std::cout << std::left << std::setw(20) << address.GetInstanceId() << std::setw(15) << address.GetPublicIp() << std::setw(10) << domainString << std::setw(30) << address.GetAllocationId() << std::setw(25) << address.GetNetworkInterfaceId() << std::endl; } } else { std::cerr << "Failed to describe Elastic IP addresses:" << outcome.GetError().GetMessage() << std::endl; }

请参阅完整示例

释放弹性 IP 地址

要释放弹性 IP 地址,请调用 EC2Client 的 ReleaseAddress 函数,向其传递 ReleaseAddressRequest,其中包含您要释放的弹性 IP 地址的分配 ID。

包含

#include <aws/ec2/EC2Client.h> #include <aws/ec2/model/ReleaseAddressRequest.h> #include <iostream>

代码

Aws::EC2::EC2Client ec2(clientConfiguration); Aws::EC2::Model::ReleaseAddressRequest request; request.SetAllocationId(allocationID); Aws::EC2::Model::ReleaseAddressOutcome outcome = ec2.ReleaseAddress(request); if (!outcome.IsSuccess()) { std::cerr << "Failed to release Elastic IP address " << allocationID << ":" << outcome.GetError().GetMessage() << std::endl; } else { std::cout << "Successfully released Elastic IP address " << allocationID << std::endl; }

在释放弹性 IP 地址后,它将回到 AWS IP 地址池,您此后可能不能再使用该地址。请务必更新您的 DNS 记录和通过该地址进行通信的任何服务器或设备。如果您尝试释放已释放的弹性 IP 地址,且该地址已分配到另一个 AWS 账户,您会收到 AuthFailure 错误。

如果您使用的是默认 VPC,则释放弹性 IP 地址会自动断开该地址与任何实例的关联。要在不释放的情况下取消关联弹性 IP 地址,请使用 EC2Client 的 DisassociateAddress 函数。

如果您使用的是非默认 VPC,则必须使用 DisassociateAddress 取消弹性 IP 地址的关联,然后再尝试释放它。否则,Amazon EC2 会返回错误(InvalidIPAddress.InUse)。

请参阅完整示例

更多信息