🔥

No.2【AWS】ECS Fargate+CodePipeline - ネットワーク構築編

2023/04/04に公開

はじめに

この記事は以下の続きとなる。

https://zenn.dev/omizunomitaro/articles/8fc2a612a1199b

AWSネットワーク環境構築時につまづきやすいポイント

VPC

  • Amazon Virtual Private Cooudの略
  • AWS上に作成する仮想ネットワーク
  • 仮想ネットワークなのでVPC内では物理作業無しにあらゆるAWSリソースを作成できる。

インターネットゲートウェイ

  • VPCとインターネット間の通信を可能とするコンポーネント。
  • VPCにアタッチし、ルートテーブルの設定をすることで
    パブリックIPをもつパブリックサブネット内にあるリソースのみ
    インターネットに接続できるようになる。

サブネット

  • 一般的なサブネットの概念とほぼ同じ。
  • VPC内のネットワークを分割する仕組み。
  • AWS特有な点としてネットワークアドレスおよびブロードキャストアドレス以外に
    各サブネットにAWSが予約するアドレスが存在し、そのIPは使用できない。
    以下、10.10.1.0/24でサブネットを作成した場合に使用できないIP。
    • 10.10.1.0 ネットワークアドレス
    • 10.10.1.1 VPCルータアドレス
    • 10.10.1.2 DNSサーバのアドレス
    • 10.10.1.3 将来的のための予約
    • 10.10.1.255 ブロードキャストアドレス

パブリックサブネット

  • インターネットへの通信がおこなえるサブネット。
  • ルートテーブルによりインターネットゲートウェイへの通信設定がされているサブネットのこと。

プライベートサブネット

  • インターネットゲートウェイへの通信設定がされていないサブネット。
  • VPC内部の通信およびVPNやDirectConnetなどプライベートな通信を行うサブネット。
  • インターネットへの通信経路はGWやVPCエンドポイントなどを使用しないと確保できない。

ルートテーブル

  • サブネットやゲートウェイのネットワークトラフィックの経路をルーティングする設定。
  • そのため、一般的なルーティング設定と異なりサブネットやゲートウェイと異なり
    作成したルートテーブルにゲートウェイやサブネットを紐づける設定をする。

local

  • ルートテーブルを作成すると最初から以下のようなターゲットをlocalに向けた設定が入っている。
    ルートテーブル
  • 送信先はトラフィックを送信する宛先、ターゲットはトラフィックの経路を意味する。
  • この設定は自身が所属するlocalネットワークを意味する。
  • そのため、以下の場合はlocalを経由してVPC内のCIDRにトラフィックを流すことを意味する。

構築する環境

構成図

構築手順

以下、ymlファイルをCloudFormationで実行する。

Parameters:
    PJName:
        Type: String
        Default: "ecs-test"
    VPCCIDR:
        Type: String
        Default: "10.10.0.0/16"
    PublicSubnetACIDR:
        Type: String
        Default: "10.10.1.0/24"
    PublicSubnetCCIDR:
        Type: String
        Default: "10.10.2.0/24
    PrivateSubnetACIDR:
        Type: String
        Default: "10.10.100.0/24"
    PrivateSubnetCCIDR:
        Type: String
        Default: "10.10.200.0/24"

Resources:
#=================================
# Create VPC
#=================================
  VPC:
    Type: "AWS::EC2::VPC"
    Properties:
      CidrBlock: !Ref VPCCIDR
      EnableDnsSupport: 'true'
      EnableDnsHostnames: 'true'
      Tags:
        - Key: Name
          Value: !Sub "${PJName}-vpc"

#=================================
# Create IGW
#=================================
# IGW Create
  IGW: 
    Type: "AWS::EC2::InternetGateway"
    Properties: 
      Tags: 
        - Key: Name
          Value: !Sub "${PJName}-igw"

