rch850 の上澄み

技術的な話題とか、雑談とか。タイトルを上澄みに変えました @ 2020/09/02

AWS CloudFormation の使いどころ

AWS をしばらく使ってて、なかなか使い方が分からなかったのが AWS CloudFormation だ。なんかシステム全部をドカーンと立てられるすごいやつってイメージで、大げさだなーとか思ってたんだけど、あるとき suz-lab さんから VPC 構築というユースケースを聞いて、これなら使えるじゃんってことに気づいた。

suz-lab さんの VPC 構築 CloudFormation は GitHub に公開されてる。例えばこの suz-lab_vpc-base.json は、パブリックなサブネットやプライベートなサブネットを AZ ごとにガツンと作ってくれる。合計12個のサブネットができて、最初はめまいがするかもしれないけど、これらを一括で構築、削除できるのはすごく便利だ。ひとつひとつのサブネットを作って、あれ、どこまで作ったっけ?ってなるよりもよっぽどいい。

CloudFormation が VPC に向いていると思う理由は、パラメータが少ない点だ。EC2 インスタンスやら RDS インスタンスやらを立てようとすると、AMI ID やらインスタンスタイプやらをパラメータで指定したくなってくる。こうなると、動的に決まる部分が多くなって JSON がごちゃごちゃしてくるし、スタックを作るときにも色々指定するのが面倒だ。でも VPC ならほぼパラメータ無しで、とりあえず構築することができる。便利。

これに近い用途で最近便利だなーと思ってるのは、Security Groups の構築だ。ELB にはこの SG、バックエンドのサーバにはこの SG、RDS にはこの SG っていう風に作っていくよりも、CloudFormation で JSON に書いちゃったほうが楽に感じる。ここからここへはこのポート番号でつないで……っていうのも、割と書きやすい。これをマネコンで作ろうとすると、バックエンドのサーバの SG 作ってる時に、接続元となる ELB の SG はどれだったっけ……あれ、そもそも作ってない?って状況になりやすい。CloudFormation なら

    "ELBSecurityGroup" : {
      "Type" : "AWS::EC2::SecurityGroup",
      "Properties" : {
        "GroupDescription" : "Security Group for ELB",
        "SecurityGroupIngress" : [ {
          "IpProtocol" : "tcp",
          "FromPort" : "22",
          "ToPort" : "22",
          "CidrIp" : "?.?.?.?/32"
        }, {
          "IpProtocol" : "tcp",
          "FromPort" : "80",
          "ToPort" : "80",
          "CidrIp" : "0.0.0.0/0"
        } ]
      }
    },

    "BackendSecurityGroup" : {
      "Type" : "AWS::EC2::SecurityGroup",
      "Properties" : {
        "GroupDescription" : "Security Group for Backend Server",
        "SecurityGroupIngress" : [ {
          "IpProtocol" : "tcp",
          "FromPort" : "8000",
          "ToPort" : "8000",
          "SourceSecurityGroupName": { "Ref": "ELBSecurityGroup" }
        }, {
          "IpProtocol" : "tcp",
          "FromPort" : "22",
          "ToPort" : "22",
          "CidrIp" : "?.?.?.?/32"
        } ]
      }
    }

って形で "SourceSecurityGroupId": { "Ref": "ELBSecurityGroup" } と書けるのがうれしい。全部書いてから構築するから、やっぱりこれ作ってなかったからやり直し。みたいな状況にもならない。

定義の JSON が読みにくい?うーん、そこは慣れるしかないな。しっかりと CloudFormation を書くことができれば、環境を作ったり壊したりがすごくカジュアルにできるようになって便利な世界になるんだろうな。