orenoblog

エンジニアになりたいExcel方眼紙erの物語

CloudformationでEC2にPublicIP+固定PrivateIPを割り当てる

いつからCloudformationだと思った?

やったーー!!kumogata(winebarrel/kumogata · GitHub)でした!

JSON書くのはExcel方眼紙のプリントレイアウト設定するのと同じぐらいに辛いので、kumogataを使いました。

cloudformationドキュメントを読んでいるとEC2にPublicIPを割り当てるためのResourceは存在しないらしい。

EIPはAWS::EC2::EIPがあるのにな・・・

PublicIPと固定PrivateIPを割り当てる方法はAWS::EC2::NetworkInterfaces内で定義すること。

どうもENIに対して割り当てないといけない模様です

理由はEC2のドキュメントに書いてあるようなきがするので読まないと...

AWS::EC2のPropertyでもPrivateIP, SubnetID, SecurityGroupを設定できるがPublicIPを当てる場合は書いてはいけない。このようなエラーでRollbackされる。

Network interfaces and an instance-level subnet ID may not be specified on the same request

以下例

  • orenoinstance.rb
orenoInstance do
  Type "AWS::EC2::Instance"
  Properties do
    InstanceType     "t2.small"
    KeyName          {Ref "KeyName"}
    Monitoring       true
    ImageId          BASE_EBS_AMI_ID

    Tags [
      "Key"   => "Name",
      "Value" => "orenoinstance",
    ]

    BlockDeviceMappings [
      _{
        DeviceName "/dev/xvda"
        Ebs   {VolumeSize 100}
      }
    ]

    NetworkInterfaces [
      _{
        AssociatePublicIpAddress true
        PrivateIpAddress "10.10.20.30"
        DeviceIndex "0"
        GroupSet [
          _{Ref "orenoSecurityGroup"},
          _{Ref "publicSecurityGroup"}, 
        ]
        SubnetId         {Ref "orenoSubnet"}
      }
    ]
  end
end 
  • kumogataで作る

kumogataを実行する。DSLがParseされcloudformationが走る。

kumogata実行時の-pオプションでパラメータの上書きも可能

orenomac$ kumogata create orenoinstance.rb development

GUI脳筋でも魔法が使えたと思った瞬間。

さいこうです!!