AWSでの環境構築 - MultiAZ対応の環境を構築する(6/7)

こんにちは。beaglesoftの真鍋です。

MultiAZ構成と聞くとどこか難しいイメージが有り、また面倒というイメージもあります。実際に私も面倒そうだと感じました。(開発者からすると、開発以外の作業は面倒と感じがちなのですが…)ただ、実際のところMultiAZだろうがなんだろうが大して面倒ではありませんでした。コマンドで作業するので、同自動化するかだけの事になるからです。

ただ、何ができてどういう組み合わせがあるかということは理解しておく必要があるため、そこはキャッチアップが必要なところです。

構築するVPC

今回構築するVPCは以下のイメージとなります。AWSではネットワークなどの構成を表現するルールが決まっています。詳細はAWS シンプルアイコン(全52種類)の覚え方まとめ - Qiitaなどが参考になると思います。

AWS-VPC.png (61.7 kB)

なお、この図はDraw.ioを利用して作成しました。Draw.ioについてはこちらを参考にしてください。

blog.beaglesoft.net

前提

このエントリーはAmazon Web Services パターン別構築・運用ガイド を参考にAWS CLIを利用して以下の環境を構築したときの履歴です。

設定を行うためには、IAMアカウント作成など予めAWSを利用する設定が行われていることを前提としています。

Amazon Web Services パターン別構築・運用ガイド

Amazon Web Services パターン別構築・運用ガイド

MultiAZ環境を構築する

MultiAZ環境を構築するため、これまで作成した手順でAZの異なるEC2インスタンスを作成します。具体的な手順は以下のとおりとなります。

  1. Subnetの作成
  2. SubnetとRouteTableの関連付け
  3. EC2インスタンスの作成
  4. EIPの取得とEC2インスタンスへの割当

Subnetの作成

これまで作成したAZとは異なるAZにSubnetを作成します。

╭─ymanabe@Yoichiro-no-MacBook-Pro  ~ ‹2.2.4›
╰─$ aws ec2 create-subnet --vpc-id vpc-6a97c20f --availability-zone ap-northeast-1c --cidr-block 10.0.1.0/24
{
    "Subnet": {
        "VpcId": "vpc-6a97c20f",
        "CidrBlock": "10.0.1.0/24",
        "State": "pending",
        "AvailabilityZone": "ap-northeast-1c",
        "SubnetId": "subnet-4090d819",
        "AvailableIpAddressCount": 251
    }
}

作成したSubnetを確認すると、VPC内に異なるAZでSubnetが別れた状態で作成されていることが確認できます。

╭─ymanabe@Yoichiro-no-MacBook-Pro  ~ ‹2.2.4›
╰─$ aws ec2 describe-subnets --filters "Name=vpc-id,Values=vpc-6a97c20f"
{
    "Subnets": [
        {
            "VpcId": "vpc-6a97c20f",
            "CidrBlock": "10.0.1.0/24",
            "MapPublicIpOnLaunch": false,
            "DefaultForAz": false,
            "State": "available",
            "AvailabilityZone": "ap-northeast-1c",
            "SubnetId": "subnet-4090d819",
            "AvailableIpAddressCount": 251
        },
        {
            "VpcId": "vpc-6a97c20f",
            "CidrBlock": "10.0.0.0/24",
            "MapPublicIpOnLaunch": false,
            "DefaultForAz": false,
            "State": "available",
            "AvailabilityZone": "ap-northeast-1a",
            "SubnetId": "subnet-5282b225",
            "AvailableIpAddressCount": 250
        }
    ]
}

"AvailabilityZone": "ap-northeast-1c""AvailabilityZone": "ap-northeast-1a"がそれぞれSubnetとして作成されています。

SubnetとRouteTableの関連付け

作成したSubnetを既存のRouteTableに関連付けます。RouteTableが複数のSubnetとInternetGatewayをつなげる役割を行います。

╭─ymanabe@Yoichiro-no-MacBook-Pro  ~ ‹2.2.4›
╰─$ aws ec2 associate-route-table --route-table-id rtb-3d586858 --subnet-id subnet-4090d819
{
    "AssociationId": "rtbassoc-9fdf31fb"
}

RouteTableとSubnetの関連を確認し、それぞれのSubnetにRouteTableが関連していることを確認します。

