VPC용 CloudFormation 예

12991 단어 devopsaws
VPC를 생성하는 것은 AWS에 일종의 통과 의례처럼 느껴집니다. VPC는 Virtual Private Cloud의 약자이며 모든 AWS 계정에는 도착할 때 이미 생성된 기본 VPC가 함께 제공됩니다. VPC는 클라우드 리소스를 격리된 상태로 유지하는 방법입니다. 나는 최근에 CloudFormation template for a basic VPC을 만들었고 그것을 만드는 데 들어간 몇 가지 다른 부분을 공유하고 싶었습니다. 네트워킹에 대한 기본적인 이해가 있으면 이러한 개념을 이해하는 데 도움이 될 것입니다.

운 좋게도 저는 소프트웨어 엔지니어링 일을 하기 전에 여름 동안 네트워크 엔지니어로 일했습니다. 그래서 네트워킹에 대한 배경 지식이 있었기 때문에 이 템플릿을 구축하는 동안 몇 가지 개념을 배울 필요가 없었습니다. VPC가 올바르게 작동하려면 일부 네트워킹이 필요합니다. 최소한 서브넷이 무엇인지, 내 네트워크에 서브넷을 추가하는 방법을 알아야 했습니다. 기본 VPC는 ​​172.31.0.0/16 프라이빗 IP 범위에 있는 172.16.0.0/12 네트워크를 사용합니다. 10.0.0.0/16 네트워크를 사용하여 VPC를 만들고 그 안에 4/24 서브넷을 만들기로 결정했습니다. 이것은 가장 효율적인 서브넷은 아니지만, 내 목표는 나중에 필요에 맞게 변경할 수 있는 기준 템플릿을 만드는 것이었습니다. 내 VPC에 2개의 퍼블릭 서브넷과 2개의 프라이빗 서브넷을 원했는데, 이는 AWS가 아닌 사용자에게 의미가 있을 수 있습니다. AWS에서 퍼블릭 서브넷은 인터넷 게이트웨이에 대한 경로가 있는 서브넷이고 프라이빗 서브넷에는 인터넷 게이트웨이에 대한 직접 경로가 없습니다. 인터넷 게이트웨이를 사용하면 인터넷과 내 VPC 간에 트래픽이 흐를 수 있습니다. 또한 2개의 서로 다른 가용 영역에 서브넷을 추가하여 생성하는 모든 항목의 중복성을 높이고 싶었습니다.

Resources:
  BasicVpc:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: 10.0.0.0/16
      EnableDnsSupport: 'true'
      EnableDnsHostnames: 'true'

  PublicSubnetA:
    Type: AWS::EC2::Subnet
    Properties:
      CidrBlock: 10.0.0.0/24
      AvailabilityZone: us-east-1a
      VpcId: !Ref BasicVpc
      MapPublicIpOnLaunch: true
  PublicSubnetB:
    Type: AWS::EC2::Subnet
    Properties:
      CidrBlock: 10.0.1.0/24
      AvailabilityZone: us-east-1b
      VpcId: !Ref BasicVpc
      MapPublicIpOnLaunch: true
  PrivateSubnetA:
    Type: AWS::EC2::Subnet
    Properties:
      CidrBlock: 10.0.2.0/24
      AvailabilityZone: us-east-1a
      VpcId: !Ref BasicVpc
  PrivateSubnetB:
    Type: AWS::EC2::Subnet
    Properties:
      CidrBlock: 10.0.3.0/24
      AvailabilityZone: us-east-1b
      VpcId: !Ref BasicVpc


