VPC용 CloudFormation 예
운 좋게도 저는 소프트웨어 엔지니어링 일을 하기 전에 여름 동안 네트워크 엔지니어로 일했습니다. 그래서 네트워킹에 대한 배경 지식이 있었기 때문에 이 템플릿을 구축하는 동안 몇 가지 개념을 배울 필요가 없었습니다. 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 네트워킹에 대해 훨씬 더 잘 알게 되었습니다.
Reference
이 문제에 관하여(VPC용 CloudFormation 예), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/thomasstep/cloudformation-example-for-a-vpc-5db6텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)