╭─ymanabe@Yoichiro-no-MacBook-Pro  ~ ‹2.2.4›
╰─$ aws ec2 describe-route-tables --filters "Name=vpc-id,Values=vpc-6a97c20f"
{
    "RouteTables": [
        {
            "Associations": [],
            "RouteTableId": "rtb-295c6c4c",
            "VpcId": "vpc-6a97c20f",
            "PropagatingVgws": [],
            "Tags": [],
            "Routes": [
                {
                    "GatewayId": "local",
                    "DestinationCidrBlock": "10.0.0.0/16",
                    "State": "active",
                    "Origin": "CreateRouteTable"
                }
            ]
        },
        {
            "Associations": [
                {
                    "RouteTableAssociationId": "rtbassoc-21f41a45",
                    "Main": true,
                    "RouteTableId": "rtb-3d586858"
                },
                {
                    "SubnetId": "subnet-5282b225",
                    "RouteTableAssociationId": "rtbassoc-28ce204c",
                    "Main": false,
                    "RouteTableId": "rtb-3d586858"
                },
                {
                    "SubnetId": "subnet-4090d819",
                    "RouteTableAssociationId": "rtbassoc-9fdf31fb",
                    "Main": false,
                    "RouteTableId": "rtb-3d586858"
                }
            ],
            "RouteTableId": "rtb-3d586858",
            "VpcId": "vpc-6a97c20f",
            "PropagatingVgws": [],
            "Tags": [],
            "Routes": [
                {
                    "GatewayId": "local",
                    "DestinationCidrBlock": "10.0.0.0/16",
                    "State": "active",
                    "Origin": "CreateRouteTable"
                },
                {
                    "GatewayId": "igw-e60fb483",
                    "DestinationCidrBlock": "0.0.0.0/0",
                    "State": "active",
                    "Origin": "CreateRoute"
                }
            ]
        }
    ]
}

EC2インスタンスの作成

EC2インスタンスは、先ほど作成したSubnetに作成します。SecurityGroupについてはすでに作成済みのSecurityGroupを利用します。このようにSecurityGroupを同じ役割のシステムに適用できることはとてもメリットが大きいと思います。個々のシステムごとにSecurityGroupを適用すると間違えてしまうこともあるためです。

また、作成したEC2インスタンスのAZがap-northeast-1cとなっていることを確認します。

╭─ymanabe@Yoichiro-no-MacBook-Pro  ~ ‹2.2.4›
╰─$ aws ec2 run-instances --image-id ami-f80e0596 --count 1 --instance-type t2.micro --key-name beagle-key-pair-demo --security-group-id sg-ac9534c8 --subnet-id subnet-4090d819 --associate-public-ip-address
{
    "OwnerId": "457499276421",
    "ReservationId": "r-e5104347",
    "Groups": [],
    "Instances": [
        {
            "Monitoring": {
                "State": "disabled"
            },
            "PublicDnsName": "",
            "RootDeviceType": "ebs",
            "State": {
                "Code": 0,
                "Name": "pending"
            },
            "EbsOptimized": false,
            "LaunchTime": "2016-04-03T01:16:50.000Z",
            "PrivateIpAddress": "10.0.1.74",
            "ProductCodes": [],
            "VpcId": "vpc-6a97c20f",
            "StateTransitionReason": "",
            "InstanceId": "i-d414515b",
            "ImageId": "ami-f80e0596",
            "PrivateDnsName": "ip-10-0-1-74.ap-northeast-1.compute.internal",
            "KeyName": "beagle-key-pair-demo",
            "SecurityGroups": [
                {
                    "GroupName": "beaglesoft-security-group-demo",
                    "GroupId": "sg-ac9534c8"
                }
            ],
            "ClientToken": "",
            "SubnetId": "subnet-4090d819",
            "InstanceType": "t2.micro",
            "NetworkInterfaces": [
                {
                    "Status": "in-use",
                    "MacAddress": "0a:69:5f:ff:e5:ab",
                    "SourceDestCheck": true,
                    "VpcId": "vpc-6a97c20f",
                    "Description": "",
                    "NetworkInterfaceId": "eni-5c7b8906",
                    "PrivateIpAddresses": [
                        {
                            "PrivateDnsName": "ip-10-0-1-74.ap-northeast-1.compute.internal",
                            "Primary": true,
                            "PrivateIpAddress": "10.0.1.74"
                        }
                    ],
                    "PrivateDnsName": "ip-10-0-1-74.ap-northeast-1.compute.internal",
                    "Attachment": {
                        "Status": "attaching",
                        "DeviceIndex": 0,
                        "DeleteOnTermination": true,
                        "AttachmentId": "eni-attach-63f88591",
                        "AttachTime": "2016-04-03T01:16:50.000Z"
                    },
                    "Groups": [
                        {
                            "GroupName": "beaglesoft-security-group-demo",
                            "GroupId": "sg-ac9534c8"
                        }
                    ],
                    "SubnetId": "subnet-4090d819",
                    "OwnerId": "457499276421",
                    "PrivateIpAddress": "10.0.1.74"
                }
            ],
            "SourceDestCheck": true,
            "Placement": {
                "Tenancy": "default",
                "GroupName": "",
                "AvailabilityZone": "ap-northeast-1c"
            },
            "Hypervisor": "xen",
            "BlockDeviceMappings": [],
            "Architecture": "x86_64",
            "StateReason": {
                "Message": "pending",
                "Code": "pending"
            },
            "RootDeviceName": "/dev/xvda",
            "VirtualizationType": "hvm",
            "AmiLaunchIndex": 0
        }
    ]
}

確かにAZは"ap-northeast-1c"となっていることが確認できます。

さらにVPCに作成されたインスタンスを確認すると、2つ作成されていることが確認できます。