VPC의 인스턴스가 외부 세계와 통신할 수 있도록 라우팅 테이블의 경로를 제공해야 했습니다. 해당 경로는 0.0.0.0/0에 대한 것이며 인터넷 게이트웨이를 가리킵니다. 또한 서브넷을 내가 생성한 라우팅 테이블과 연결해야 했습니다.

  PublicRouteTable:
    Type: AWS::EC2::RouteTable
    Properties:
      VpcId: !Ref BasicVpc

  InternetGateway:
    Type: AWS::EC2::InternetGateway
  InternetGatewayAttachment:
    Type: AWS::EC2::VPCGatewayAttachment
    Properties:
      InternetGatewayId: !Ref InternetGateway
      VpcId: !Ref BasicVpc

  PublicDefaultRoute:
    Type: AWS::EC2::Route
    Properties:
        RouteTableId: !Ref PublicRouteTable
        DestinationCidrBlock: 0.0.0.0/0
        GatewayId: !Ref InternetGateway

  PublicSubnetARouteTableAssociation:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      SubnetId: !Ref PublicSubnetA
      RouteTableId: !Ref PublicRouteTable
  PublicSubnetBRouteTableAssociation:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      SubnetId: !Ref PublicSubnetB
      RouteTableId: !Ref PublicRouteTable


다음은 약간 다르게 구성해야 하는 프라이빗 서브넷입니다. 제 목표는 프라이빗 서브넷에서 컴퓨팅 인스턴스를 가동하고 퍼블릭 서브넷과 유사한 외부 세계와 통신할 수 있도록 하는 것이었습니다. 그러나 나는 외부 세계에 의사 소통을 시작할 수 있는 선택권을 주고 싶지 않았습니다. 이를 설정하려면 해당 퍼블릭 서브넷의 각 가용 영역에 대해 NAT 게이트웨이를 프로비저닝해야 했습니다. 이러한 NAT 게이트웨이는 모두 인터넷과 통신하기 위해 공용 IP 또는 탄력적 IP가 필요했으며 공용 서브넷이 직접 경로를 가진 인터넷 게이트웨이를 통해 통신했습니다.

  NatA:
   Type: AWS::EC2::NatGateway
   Properties:
      AllocationId:
         Fn::GetAtt: EipA.AllocationId
      SubnetId:
         Ref: PublicSubnetA
  EipA:
    DependsOn: InternetGatewayAttachment
    Type: AWS::EC2::EIP
    Properties:
        Domain: vpc

  NatB:
   Type: AWS::EC2::NatGateway
   Properties:
      AllocationId:
         Fn::GetAtt: EipB.AllocationId
      SubnetId:
         Ref: PublicSubnetB
  EipB:
    DependsOn: InternetGatewayAttachment
    Type: AWS::EC2::EIP
    Properties:
        Domain: vpc


이러한 NAT 게이트웨이를 설정한 후에는 NAT 게이트웨이가 기본 경로라는 것을 알려주어 프라이빗 서브넷에서 NAT 게이트웨이로 가는 경로를 만들고 서브넷을 해당 경로를 보유한 라우팅 테이블과 연결하기만 하면 됩니다.

  PrivateRouteTableA:
    Type: AWS::EC2::RouteTable
    Properties:
      VpcId: !Ref BasicVpc
  PrivateRouteTableB:
    Type: AWS::EC2::RouteTable
    Properties:
      VpcId: !Ref BasicVpc

  NatRouteA:
    Type: AWS::EC2::Route
    Properties:
        RouteTableId:
          Ref: PrivateRouteTableA
        DestinationCidrBlock: 0.0.0.0/0
        NatGatewayId:
          Ref: NatA
  NatRouteB:
    Type: AWS::EC2::Route
    Properties:
        RouteTableId:
          Ref: PrivateRouteTableB
        DestinationCidrBlock: 0.0.0.0/0
        NatGatewayId:
          Ref: NatB

  PrivateSubnetARouteTableAssociation:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      SubnetId: !Ref PrivateSubnetA
      RouteTableId: !Ref PrivateRouteTableA
  PrivateSubnetBRouteTableAssociation:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      SubnetId: !Ref PrivateSubnetB
      RouteTableId: !Ref PrivateRouteTableB


AWS의 퍼블릭 서브넷과 프라이빗 서브넷의 차이가 처음에는 혼란스러웠고 이 템플릿을 작동시키려면 몇 가지 시행착오를 거쳐야 했습니다. 전에는 항상 VPC 구성을 당연하게 여겼기 때문에 이 작업을 완료한 후 성취감을 느꼈습니다. 이 연습을 통해 이제 VPC, VPC 구성 요소 및 VPC 네트워킹에 대해 훨씬 더 잘 알게 되었습니다.

좋은 웹페이지 즐겨찾기