New user sign up using AWS Builder ID
New user sign up using AWS Builder ID is currently unavailable on re:Post. To sign up, please use the AWS Management Console instead.
VPC でのパブリック IPv4 の使用状況を特定、監視、最適化する方法を教えてください。
使用している Amazon Virtual Private Cloud (Amazon VPC) での IPv4 の使用状況を特定、監視、最適化したいです。
解決策
注: 2024 年 2 月 1 日より、すべてのパブリック IPv4 アドレスには、サービスにアタッチされているかどうかにかかわらず、IP アドレスにつき、1 時間あたり 0.005 USD の料金が発生します。Amazon Elastic Compute Cloud (Amazon EC2) の AWS 無料利用枠をご利用のお客様は、750 時間無料でご利用いただけます。この無料利用は、パブリック IPv4 アドレスで Amazon EC2 インスタンスを起動する場合に使用できます。
IPv4 の使用状況を特定、監視、最適化するには、次の手順を実行してください。
Public IP Insights を有効にする
Public IP Insights を使用すると、AWS リージョンのサービスで現在無料で使用しているパブリック IPv4 アドレスを確認できます。Public IP Insights を使用して、パブリックIPv4アドレスの使用状況を監視、分析、監査します。
Public IP Insights を確認するには、無料利用枠で IPAM を作成します。Public IP Insights を設定すると、Amazon VPC IP Address Manager からもアクセスできるようになります。
注: IPAM プールを作成した後、Public IP Insights がパブリック IPv4 アドレスに関連するレポートを表示するまでに時間がかかる場合があります。
コストと使用状況レポートを有効にする
AWS のコストと使用状況レポート (CUR) には、使用中または使用されていないパブリック IPv4 アドレスに関連する使用状況データが含まれます。CUR を作成するときに、[リソース ID を含める] を選択すると、より詳細なリソースレベルの分析を取得できます。CUR を作成すると、1 日に 1 回以上の頻度で、AWS が月初来のデータを含むレポートファイルを更新します。これにより、過去の IPv4 使用状況データを分析できます。Amazon Simple Storage Service (Amazon S3) バケットからレポートにアクセスすることもできます。
注: AWS が Amazon S3 バケットにレポートを配信するまでに最大 24 時間かかることがあります。
パブリックIPv4アドレスをすぐに識別する
注: パブリック IPv4 アドレスの使用状況を計画的に分析するには、CUR と Public IP Insights を使用するのがベストプラクティスです。
パブリック IPv4 アドレスを使用するサービスをすぐに特定するには、AWS マネジメントコンソールまたは AWS CLI を使用します。
AWS マネジメントコンソール
ネットワークインターフェイスを分析して、パブリック IPv4 アドレスを使用するサービスを確認するには、次の手順を実行します。
- Amazon EC2 コンソールを開き、[ネットワークインターフェイス] を選択します。
- フィルターを使用してパブリック IPv4 アドレスを選択します。値には、<*> を入力します。このフィルターは、プライマリパブリック IPv4 アドレスを使用するすべてのエラスティックネットワークインターフェイスを識別します。
- エラスティックネットワークインターフェイスの説明とインターフェイスタイプを参考に、パブリック IPv4 アドレスを使用するサービスを識別します。
- リージョン内のエラスティックネットワークインターフェイスを持つすべてのパブリック IP アドレスとセカンダリ IP アドレスを表示するには、次のコマンドを実行します。
注: example-region は、必要なリージョンに置き換えます。aws ec2 describe-network-interfaces --region example-region --query 'NetworkInterfaces[*].PrivateIpAddresses[?Association.PublicIp].Association.PublicIp[]' --output table
サイト間 VPN が使用するパブリック IPv4 アドレスについては、「VPN トンネルの現在の状態を確認する方法を教えてください」を参照してください。
標準およびカスタムのグローバルアクセラレータが使用するパブリック IPv4 アドレスについては、「アクセラレータを確認する」を参照してください。
アイドル状態または関連する Elastic IP アドレスを確認するには、次の手順を実行します。
- Amazon EC2 コンソールを開きます。
- ナビゲーションペインで [ネットワークとセキュリティ] を選択してから、[Elastic IP] を選択すると、Elastic IP アドレスを確認できます。
- Elastic IP アドレスを使用するリソースを確認するには、まず Elastic IP アドレスを選択します。次に、[ネットワークインターフェイス] または [インスタンス] フィールドで詳細を確認します。
注: BYOIP には料金が発生しません。AWS Global Accelerator は、us-west-2 で請求されます。
AWS CLI
注: AWS コマンドラインインターフェイス (AWS CLI) コマンドの実行中にエラーが発生した場合は、「AWS CLI エラーのトラブルシューティング」を参照してください。また、AWS CLI の最新バージョンを使用していることを確認してください。
始める前に、次のことを完了させてください。
- AWS CLI の最新バージョンをインストールまたは更新します。
- aws configure を実行して認証情報を設定します。
- Boto3 をインストールします。
次の手順を実行します。
注: 次のステップは、AWS CloudShell または任意の Linux 環境から実行できます。
-
次のファイルを作成します。
touch public_ipv4_recon.py
-
ファイルを編集します。
vim public_ipv4_recon.py
-
次のコードをコピーしてファイルに貼り付け、ファイルを保存します。
#!/usr/bin/env python3 import pprint import boto3, sys profile = boto3.Session(profile_name=sys.argv[1]) aga = profile.client('globalaccelerator', region_name='us-west-2') ec2 = boto3.client('ec2') def global_public_ipv4_lookup(aga): try: # global accelerator next_token = None while True: if next_token: resource = aga.list_accelerators( NextToken = next_token ) else: resource = aga.list_accelerators( ) print('Describing world wide Global Accelerators...') print('Note: AWS Global Accelerators are billed in us-west-2....') print(f'Number of AGA: {len(resource["Accelerators"])}') print('-'*40) for item in resource["Accelerators"]: print(f'Name: {item["Name"]}') if 'IpSets' in item.keys(): for ip in item["IpSets"][0]["IpAddresses"]: print(f'Public IPv4: {ip}') print(f'Status: {item["Status"]}') print() next_token = resource.get("NextToken") if next_token is None: break print() # custom_routing_accelerators next_token = None while True: if next_token: custom_routing = aga.list_custom_routing_accelerators( NextToken = next_token ) else: custom_routing = aga.list_custom_routing_accelerators( ) print('Describing world wide Custom Routing Accelerators...') print('Note: AWS Global Accelerators are billed in us-west-2....') print(f'Number of custom AGA: {len(custom_routing["Accelerators"])}') print('-'*40) for item in custom_routing["Accelerators"]: if 'IpSets' in item.keys(): for ip in item["IpSets"][0]["IpAddresses"]: print(f'Public IPv4: {ip}') print(f'Status: {item["Status"]}') print() next_token = custom_routing.get("NextToken") if next_token is None: break print() except Exception as err: print(f'Error found: {err}...') pass def public_ipv4_lookup(ec2): try: # vpn next_token = None while True: if next_token: vpn = ec2.describe_vpn_connections( NextToken = next_token ) else: vpn = ec2.describe_vpn_connections( ) print('Describing VPNs...') print(f'Number of Vpn connections: {len(vpn["VpnConnections"])}') print('-'*40) for item in vpn["VpnConnections"]: if 'VpnConnectionId' in item.keys(): print(f'Vpn Id: {item["VpnConnectionId"]}') for ip in item["VgwTelemetry"]: print(f'Public ipv4: {ip["OutsideIpAddress"]}') print() next_token = vpn.get("NextToken") if next_token is None: break print() # elastic ip eip = ec2.describe_addresses( ) print('Describing Elastic IPs...') print(f'Number of Elastic Ips: {len(eip["Addresses"])}') print('-'*40) for item in eip["Addresses"]: if 'AllocationId' in item.keys(): print(f'Eip Id: {item["AllocationId"]}') print(f'Public ipv4: {item["PublicIp"]}') print() print() # network interfaces next_token = None while True: if next_token: interface = ec2.describe_network_interfaces( NextToken=next_token ) else: interface = ec2.describe_network_interfaces( ) print('Describing Network Interfaces...') print(f'Number of interfaces: {len(interface["NetworkInterfaces"])}') print('Only printing Interfaces with a public IPv4 address...') print('-'*40) for item in interface["NetworkInterfaces"]: #print(f'Private Ip: {item["PrivateIpAddress"]}') for ip in item["PrivateIpAddresses"]: if 'Association' not in ip.keys(): pass else: print(f'Interface Id: {item["NetworkInterfaceId"]}') print(f'Description: {item["Description"]}') print(f'Status: {interface["NetworkInterfaces"][0]["Status"]}') print(f'Public Ip: {ip["Association"]["PublicIp"]}\n') next_token = interface.get("NextToken") if next_token is None: break except Exception as err: print(f'Error found: {err}...') pass # Run code if len(sys.argv) < 3 or not sys.argv[2]: global_public_ipv4_lookup(aga) regions_list = ec2.describe_regions( AllRegions=False ) for region in regions_list['Regions']: if region["OptInStatus"] == 'opted-in' or 'opt-in-not-required': print(f'\n**********-[{region["RegionName"]}]-**********\n') public_ipv4_lookup( ec2=profile.client('ec2', region_name=region["RegionName"]) ) elif sys.argv[2]: #ec2 = profile.client('ec2', region_name=sys.argv[2]) global_public_ipv4_lookup(aga) public_ipv4_lookup( ec2=profile.client('ec2', region_name=sys.argv[2]) )
-
スクリプトを実行します。
注: example-cli profile は、設定した AWS CLI プロファイルの名前または、.aws/credentials ファイルで定義したプロファイル名に置き換えます。example-region は、必要なリージョンに置き換えます。
すべてのリージョンでチェックするには、次のコマンドを使用します。# python3 public_ipv4_recon.py <example-cli-profile>
特定のリージョンをチェックするには、次のコマンドを使用します。
# python3 public_ipv4_recon.py <example-cli-profile> <example-region>
注: スクリプトを実行すると、次のエラーが発生することがあります。このエラーは、リクエストを実行するアクセス許可がないか、アカウントでリージョンが無効になっていることを示しています。
「エラーが見つかりました: エラー (AuthFailure) が、 <API> 次の操作の呼び出し時に発生しました。 AWS は取得したアクセス認証情報を検証できませんでした...」
パブリック IPv4 アドレスの使用を最適化し、IPv6 アドレスを導入する
コストを最適化するには、現在のアーキテクチャを改良し、パブリック IPv4 アドレスの使用を最小化します。また、早期に IPv6 に移行するのがベストプラクティスです。IPv6 への移行は、IP アドレスへの料金請求を伴わないため、費用対効果の高いソリューションです。

関連するコンテンツ
- 質問済み 1年前lg...
- AWS公式更新しました 2年前
- AWS公式更新しました 2年前
- AWS公式更新しました 2年前
- AWS公式更新しました 4年前