# IGW Attach
  InternetGatewayAttachment: 
    Type: "AWS::EC2::VPCGatewayAttachment"
    Properties: 
      InternetGatewayId: !Ref IGW
      VpcId: !Ref VPC 


#=================================
# Create Subnet
#=================================

# PublicSubnet
  PublicSubnetA: 
    Type: "AWS::EC2::Subnet"
    Properties: 
      AvailabilityZone: "us-east-1a"
      CidrBlock: !Ref PublicSubnetACIDR
      VpcId: !Ref VPC 
      Tags: 
        - Key: Name
          Value: !Sub "${PJName}-public-subnet-a"

  PublicSubnetC: 
    Type: "AWS::EC2::Subnet"
    Properties: 
      AvailabilityZone: "us-east-1c"
      CidrBlock: !Ref PublicSubnetCCIDR
      VpcId: !Ref VPC 
      Tags: 
        - Key: Name
          Value: !Sub "${PJName}-public-subnet-c"          

# PrivateSubnet
  PrivateSubnetA: 
    Type: "AWS::EC2::Subnet"
    Properties: 
      AvailabilityZone: "us-east-1a"
      CidrBlock: !Ref PrivateSubnetACIDR
      VpcId: !Ref VPC 
      Tags: 
        - Key: Name
          Value: !Sub "${PJName}-private-subnet-a"

  PrivateSubnetC: 
    Type: "AWS::EC2::Subnet"
    Properties: 
      AvailabilityZone: "us-east-1c"
      CidrBlock: !Ref PrivateSubnetCCIDR
      VpcId: !Ref VPC 
      Tags: 
        - Key: Name
          Value: !Sub "${PJName}-private-subnet-c"
          
#=================================
# RouteTable
#=================================

# Public RouteTable
  PublicRouteTable: 
    Type: "AWS::EC2::RouteTable"
    Properties: 
      VpcId: !Ref VPC 
      Tags: 
        - Key: Name
          Value: !Sub "${PJName}-public-route"

# Private RouteTable
  PrivateRouteTable: 
    Type: "AWS::EC2::RouteTable"
    Properties: 
      VpcId: !Ref VPC 
      Tags: 
        - Key: Name
          Value: !Sub "${PJName}-private-route"
          
# Attach RouteTable IGW route
  AttachIGW:
    Type: AWS::EC2::Route
    Properties:
      RouteTableId: !Ref PublicRouteTable
      DestinationCidrBlock: 0.0.0.0/0
      GatewayId: !Ref IGW
      
# Attach RouteTable PublicSubnet route
  AttachPublicSubnetA:
    Type: "AWS::EC2::SubnetRouteTableAssociation"
    Properties: 
      SubnetId: !Ref PublicSubnetA 
      RouteTableId: !Ref PublicRouteTable
  
  AttachPublicSubnetC:
    Type: "AWS::EC2::SubnetRouteTableAssociation"
    Properties: 
      SubnetId: !Ref PublicSubnetC 
      RouteTableId: !Ref PublicRouteTable
      
# Attach RouteTable PrivateSubnet route
  AttachPrivateSubnetA:
    Type: "AWS::EC2::SubnetRouteTableAssociation"
    Properties: 
      SubnetId: !Ref PrivateSubnetA 
      RouteTableId: !Ref PrivateRouteTable
  
  AttachPrivateSubnetC:
    Type: "AWS::EC2::SubnetRouteTableAssociation"
    Properties: 
      SubnetId: !Ref PrivateSubnetC 
      RouteTableId: !Ref PrivateRouteTable
      
#=================================
# Cloud9
#=================================

  Cloud9:
    Type: AWS::Cloud9::EnvironmentEC2
    Properties: 
      AutomaticStopTimeMinutes: 30
      ConnectionType: CONNECT_SSH
      Description: !Sub "${PJName}-cloud9"
      InstanceType: "t2.micro"
      Name: !Sub "${PJName}-cloud9"
      SubnetId: !Ref PublicSubnetA

Discussion