╭─ymanabe@Yoichiro-no-MacBook-Pro  ~ ‹2.2.4›
╰─$ aws ec2 describe-instances --filters "Name=vpc-id,Values=vpc-6a97c20f"aws ec2 describe-instances --filters "Name=vpc-id,Values=vpc-6a97c20f" --query  "Reservations[].Instances[].[InstanceId,SubnetId]"
[
    [
        "i-9a53f705",
        "subnet-5282b225"
    ],
    [
        "i-d414515b",
        "subnet-4090d819"
    ]
]

EIPの取得とEC2インスタンスへの割当

次に、EIPを取得してEC2インスタンスに割り当てます。

╭─ymanabe@Yoichiro-no-MacBook-Pro  ~ ‹2.2.4›
╰─$ aws ec2 allocate-address
{
    "PublicIp": "52.193.41.71",
    "Domain": "vpc",
    "AllocationId": "eipalloc-d1bb2eb4"
}
╭─ymanabe@Yoichiro-no-MacBook-Pro  ~ ‹2.2.4›
╰─$ aws ec2 associate-address --instance-id i-d414515b --allocation-id eipalloc-d1bb2eb4
{
    "AssociationId": "eipassoc-e8db568c"
}

╭─ymanabe@Yoichiro-no-MacBook-Pro  ~ ‹2.2.4›
╰─$ aws ec2 describe-addresses
{
    "Addresses": [
        {
            "Domain": "vpc",
            "InstanceId": "i-9a53f705",
            "NetworkInterfaceId": "eni-0277374a",
            "AssociationId": "eipassoc-44df5220",
            "NetworkInterfaceOwnerId": "457499276421",
            "PublicIp": "52.69.244.122",
            "AllocationId": "eipalloc-0bbf2a6e",
            "PrivateIpAddress": "10.0.0.9"
        },
        {
            "Domain": "vpc",
            "InstanceId": "i-d414515b",
            "NetworkInterfaceId": "eni-5c7b8906",
            "AssociationId": "eipassoc-e8db568c",
            "NetworkInterfaceOwnerId": "457499276421",
            "PublicIp": "52.193.41.71",
            "AllocationId": "eipalloc-d1bb2eb4",
            "PrivateIpAddress": "10.0.1.74"
        }
    ]
}

EC2インスタンスの設定

EC2インスタンスにログインを行いApacheのインストールを行います。

╭─ymanabe@Yoichiro-no-MacBook-Pro  ~ ‹2.2.4›
╰─$ aws ec2 describe-instances | jq '.Reservations[].Instances[] | {PublicDnsName, PublicIpAddress, InstanceId}'
{
  "PublicDnsName": "ec2-52-69-244-122.ap-northeast-1.compute.amazonaws.com",
  "PublicIpAddress": "52.69.244.122",
  "InstanceId": "i-9a53f705"
}
{
  "PublicDnsName": "ec2-52-193-41-71.ap-northeast-1.compute.amazonaws.com",
  "PublicIpAddress": "52.193.41.71",
  "InstanceId": "i-d414515b"
}

╭─ymanabe@Yoichiro-no-MacBook-Pro  ~ ‹2.2.4›
This page is at ec2-52-193-41-71.ap-northeast-1.compute.amazonaws.com.
╰─$ ssh -i ~/.ssh/beagle-key-pair-demo.pem ec2-user@ec2-52-193-41-71.ap-northeast-1.compute.amazonaws.com
The authenticity of host 'ec2-52-193-41-71.ap-northeast-1.compute.amazonaws.com (52.193.41.71)' can't be established.
RSA key fingerprint is 51:06:b5:a8:bb:18:b1:13:f0:ef:19:21:49:03:1f:c0.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'ec2-52-193-41-71.ap-northeast-1.compute.amazonaws.com,52.193.41.71' (RSA) to the list of known hosts.

       __|  __|_  )
       _|  (     /   Amazon Linux AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-ami/2016.03-release-notes/
3 package(s) needed for security, out of 4 available
Run "sudo yum update" to apply all updates.
[ec2-user@ip-10-0-1-74 ~]$ sudo yum install -y httpd
[ec2-user@ip-10-0-1-74 ~]$ sudo chkconfig httpd on
[ec2-user@ip-10-0-1-74 ~]$ sudo service httpd start
Starting httpd:                                            [  OK  ]
[ec2-user@ip-10-0-1-74 ~]$ sudo vi /var/www/html/index.html

また、HTTPポートの疎通確認を行いますが、ここは前回の手順と同じため省略します。

以上で、MultiAZ環境でのEC2の構築が完了しました。次回はこれまで構築したEC2を利用してElasticLoadBalancingによる負荷分散を行いたいと思います。

AWSでの環境構築のエントリー全体

AWSでの環境構築は全体で7回に分かれています。このエントリーは6回めになります。

blog.beaglesoft.net

blog.beaglesoft.net

blog.beaglesoft.net

blog.beaglesoft.net

blog.beaglesoft.net

blog.beaglesoft.net

blog.beaglesoft.net