この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
こんにちは、せーのです。今日はCloudFormationを使っている方には朗報となるアップデート情報をご紹介します。
AWS Parameter Typeでよく使うパラメータを変数化
今回のアップデートでCloudFormationの[Parameters]項目のTypeにて使える[AWS parameter types]が増えました!「ちょっと何言ってるかわからない」という方もいるかと思うので解説します。 [Parameters]というのはスタックを作成する際に動的に入れたい値を定義しておくことで実際にCloudFormationを流す時に値を入れられる、というセクションで、例えばこの環境であればt1.micro、こっちの本番環境はc3.xlarge、等テンプレートを使いまわす際にも非常に有効です。
今までParametersにて扱える種類は「文字列」「数字」「数字のリスト」「コンマ区切りのリスト」等で、数字かどうか、という一般的なチェックしかCloudFormationでは出来ませんでした。そこで出てきたのがAWS Parameter Typeです。このAWS Parameter TypeをTypeとして指定することでCloudFormationは入力された値が使用するAWSリソースのパラメータとして適切かどうかをチェックしてくれます。例えばTypeに「AWS::EC2::KeyPair::KeyName」を指定している場合は、入力された文字列がEC2のkey pair名にあるかどうかを検証してくれます。
これまでに使えたAWS Parameter Typeは
- AWS::EC2::KeyPair::KeyName
- AWS::EC2::SecurityGroup::Id
- AWS::EC2::Subnet::Id
- AWS::EC2::VPC::Id
- List<AWS::EC2::VPC::Id>
- List<AWS::EC2::SecurityGroup::Id>
- List<AWS::EC2::Subnet::Id>
となっておりました。
今回拡張されたParameter Type一覧
さて、それでは今回新しく増えましたAWS Parameter Typeをご紹介致します!
- AWS::EC2::AvailabilityZone::Name
- List<AWS::EC2::AvailabilityZone::Name>
- AWS::EC2::Instance::Id
- List<AWS::EC2::Instance::Id>
- AWS::EC2::Image::Id
- List<AWS::EC2::Image::Id>
- AWS::EC2::SecurityGroup::GroupName
- List<AWS::EC2::SecurityGroup::GroupName>
- AWS::EC2::Volume::Id
- List<AWS::EC2::Volume::Id>
- AWS::Route53::HostedZone::Id
- List<AWS::Route53::HostedZone::Id>
どうでしょうかこの顔ぶれ。いよいよ、本命が、ピッチに登場したっていう感じですね!(じゅんいちダビッドソン風) 特にHostedZoneやセキュリティグループ名などAWSらしい、痒いところに手が届くチョイスになっています。
使ってみた
では早速使ってみましょう。例えば既存のVPC上にEC2を立てて、セキュリティグループとドメインを振ってみましょう。こんなテンプレートを書きました。
{
"AWSTemplateFormatVersion" : "2010-09-09",
"Description" : "AWS CloudFormation Sample Template VPC_with_PublicIPs_And_DNS: Sample template that creates a VPC with DNS and public IPs enabled. Note that you are billed for the AWS resources that you use when you create a stack from this template.",
"Parameters": {
"AZ" : {
"Description" : "input Availability Zone",
"Type": "AWS::EC2::AvailabilityZone::Name",
"Default": "ap-northeast-1"
},
"AMIImageid": {
"Description" : "input EC2 ImageID",
"Type": "AWS::EC2::Image::Id",
"Default": "ami-18869819"
},
"Keyname": {
"Description" : "input EC2 Keyname",
"Type": "AWS::EC2::KeyPair::KeyName",
"Default": "test"
},
"SG": {
"Description" : "input EC2 SecurityId",
"Type": "AWS::EC2::SecurityGroup::Id",
"Default": ""
},
"HostZone": {
"Description" : "input Route 53 HostZone",
"Type": "AWS::Route53::HostedZone::Id",
"Default": ""
}
},
"Resources" : {
"InstanceIAMRole" : {
"Type" : "AWS::IAM::Role",
"Properties" : {
"AssumeRolePolicyDocument" : {
"Statement" : [ {
"Effect" : "Allow",
"Principal" : {
"Service" : [ "ec2.amazonaws.com" ]
},
"Action" : [ "sts:AssumeRole" ]
} ]
},
"Path" : "/"
}
},
"EC2ReadOnlyPolicy" : {
"Type" : "AWS::IAM::Policy",
"Properties" : {
"PolicyName" : "EC2ReadOnly",
"PolicyDocument" : {
"Statement" : [
{
"Effect": "Allow",
"Action": "ec2:Describe*",
"Resource": "*"
},
{
"Effect": "Allow",
"Action": "elasticloadbalancing:Describe*",
"Resource": "*"
},
{
"Effect": "Allow",
"Action": [
"cloudwatch:ListMetrics",
"cloudwatch:GetMetricStatistics",
"cloudwatch:Describe*"
],
"Resource": "*"
},
{
"Effect": "Allow",
"Action": "autoscaling:Describe*",
"Resource": "*"
}
]
},
"Roles" : [ { "Ref" : "InstanceIAMRole" } ]
}
},
"InstanceIAMProfile" : {
"Type" : "AWS::IAM::InstanceProfile",
"Properties" : {
"Path" : "/",
"Roles" : [ { "Ref" : "InstanceIAMRole" } ]
}
},
"test01" : {
"Type" : "AWS::EC2::Instance",
"Properties" : {
"InstanceType" : "t2.micro",
"BlockDeviceMappings" : [
{
"DeviceName" : "/dev/xvda",
"Ebs" : { "VolumeSize" : "8" }
}
],
"KeyName" : { "Ref" : "Keyname" },
"IamInstanceProfile" : { "Ref" : "InstanceIAMProfile" },
"SubnetId" : "subnet-36c7d442",
"SourceDestCheck" : "true",
"ImageId" : { "Ref" : "AMIImageid" },
"SecurityGroupIds" : [
{ "Ref" : "SG" }
],
"UserData" : { "Fn::Base64" : { "Fn::Join" : ["", [
"#cloud-config","\n",
"resize_rootfs: true","\n",
"timezone: Asia/Tokyo","\n",
"locale: ja_JP.UTF-8","\n"
] ] } },
"Tags" : [
{"Key" : "Name", "Value" : "test01" }
]
}
},
"TestDNSRecord" : {
"Type" : "AWS::Route53::RecordSet",
"Properties" : {
"Name" : "test.seino.classmethod.info.",
"HostedZoneId" : { "Ref" : "HostZone" },
"Type" : "CNAME",
"TTL" : "300",
"ResourceRecords" : [ { "Fn::GetAtt" : [ "test01" , "PublicDnsName" ] } ]
}
}
}
}
今回新しく増えたAWS Parameterをなるべく使ってみました。では流してみましょう。
テンプレート上では特にリスト等にまとめたものは無かったのですがパラメータの横にトグルボタンがついていますね。実はこれが今回のCloudFormationのもう一つのアップデートになります。ParameterにAWSリソースが規定されている場合は事前にAWSが既存のリソースを検索してくれて表示してくれるんですね。なのでTypeをきちんと設定していたら後は選ぶだけ、となります。これは便利!
こんなふうに
パラメータを選択していくだけで
何もメモなどしなくてもパラメータが埋められちゃいます。
※ImageIDだけは候補が出てきませんのであらかじめチェックしておくかこちらの記事を参考にLambdaを使って動的に設定しましょう。
無事スタックが流れだしました。結果も問題ありません。一手間加えるだけで後からこんなに楽になるのはいいですね!
まとめ
いかがでしたでしょうか。今回のアップデートは「後から楽をするためのもの」です。最初に適切なTypeを指定しておくと実際に使う時に非常に便利になります。特に同じテンプレートを何回も使う方は今回のアップデートを機にパラメータを見なおしてみてはいかがでしょうか。
参考サイト
- https://aws.amazon.com/about-aws/whats-new/2015/05/aws-cloudformation-supports-additional-parameter-types-and-enhanced-parameter-ui/
- http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/parameters-section-structure.html
- http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-using-console-create-stack-parameters.html