2012年12月2日日曜日

"OnDemand NATパターン"をCloudFormation化

スズキです。

CDPネタです。今回の対象は「OnDemand NATパターン」です。



最近、「re:Invent」と呼ばれるAWSのイベントに参加したのですが、
結構、セッションでCloudFormationを使っていて、
「5分でできるぜ!」「3秒でできないのか?」
的な感じだったので、V2へのアップデートも兼ねて、注意点も下記のように更新しました。
メンテナンス時はNATインスタンスの立ち上げからサブネットのルーティングの
調整まで行うので、オペレーションミスが起こらないようにスクリプトで自動化、
もしくは CloudFormation のテンプレート化すると安全であり、
素早く用意もできる。
(といってもCloudFormatiomを入れただけです...)

当然、書いたからにはCloudFormationのテンプレート、用意してみました!
SUZ-LAB Formation OnDemand NAT 0.0.1
まずは、下記のようにEC2(Client)がインターネットへの経路のない状態を用意します。
具体的には所属しているSubnetの0.0.0.0/0へのルーティングが
インターネットへ出れるように設定されていない状態です。


当然、次のようにインターネットへアクセスすることはできません。
[root@ip-10-10-32-190 ~]# curl -I http://blog.suz-lab.com
curl: (7) Failed to connect to 2404:6800:4008:c00::79: ネットワークに届きません

それでは上記のテンプレートを利用して"OnDemand NAT"を構築してみます。

はじめに、適当な"Stack Name"をつけて"Provide a Template URL"を選択して、
上記のテンプレート(JSON)のURLを入力します。


そして、パラメータを入力して、CloudFormationを実行します。


入力するパラメータは下記となります。
  • Name
    • NATインスタンスのNameタグの値
  • ImageId
    • NATインスタンスのAMIのID
  • InstanceType
    • NATインスタンスのタイプ
  • SecurityGroupId
    • NATインスタンスに適用するセキュリティグループのID
  • KeyName
    • NATインスタンスで利用するキー名
  • VpcId
    • "OnDemand NAT"を適用するVPCのID
  • SubnetId
    • NATインスタンスが配置されるSubnetのID
  • RouteTableId
    • NATインスタンスにルーティングを向けるルーティングテーブルのID
実際にVPCやEC2を確認すると、次のように問題なく構築されていることがわかります。



つまり下記のような状態になりました。



当然、次のようにインターネットへアクセスすることもできます!
[root@ip-10-10-32-190 ~]# curl -I http://blog.suz-lab.com
HTTP/1.1 200 OK
Content-Type: text/html; charset=UTF-8
Expires: Sat, 01 Dec 2012 18:35:51 GMT
Date: Sat, 01 Dec 2012 18:35:51 GMT
Cache-Control: private, max-age=0
Last-Modified: Sat, 01 Dec 2012 18:00:32 GMT
ETag: "7a62e44f-2635-4bfe-bcb4-0299a1ecc9cc"
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
Content-Length: 0
Server: GSE

最後にCloudFormationのテンプレートを載せておきます。

suz-lab_ondemand-nat-0.0.1.json
{
    "AWSTemplateFormatVersion": "2010-09-09", 
    "Description": "SUZ-LAB Formation OnDemand NAT 0.0.1", 
    "Mappings": {
        "AvailabilityZoneMap": {
            "ap-northeast-1": {
                "AZA": "ap-northeast-1a", 
                "AZB": "ap-northeast-1b", 
                "AZC": "ap-northeast-1c"
            }
        }
    }, 
    "Parameters": {
        "ImageId": {
     "AllowedPattern": "^ami-[0-9a-z]{8}",
            "Default": "ami-14d86d15",
            "Description": "Image ID", 
            "Type": "String"
        }, 
        "InstanceType": {
            "Default": "t1.micro", 
            "Description": "Instance Type", 
            "Type": "String"
        }, 
        "KeyName": {
            "Default": "", 
            "Description": "Key Name", 
            "Type": "String"
        }, 
        "Name": {
            "Default": "ondemand-nat", 
            "Description": "Name", 
            "Type": "String"
        }, 
        "RouteTableId": {
     "AllowedPattern": "^rtb-[0-9a-z]{8}",
     "Default": "rtb-xxxxxxxx", 
            "Description": "Route Table ID", 
            "Type": "String"
        }, 
        "SecurityGroupId": {
            "AllowedPattern": "^sg-[0-9a-z]{8}",
            "Default": "sg-xxxxxxxx", 
            "Description": "Security Group ID", 
            "Type": "String"
        }, 
        "SubnetId": {
            "AllowedPattern": "^subnet-[0-9a-z]{8}",
            "Default": "subnet-xxxxxxxx", 
            "Description": "Subnet ID", 
            "Type": "String"
        }, 
        "VpcId": {
            "AllowedPattern": "^vpc-[0-9a-z]{8}",
            "Default": "vpc-xxxxxxxx", 
            "Description": "VPC ID", 
            "Type": "String"
        }
    }, 
    "Resources": {
        "EC2SecurityGroupNAT": {
            "Properties": {
                "GroupDescription": "Enable NAT Access", 
                "SecurityGroupEgress": [
                    {
                        "CidrIp": "0.0.0.0/0", 
                        "FromPort": "-1", 
                        "IpProtocol": "-1", 
                        "ToPort": "-1"
                    }
                ], 
                "VpcId": {
                    "Ref": "VpcId"
                }
            }, 
            "Type": "AWS::EC2::SecurityGroup"
        },     
        "EC2InstanceNAT": {
            "Properties": {
                "ImageId": {
                    "Ref": "ImageId"
                },    
                "InstanceType": {
                    "Ref": "InstanceType"
                }, 
                "KeyName": {
                    "Ref": "KeyName"
                }, 
                "SecurityGroupIds": [
                    {
                        "Ref": "SecurityGroupId"
                    }, 
                    {
                        "Ref": "EC2SecurityGroupNAT"
                    }
                ], 
                "SourceDestCheck": "false", 
                "SubnetId": {
                    "Ref": "SubnetId"
                }, 
                "Tags": [
                    {
                        "Key": "Name", 
                        "Value": {
                            "Ref": "Name"
                        }
                    }, 
                    {
                        "Key": "suz-lab:Function", 
                        "Value": "ondemand-nat"
                    }
                ]
            }, 
            "Type": "AWS::EC2::Instance"
        }, 
        "EC2EIPNAT": {
            "Properties": {
                "Domain": "vpc", 
                "InstanceId": {
                    "Ref": "EC2InstanceNAT"
                }
            }, 
            "Type": "AWS::EC2::EIP"
        }, 
        "EC2RouteNAT": {
            "Properties": {
                "DestinationCidrBlock": "0.0.0.0/0", 
                "InstanceId": {
                    "Ref": "EC2InstanceNAT"
                }, 
                "RouteTableId": {
                    "Ref": "RouteTableId"
                }
            }, 
            "Type": "AWS::EC2::Route"
        }
    },
    "Outputs": {
        "Guideline": {
            "Value": "https://docs.google.com/a/suz-lab.com/document/pub?id=1nIF-CUBs_rqIEvzHIs9Vn1M9M-fZVn0kGszgh_mWevA"
        }
    }
}

他のCDPも、どこまでCloudFormationのテンプレート化ができるんだろう?
--------
http://www.suz-lab.com

0 コメント: