VPC 엔드포인트 및 AWS PRIVATELINK

VPC 엔드포인트 및 AWS PRIVATELINK



VPC 엔드포인트를 사용하면 VPC를 AWS 서비스 및 VPC 엔드포인트 서비스에 비공개로 연결할 수 있습니다. VPC 내의 리소스는 VPC 엔드포인트를 사용할 때 VPC 외부의 리소스와 통신하기 위해 퍼블릭 IP 주소가 필요하지 않습니다. Amazon Virtual Private Cloud(Amazon VPC)와 서비스 간의 트래픽은 Amazon 네트워크 외부로 라우팅되지 않습니다.

VPC 종단점은 가장 중요한 보안 제품이고 그 다음이 연결 제품입니다. VPC 엔드포인트는 VPC와 다른 서비스 간의 트래픽이 Amazon 네트워크를 벗어나는 것을 방지합니다.

VPC와 대중이 액세스할 수 있는 서비스 엔드포인트 간의 연결을 방지하는 엄격한 규정 준수 요구 사항이 있을 수 있습니다. 이 경우 VPC 종단점은 다른 방법으로는 사용할 수 없는 VPC에서 AWS 서비스에 액세스할 수 있는 방법을 제공합니다.

인터넷 게이트웨이, 가상 프라이빗 게이트웨이, NAT(네트워크 주소 변환) 장치, VPN(가상 프라이빗 네트워크) 연결 또는 Direct Connect 연결은 VPC 엔드포인트에 필요하지 않습니다. VPC 엔드포인트를 통해 제공되는 서비스에 연결하기 위해 VPC의 인스턴스에는 퍼블릭 IP 주소가 필요하지 않습니다.

다음은 다양한 유형의 VPC 엔드포인트입니다.

게이트웨이 VPC 엔드포인트

게이트웨이 VPC 엔드포인트는 접두사 목록을 사용하여 VPC 라우팅 테이블의 특정 IP 경로를 대상으로 합니다. 이는 Amazon DynamoDB 또는 Amazon Simple Storage Service(S3) 트래픽에 사용됩니다.

VPC 엔드포인트와 통신하기 위해 VPC의 인스턴스에는 퍼블릭 IP 주소가 필요하지 않습니다. 이는 소비자 VPC 내의 인터페이스 엔드포인트가 로컬 IP 주소를 사용하기 때문입니다. 게이트웨이 엔드포인트는 VPC의 라우팅 테이블에 있는 접두사 목록을 통해 VPC 내에서 액세스할 수 있는 대상입니다.

인터페이스 끝점

AWS PrivateLink에서 제공하는 인터페이스 엔드포인트는 서브넷의 IP 주소 범위에 있는 프라이빗 IP 주소가 있는 탄력적 네트워크 인터페이스입니다. 지원되는 AWS 서비스 또는 VPC 엔드포인트 서비스로 향하는 트래픽의 게이트웨이 역할을 합니다.

게이트웨이 로드밸런서 엔드포인트

Gateway Load Balancer 끝점은 서브넷의 IP 주소 범위에 있는 개인 IP 주소가 있는 탄력적 네트워크 인터페이스입니다. 이 유형의 엔드포인트는 트래픽을 가로채 게이트웨이 로드 밸런서를 사용하여 구성한 서비스로 라우팅하기 위한 진입점 역할을 합니다.

AWS PrivateLink는 VPC와 AWS 서비스 간에 보안 연결을 설정합니다. 이 AWS 서비스는 퍼블릭 인터넷에 대한 트래픽 노출을 피하면서 AWS 네트워크 내에서 안전한 사용을 보장합니다.

AWS PrivateLink 이전에는 단일 VPC 내의 서비스가 두 가지 방법으로 다른 VPC에 연결되었습니다.

1) VPC의 인터넷 게이트웨이를 사용하는 공인 IP 주소
2) VPC 피어링을 사용하는 사설 IP 주소

AWS PrivateLink를 통해 서비스는 서비스 공급자의 VPC와 서비스 소비자의 VPC 간에 TCP(Transmission Control Protocol) 연결을 설정합니다. 이는 안전하고 확장 가능한 솔루션을 제공합니다.



다음 예제는 AWS CloudFormation을 사용하여 Gateway Load Balancer ARN을 사용하여 VPC 엔드포인트 서비스를 생성하는 방법을 보여줍니다. 또한 서비스 이름을 출력하기 위해 사용자 지정 리소스를 생성합니다.

AWSTemplateFormatVersion: "2010-09-09"

Description: This template creates Amazon VPC Endpoint Service.

Metadata:
  AWS::CloudFormation::Interface:
    ParameterGroups:
      - Label:
          default: Endpoint Service Configuration
        Parameters:
          - ElbArn
          - ConnectionAcceptance
      - Label:
          default: Endpoint Service Permissions
        Parameters:
          - AwsAccountToWhitelist
    ParameterLabels:
      ElbArn:
        default: >-
          ELB Amazon Resource Names (ARNs)for your service.
      ConnectionAcceptance:
        default: >-
          Indicate whether requests from service consumers to create an
          endpoint to your service must be accepted.
      AwsAccountToWhitelist:
        default: >-
          The Amazon Resource Names (ARN) of one or more principals (IAM users,
          IAM roles, and AWS accounts). Permissions are granted to the
          principals in this list.
Parameters:
  ElbArn:
    Description: >-
      Enter Elastic load balancer ARN for your service. Network and Gateway
      Load Balancer are the two supported types.
    Type: String
    ConstraintDescription: Must be a valid ELB ARN
  ConnectionAcceptance:
    Description: >-
      Acceptance required for endpoint connection or not. Select true or
      false to either acceptance required or acceptance not required
      default is set to false: acceptance not required
    Default: "false"
    AllowedValues: ["true", "false"]
    Type: String
    ConstraintDescription: Must be true or false
  AwsAccountToWhitelist:
    Description: >-
      Enter ARN of one or more prinicapls: IAM user, IAM roles and AWS accounts.
      To grant permissions to all principals, specify an asterisk (*).
    Type: String
    ConstraintDescription: Must be a valid AWS ARN of one or more principals

Resources:
  VpcEndpointService:
    Type: AWS::EC2::VPCEndpointService
    Properties:
      GatewayLoadBalancerArns:
        - !Ref ElbArn
      AcceptanceRequired: !Ref ConnectionAcceptance

  VpcEndpointServicePermissions:
    Type: AWS::EC2::VPCEndpointServicePermissions
    Properties:
      AllowedPrincipals:
        - !Ref AwsAccountToWhitelist
      ServiceId: !Ref VpcEndpointService

  LambdaExecutionRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Version: 2012-10-17
        Statement:
          - Effect: Allow
            Principal:
              Service:
                - lambda.amazonaws.com
            Action:
              - sts:AssumeRole
      Path: /
      Policies:
        - PolicyName: root
          PolicyDocument:
            Version: 2012-10-17
            Statement:
              - Effect: Allow
                Action:
                  - logs:CreateLogGroup
                  - logs:CreateLogStream
                  - logs:PutLogEvents
                Resource: arn:aws:logs:*:*:*
              - Effect: Allow
                Action:
                  - ec2:DescribeVpcEndpointServiceConfigurations
                  - ec2:DescribeVpcEndpointServicePermissions
                  - ec2:DescribeVpcEndpointServices
                Resource: "*"

  DescribeVpceService:
    Type: AWS::Lambda::Function
    Properties:
      Handler: "index.handler"
      Role: !GetAtt
        - LambdaExecutionRole
        - Arn
      Code:
        ZipFile: |
          import boto3
          import cfnresponse
          import json
          import logging
          def handler(event, context):
              logger = logging.getLogger()
              logger.setLevel(logging.INFO)
              responseData = {}
              responseStatus = cfnresponse.FAILED
              logger.info('Received event: {}'.format(json.dumps(event)))
              if event["RequestType"] == "Delete":
                  responseStatus = cfnresponse.SUCCESS
                  cfnresponse.send(event, context, responseStatus, responseData)
              if event["RequestType"] == "Create":
                  try:
                      VpceServiceId = event["ResourceProperties"]["Input"]
                  except Exception as e:
                      logger.info('VPC Endpoint Service Id retrival failure: {}'.format(e))
                  try:
                      ec2 = boto3.client('ec2')
                  except Exception as e:
                      logger.info('boto3.client failure: {}'.format(e))
                  try:
                      response = ec2.describe_vpc_endpoint_service_configurations(
                          Filters=[
                              {
                                  'Name': 'service-id',
                                  'Values': [VpceServiceId]
                              }
                          ]
                      )
                  except Exception as e:
                      logger.info('ec2.describe_vpc_endpoint_service_configurations failure: {}'.format(e))
                  ServiceName = response['ServiceConfigurations'][0]['ServiceName']
                  responseData['Data'] = ServiceName
                  responseStatus = cfnresponse.SUCCESS
                  cfnresponse.send(event, context, responseStatus, responseData)
      Runtime: python3.7
      Timeout: 30

  VpceServiceName:
    DependsOn: VpcEndpointService
    Type: Custom::DescribeVpcEndpointServiceConfigurations
    Properties:
      ServiceToken: !GetAtt DescribeVpceService.Arn
      Input: !Ref VpcEndpointService

Outputs:
  SecurityVpcEndpointServiceId:
    Description: Security VPC Endpoint Service ID
    Value: !Ref VpcEndpointService
  SecurityVpcEndpointServiceName:
    Description: Security VPC Endpoint Service Name. Required to create VPC endpoint
    Value: !GetAtt VpceServiceName.Data

좋은 웹페이지 즐겨찾기