今回は、先日書籍(Amazon Web Servicesクラウドデザインパターン設計ガイド)が発売された
Cloud Design Pattern(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"
}
}
}

こちらの記事はなかの人(suz-lab)監修のもと掲載しています。
元記事は、こちら