ページ

2015年4月21日

CloudformationでVPCを作ってみる練習、2回目:VPC、サブネット2つ、インターネット・ゲートウェイにルーティング・テーブルで随分なが


昨日、FindInMapとOutputを追加しましたので一つにします。




前回のJSONを一つにすると・・・


たかだかVPCを作り、サブネットを切って、インターネット・ゲートウェイを配置・割り当て、ルーティング・テーブルを作成する程度のCloudFormationファイルですが随分と長くなりました。


{
  "AWSTemplateFormatVersion" : "2010-09-09",
  "Description" : "AWS CloudFormation Sample Template Simple VPC.",

  "Parameters" : {

    "InstanceType" : {
      "Description" : "WebServer EC2 instance type",
      "Type" : "String",
      "Default" : "m2.micro",
      "AllowedValues" : [ "t2.micro", "t2.small", "t2.medium"],
      "ConstraintDescription" : "must be a valid EC2 instance type."
    },

    "NetworkStructure" : {
      "Type" : "String",
      "Default" : "Test",
      "AllowedValues" : [ "TEST1", "TEST2" ],
      "ConstraintDescription" : ""
    }
   },

  "Mappings" : {
     "VPCConfig" : {
       "VPCCidr" : { "TEST1" : "10.181.0.0/16", "TEST2" : "10.81.0.0/16" }
     },
    "SubnetConfig" : {
      "PublicCidr"     : { "TEST1" : "10.181.254.0/24", "TEST2" : "10.81.254.0/24" },
      "PrivateCidr"   : { "TEST1" : "10.181.80.0/24" ,  "TEST2" : "10.81.80.0/24"  }
    }
  },

  "Resources" : {
    "VPC" : {
      "Type" : "AWS::EC2::VPC",
      "Properties" : {
        "CidrBlock" : { "Fn::FindInMap" : [ "VPCConfig", "VPCCidr", { "Ref" : "NetworkStructure" } ] },
        "EnableDnsSupport" : "true",
        "EnableDnsHostnames" : "true",
        "Tags" : [
          { "Key" : "Application", "Value" : { "Ref" : "AWS::StackId" } },
          { "Key" : "Network", "Value" : "Public" }
        ]
      }
    },

    "PublicSubnet" : {
      "Type" : "AWS::EC2::Subnet",
      "Properties" : {
        "VpcId" : { "Ref" : "VPC" },
        "CidrBlock" : { "Fn::FindInMap" : [ "SubnetConfig", "PublicCidr", { "Ref" : "NetworkStructure" } ] },
        "Tags" : [
          { "Key" : "Application", "Value" : { "Ref" : "AWS::StackId" } },
          { "Key" : "Network", "Value" : "Public" }
        ]
      }
    },

    "PrivateSubnet" : {
       "Type" : "AWS::EC2::Subnet",
       "Properties" : {
         "VpcId" : { "Ref" : "VPC" },
         "CidrBlock" : { "Fn::FindInMap" : [ "SubnetConfig", "PrivateCidr", { "Ref" : "NetworkStructure" } ] },
         "Tags" : [
           { "Key" : "Application", "Value" : { "Ref" : "AWS::StackId" } },
           { "Key" : "Network", "Value" : "Private" }
         ]
       }
    },

  "InternetGateway" : {
      "Type" : "AWS::EC2::InternetGateway",
      "Properties" : {
        "Tags" : [
          { "Key" : "Application", "Value" : { "Ref" : "AWS::StackId" } },
          { "Key" : "Network", "Value" : "Public" }
        ]
      }
    },

    "GatewayToInternet" : {
       "Type" : "AWS::EC2::VPCGatewayAttachment",
       "Properties" : {
         "VpcId" : { "Ref" : "VPC" },
         "InternetGatewayId" : { "Ref" : "InternetGateway" }
       }
    },

    "PublicRouteTable" : {
      "Type" : "AWS::EC2::RouteTable",
      "Properties" : {
        "VpcId" : { "Ref" : "VPC" },
        "Tags" : [
          { "Key" : "Application", "Value" : { "Ref" : "AWS::StackId" } },
          { "Key" : "Network", "Value" : "Public" }
        ]
      }
    },

    "PublicRoute" : {
      "Type" : "AWS::EC2::Route",
      "DependsOn" : "GatewayToInternet",
      "Properties" : {
        "RouteTableId" : { "Ref" : "PublicRouteTable" },
        "DestinationCidrBlock" : "0.0.0.0/0",
        "GatewayId" : { "Ref" : "InternetGateway" }
      }
    },

    "PublicSubnetRouteTableAssociation" : {
      "Type" : "AWS::EC2::SubnetRouteTableAssociation",
      "Properties" : {
        "SubnetId" : { "Ref" : "PublicSubnet" },
        "RouteTableId" : { "Ref" : "PublicRouteTable" }
      }
    },

    "PrivateRouteTable" : {
      "Type" : "AWS::EC2::RouteTable",
      "Properties" : {
        "VpcId" : { "Ref" : "VPC" },
        "Tags" : [
          { "Key" : "Application", "Value" : { "Ref" : "AWS::StackId" } },
          { "Key" : "Network", "Value" : "Private" }
        ]
      }
    },

    "PrivateRoute" : {
      "Type" : "AWS::EC2::Route",
      "Properties" : {
        "RouteTableId" : { "Ref" : "PrivateRouteTable" },
        "DestinationCidrBlock" : "0.0.0.0/0",
        "GatewayId" : { "Ref" : "" }
      }
    },

    "PrivateSubnetRouteTableAssociation" : {
      "Type" : "AWS::EC2::SubnetRouteTableAssociation",
      "Properties" : {
        "SubnetId" : { "Ref" : "PrivateSubnet" },
        "RouteTableId" : { "Ref" : "PrivateRouteTable" }
      }
    }
  },

  "Outputs" : {
    "VPC" : {
      "Description" : "VPC CIDR",
      "Value" : { "Fn::FindInMap" : [ "VPCConfig", "VPCCidr", { "Ref" : "NetworkStructure" } ] }
    },
    "Public"  : {
      "Description" : "Public Subnet CIDR",
      "Value" : { "Fn::FindInMap" : [ "SubnetConfig", "PublicCidr", { "Ref" : "NetworkStructure" } ] }
    },
    "Private" : {
      "Description" : "Private Subnet CIDR",
      "Value" : { "Fn::FindInMap" : [ "SubnetConfig", "PrivateCidr", { "Ref" : "NetworkStructure" } ] }
    }
  }
}

まだ追加することはたくさんあるのですが・・・

ところで、OUTPUTの部分ですがCloudFormationを実行した際のタブにOutputがありましてそこに表示される内容です。

今のところ単にFindInMapを表示するようにしていますので、意味はあまりないですね。

生成したVPCのCIDR情報を引き出せると確認に使えるかなと思ったのですが、安直にはいかなさそうでしたのでひとまずはマップを参照しただけになっています。

実際にやろうとしているのは、サブネットが・・・12個




練習で作成しようとしているネットワーク構成は、サブネットがアベイラビリティ・ゾーンに6つありますから、合わせて12個のサブネットに分割するつもりです。

サブネットとシンプルなセキュリティ・グループの記述だけでもかなり長くなりそうな感じです。

インスタンスまで含めるととても長いファイルになっちゃいますね。

AWSer諸先輩の方々が、複数のファイルに分割しているのはなるほど納得です。

ひとまずどれくらいの行数になるのかわかりませんが、引き続き追加していくとしましょう。

次は、アベイラビリティ・ゾーンそれぞれに6つのサブネットを割り当てできるように追加していきたいと思います。