AWS re:Post을(를) 사용하면 다음에 동의하게 됩니다. AWS re:Post 이용 약관

VPC 퍼블릭 IPv4 사용량을 식별, 모니터링 및 최적화하려면 어떻게 해야 합니까?

6분 분량
0

Amazon Virtual Private Cloud(Amazon VPC) IPv4 사용량을 식별, 모니터링 및 최적화하려고 합니다.

해결 방법

참고: 2024년 2월 1일부터 모든 퍼블릭 IPv4 주소에 대해 서비스 연결 여부에 관계없이 시간당 IP 주소마다 0.005달러의 요금이 부과됩니다. Amazon Elastic Compute Cloud(Amazon EC2)의 AWS 프리 티어 고객인 경우 750시간의 무료 사용 혜택을 받습니다. 이 무료 사용은 퍼블릭 IPv4 주소로 Amazon EC2 인스턴스를 시작할 때 지원됩니다.

IPv4 사용을 식별, 모니터링 및 최적화하려면 다음을 완료하십시오.

Public IP Insights 켜기

현재 AWS 리전의 서비스에서 무료로 사용 중인 퍼블릭 IPv4 주소를 표시하려면 Public IP Insights를 사용합니다. Public IP Insights를 사용하여 퍼블릭 IPv4 주소 사용을 모니터링, 분석 및 감사할 수 있습니다.

Public IP Insights를 보려면 프리 티어에서 IPAM 풀을 생성하십시오. 또한 Public IP Insights를 설정한 후에는 Amazon VPC IP Address Manager에서 액세스할 수 있습니다.

참고: IPAM 풀을 생성한 후 Public IP Insights에서 퍼블릭 IPv4 주소와 관련된 보고서를 표시하는 데는 시간이 걸릴 수 있습니다.

Cost and Usage Report 켜기

AWS Cost and Usage Report(CUR)에는 사용 중이거나 사용하지 않는 퍼블릭 IPv4 주소와 관련된 사용량 데이터가 포함됩니다. CUR을 생성할 때 **Include Resource IDs(리소스 ID 포함)**를 선택하면 리소스 수준의 더 자세한 분석 결과를 얻을 수 있습니다. CUR을 생성한 후, 하루에 한 번 이상 AWS에서 보고서 파일을 업데이트하며, 이 보고서 파일에는 해당 월의 데이터를 포함합니다. 이를 통해 이전 IPv4 사용량 데이터를 분석할 수 있습니다. 또한 Amazon Simple Storage Service(Amazon S3) 버킷에서 보고서에 액세스할 수도 있습니다.

참고: AWS가 Amazon S3 버킷에 보고서를 전송하는 데는 최대 24시간이 걸릴 수 있습니다.

퍼블릭 IPv4 주소를 즉시 식별

참고: 퍼블릭 IPv4 주소 사용량에 대한 계획된 분석에는 CUR과 Public IP Insights를 사용하는 것이 가장 좋습니다.

퍼블릭 IPv4 주소를 사용하는 서비스를 즉시 확인하려면 AWS Management Console 또는 AWS CLI를 사용하십시오.

AWS Management Console

네트워크 인터페이스를 분석하여 퍼블릭 IPv4 주소를 사용하는 서비스를 확인하려면 다음 단계를 완료하십시오.

  1. Amazon EC2 콘솔을 연 다음, **Network Interfaces(네트워크 인터페이스)**를 선택합니다.
  2. 필터를 사용하여 **Public IPv4 Addresses(퍼블릭 IPv4 주소)**를 선택합니다. 값으로 **<*>**를 입력합니다. 이 필터는 기본 퍼블릭 IPv4 주소를 사용하는 모든 탄력적 네트워크 인터페이스를 식별합니다.
  3. 탄력적 네트워크 인터페이스 설명 및 인터페이스 유형을 사용하여 퍼블릭 IPv4 주소를 사용하는 서비스를 식별합니다.
  4. 리전에 탄력적 네트워크 인터페이스가 있는 모든 퍼블릭 및 보조 IP 주소를 표시하려면 다음 명령을 실행합니다.
    참고: example-region을 필요한 리전으로 바꾸십시오.
    aws ec2 describe-network-interfaces --region example-region --query 'NetworkInterfaces[*].PrivateIpAddresses[?Association.PublicIp].Association.PublicIp[]' --output table

Site-to-Site VPN에서 사용하는 퍼블릭 IPv4 주소에 대해서는 VPN 터널의 현재 상태를 확인하려면 어떻게 해야 합니까?를 참조하십시오.

표준 및 사용자 지정 Global Accelerator에서 사용하는 퍼블릭 IPv4 주소에 대해서는 액셀러레이터 보기를 참조하십시오.

유휴 또는 연결된 탄력적 IP 주소를 보려면 다음 단계를 완료하십시오.

  1. Amazon EC2 콘솔을 엽니다.
  2. 탐색 창에서 **Network & Security(네트워크 및 보안)**를 선택한 다음, **Elastic IPs(탄력적 IP)**를 선택하여 탄력적 IP 주소를 확인합니다.
  3. 탄력적 IP 주소를 사용하는 리소스를 보려면 먼저 탄력적 IP 주소를 선택합니다. 그런 다음, 네트워크 인터페이스 또는 인스턴스 필드에서 자세한 정보를 확인합니다.

참고: BYOIP는 요금이 청구되지 않습니다. AWS Global Accelerator에는 us-west-2에서 요금이 청구됩니다.

AWS CLI

참고: AWS Command Line Interface(AWS CLI) 명령 실행 시 오류가 발생하는 경우, AWS CLI 오류 문제 해결을 참조하십시오. 또한 최신 AWS CLI 버전을 사용하고 있는지 확인하십시오.

시작하기 전에 다음을 완료하십시오.

다음 단계를 완료하십시오.

참고: AWS CloudShell 또는 모든 Linux 환경에서 다음 단계를 수행할 수 있습니다.

  1. 다음 파일을 생성합니다.

    touch public_ipv4_recon.py
  2. 파일을 편집합니다.

    vim public_ipv4_recon.py
  3. 다음 코드를 복사하여 파일에 붙여넣은 다음, 파일을 저장합니다.

    #!/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])
        )
  4. 스크립트를 실행합니다.
    참고: 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>

참고: 스크립트를 실행할 때 다음 오류가 나타날 수 있습니다. 이 오류는 요청을 실행할 권한이 없거나 계정에 대해 해당 리전이 비활성화되었을 수 있음을 나타냅니다.

"Error found: An error occurred (AuthFailure) when calling the <API> operation: AWS was not able to validate the provided access credentials..."

퍼블릭 IPv4 주소 사용량 최적화 및 IPv6 주소 채택

비용을 최적화하려면 현재 아키텍처를 개선하여 퍼블릭 IPv4 주소 사용을 최소화하십시오. 또한 빠른 시일 내에 ](https://repost.aws/articles/AREREdDTYdSh2-NMBqQJS4wQ/get-started-with-ipv6-on-aws-resources-content)IPv6으로 마이그레이션[하는 것이 좋습니다. IPv6으로의 마이그레이션은 IP 주소에 대한 요금이 부과되지 않는 비용 효율적인 솔루션입니다.

AWS 공식
AWS 공식업데이트됨 8달 전