【小ネタ】CloudFormationにて新しく設定できる項目が増えました。【RDS, ELB】

2015.01.01

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは。正月から小ネタを投下する男、せーのです。 今回はCloudFormationのテンプレートに新しい項目が追加されたよ、というお話です。

CloudFormationは地味に進化し続けている

AWSサービスはかなり早いスピードで新機能やアップデートが繰り返されていきます。CloudFormationは基本的にAWSサービスをJSONにてテンプレート化して表現しているものなので、新機能のリリースに合わせてCloudFormationもアップデートしてくれると嬉しいのですが、なかなかそういうわけにもいかずCloudFormationに新機能やアップデートが反映されるのにはどうしても少しタイムラグがあります。 新しい機能がリリースされた時は注目を浴びるのですが、そのうちその機能が当たり前のものになっていき、CloudFormationに反映される時には必然的にひっそり追加されることになってしまいます。 ということでCloudFormationの項目追加というのはリリースノートを随時チェックしている人しか気が付かないような地味なものなのですが、今回は正月ということもあり、試運転を兼ねてこちらを取り上げてみたいと思います。今回のアップデートはRDSELBの2サービスになります。

RDS - AWS::RDS::DBInstance

まずはRDSテンプレートでの追加項目です。RDSでは

  • OptionGroupName
  • PubliclyAccessible
  • StorageType

の3項目になります。

OptionGroupName

RDSのオプショングループを指定します。mysqlのDBにmemcachedエンジンのプラグインを追加したりする時に使うものですね。指定はStringになりますがcreateOptionGroupsのようなものはないので、手でOptionGroupsを作って指定する、というなかなか中途半端な仕上がりになってます。

PubliclyAccessible

RDSをPublicに公開するかどうかをBoolean値で指定します。こちらは非常にわかりやすいですね。

StorageType

これが今回の項目追加のメインになるのではないでしょうか。RDSに使用するストレージのタイプを指定します。 指定するのは「standard | gp2 | io1」の3種類です。standardはそのままスタンダード、gp2はSSD、io1はPIOPSを指します。io1を指定する時には[Iops]という項目も合わせて追加しておくと一発で全て設定できます。

ELB - AWS::ElasticLoadBalancing::LoadBalancer

次にELBの追加項目を見てみましょう。ELBは

  • ConnectionSettings

の1つの追加となっております。

ConnectionSettings

ConnectionSettingsはELBへのアクセスがアイドル状態の時にフロントエンドとバックエンドのコネクションをどのくらいの時間保つかを指定する項目です。指定方法としては

{ "IdleTimeout" : Integer }

というように[IdleTimeout]というパラメータで指定します。

やってみた

では実際にやってみましょう。ELBとRDSをいれたテンプレートを書いてみます。

test.template

{
  "AWSTemplateFormatVersion" : "2010-09-09",

  "Description" : "AWS CloudFormation Sample Template RDS_PIOPS: Sample template showing how to create an Amazon RDS Database Instance with provisioned IOPs.**WARNING** This template creates an Amazon Relational Database Service database instance. You will be billed for the AWS resources used if you create a stack from this template.",

  "Parameters": {
    "DBUser": {
      "NoEcho": "true",
      "Description" : "The database admin account username",
      "Type": "String",
      "MinLength": "1",
      "MaxLength": "16",
      "AllowedPattern" : "[a-zA-Z][a-zA-Z0-9]*",
      "ConstraintDescription" : "must begin with a letter and contain only alphanumeric characters."
    },

    "DBPassword": {
      "NoEcho": "true",
      "Description" : "The database admin account password",
      "Type": "String",
      "MinLength": "8",
      "MaxLength": "41",
      "AllowedPattern" : "[a-zA-Z0-9]*",
      "ConstraintDescription" : "must contain only alphanumeric characters."
    }
  },

  "Resources" : {
    "testDB" : {
      "Type" : "AWS::RDS::DBInstance",
      "Properties" : {
        "AllocatedStorage" : "100",
        "DBInstanceClass" : "db.m1.small",
        "Engine" : "MySQL",
        "OptionGroupName" : "test",
        "PubliclyAccessible" : "true",
        "StorageType" : "io1",
        "Iops" : "1000",
        "MasterUsername" : { "Ref" : "DBUser" },
        "MasterUserPassword" : { "Ref" : "DBPassword" }
      }
    },


     "testEC2" : {
      "Type" : "AWS::EC2::Instance",
      "Properties" : {
        "InstanceType" : "t2.micro",
        "BlockDeviceMappings" : [
          {
            "DeviceName" : "/dev/sda1",
            "Ebs" : { "VolumeSize" : 30 }
          }
        ], 
        "KeyName" : "testcfn",
        "ImageId" : "ami-4985b048"
      }
    },

    "testELB" : {
      "Type" : "AWS::ElasticLoadBalancing::LoadBalancer",
      "Properties" : {
 		"AvailabilityZones" : { "Fn::GetAZs" : "" }, 
        "CrossZone" : "true",
        "Instances" :  [ { "Ref" : "testEC2" } ],
        "ConnectionSettings" : { "IdleTimeout" : 300 },
        "Listeners" : [ {
          "LoadBalancerPort" : "80",
          "InstancePort" : "80",
          "Protocol" : "HTTP"
        } ],
        "HealthCheck" : {
          "Target" : "HTTP:80/",
          "HealthyThreshold" : "3",
          "UnhealthyThreshold" : "5",
          "Interval" : "30",
          "Timeout" : "5"
        }
      }
    }
  }
}

こちらをCloudFrontに流してみます。

newCFn1

結果を確認します。まずはRDSです。

testRDS1

オプショングループが独自に設定されていること、publicのIPがついていること、HDDにPIOPSが指定されているのが確認できます。続いてELBです。

testELB1

testELB2

アイドルタイムが指定されているのが確認できます。

まとめ

いかがでしたでしょうか。特にRDSのストレージタイプの選択やオプショングループの指定などはかゆいところに手が届く感じで使い勝手が良さげですね。 では私は明日の初売りに備えます。ごきげんよう。