読者です 読者をやめる 読者になる 読者になる

AWSでの環境構築 - EasticLoadBalancingを構成する(7/7)

aws

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

これまでAWSでCLIによる環境構築を行ってきました。今回が最後で負荷分散をおこなうためにElasticLoadBalancingを利用します。ほんの数年前までは開発者はプログラム言語やフレームワークを中心とした世界の住人でした。それが、ロードバランサーを含めたインフラの構築まで行えることが基本となってきたわけです。LBの設定などはインフラチームにお願いとか言っていたことが懐かしいです。

構築するVPC

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

AWS-VPC.png (61.7 kB)

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

blog.beaglesoft.net

前提

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

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

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

ElasticLoadBalancingの作成

VPC内に作成したEC2をロードバランサーで制御するためElasticLoadBalancingを作成します。

ELB用のSecurityGroupを作成する

ELBで利用するSecurityGroupを作成します。今回はHTTPのみアクセス可能とします。

╭─ymanabe@Yoichiro-no-MacBook-Pro  ~ ‹2.2.4›
╰─$ aws ec2 create-security-group  --group-name "bs-elb-demo-demo"  --description  "beaaglesoft security group for elb"  --vpc-id vpc-6a97c20f
{
    "GroupId": "sg-bb67c6df"
}

╭─ymanabe@Yoichiro-no-MacBook-Pro  ~ ‹2.2.4›
╰─$ aws ec2 authorize-security-group-ingress --group-id sg-bb67c6df --protocol tcp --port 80 --cidr 0.0.0.0/0

╭─ymanabe@Yoichiro-no-MacBook-Pro  ~ ‹2.2.4›
╰─$ aws ec2 describe-security-groups --group-id sg-bb67c6df                                                                                                                   2 ↵
{
    "SecurityGroups": [
        {
            "IpPermissionsEgress": [
                {
                    "IpProtocol": "-1",
                    "IpRanges": [
                        {
                            "CidrIp": "0.0.0.0/0"
                        }
                    ],
                    "UserIdGroupPairs": [],
                    "PrefixListIds": []
                }
            ],
            "Description": "beaaglesoft security group for elb",
            "IpPermissions": [
                {
                    "PrefixListIds": [],
                    "FromPort": 80,
                    "IpRanges": [
                        {
                            "CidrIp": "0.0.0.0/0"
                        }
                    ],
                    "ToPort": 80,
                    "IpProtocol": "tcp",
                    "UserIdGroupPairs": []
                }
            ],
            "GroupName": "bs-elb-demo-demo",
            "VpcId": "vpc-6a97c20f",
            "OwnerId": "457499276421",
            "GroupId": "sg-bb67c6df"
        }
    ]
}

ELBを作成する

先ほど作成したSecurityGroupを指定してELBを作成します。

╭─ymanabe@Yoichiro-no-MacBook-Pro  ~ ‹2.2.4›
╰─$ aws elb create-load-balancer --load-balancer-name bs-elb-demo-demo \                                                                                                    255 ↵
--listeners Protocol=HTTP,LoadBalancerPort=80,InstancePort=80 \
--tag Key=NAME,Value=bs-elb-demo-demo \
--subnets subnet-4090d819 subnet-5282b225 \
--security-groups sg-bb67c6df
{
    "DNSName": "bs-elb-demo-demo-1941673232.ap-northeast-1.elb.amazonaws.com"
}

次に、作成したELBにEC2インスタンスを割り当てます。

╭─ymanabe@Yoichiro-no-MacBook-Pro  ~ ‹2.2.4›
╰─$ aws elb register-instances-with-load-balancer \
> --load-balancer-name bs-elb-demo-demo \
> --instances i-d414515b i-9a53f705
{
    "Instances": [
        {
            "InstanceId": "i-d414515b"
        },
        {
            "InstanceId": "i-9a53f705"
        }
    ]
}

ELBへ接続してテストサイトが表示できることの確認

ELBへアクセスしてテストサイトが表示できることを確認します。

╭─ymanabe@Yoichiro-no-MacBook-Pro  ~ ‹2.2.4›
╰─$ aws elb describe-load-balancers --query "LoadBalancerDescriptions[].DNSName"
[
    "bs-elb-demo-demo-1941673232.ap-northeast-1.elb.amazonaws.com"
]

╭─ymanabe@Yoichiro-no-MacBook-Pro  ~ ‹2.2.4›
╰─$ aws elb describe-load-balancers
{
    "LoadBalancerDescriptions": [
        {
            "Subnets": [
                "subnet-4090d819",
                "subnet-5282b225"
            ],
            "CanonicalHostedZoneNameID": "Z2YN17T5R711GT",
            "CanonicalHostedZoneName": "bs-elb-demo-demo-1941673232.ap-northeast-1.elb.amazonaws.com",
            "ListenerDescriptions": [
                {
                    "Listener": {
                        "InstancePort": 80,
                        "LoadBalancerPort": 80,
                        "Protocol": "HTTP",
                        "InstanceProtocol": "HTTP"
                    },
                    "PolicyNames": []
                }
            ],
            "HealthCheck": {
                "HealthyThreshold": 10,
                "Interval": 30,
                "Target": "TCP:80",
                "Timeout": 5,
                "UnhealthyThreshold": 2
            },
            "VPCId": "vpc-6a97c20f",
            "BackendServerDescriptions": [],
            "Instances": [
                {
                    "InstanceId": "i-d414515b"
                },
                {
                    "InstanceId": "i-9a53f705"
                }
            ],
            "DNSName": "bs-elb-demo-demo-1941673232.ap-northeast-1.elb.amazonaws.com",
            "SecurityGroups": [
                "sg-bb67c6df"
            ],
            "Policies": {
                "LBCookieStickinessPolicies": [],
                "AppCookieStickinessPolicies": [],
                "OtherPolicies": []
            },
            "LoadBalancerName": "bs-elb-demo-demo",
            "CreatedTime": "2016-04-03T01:55:40Z",
            "AvailabilityZones": [
                "ap-northeast-1a",
                "ap-northeast-1c"
            ],
            "Scheme": "internet-facing",
            "SourceSecurityGroup": {
                "OwnerAlias": "457499276421",
                "GroupName": "bs-elb-demo-demo"
            }
        }
    ]
}

DNS名称でアクセスした結果下記の通りテストサイトが表示されることを確認します。

screencapture-bs-elb-demo-demo-1941673232-ap-northeast-1-elb-amazonaws-com-1459648979785.png (57.7 kB)

※画面はリロードすることでEC2インスタンスを切り替えて表示されます。

ELBが監視するインスタンスの状態について

ELBが監視するインスタンスの状態はdescribe-instance-healthにより確認できます。取得できる状態は以下のとおりとなっています。

  1. InService
  2. OutOfService
  3. Unknown
╭─ymanabe@Yoichiro-no-MacBook-Pro  ~ ‹2.2.4›
╰─$ aws elb describe-instance-health --load-balancer-name bs-elb-demo-demo
{
    "InstanceStates": [
        {
            "InstanceId": "i-9a53f705",
            "ReasonCode": "N/A",
            "State": "InService",
            "Description": "N/A"
        },
        {
            "InstanceId": "i-d414515b",
            "ReasonCode": "N/A",
            "State": "InService",
            "Description": "N/A"
        }
    ]
}

以上でAWSでEC2をMultiAZで負荷分散して構成することができるようになりました。

本来であれば、この先にRDS都の連携やS3の利用などもあります。ただ、いろいろな環境を構築したり書籍を読めば読むほどVPCをいかに理解するかが基本となっているように思えました。VPCの構築がスムーズに出来ない状態では、EC2とRDSを異なるサブネットで管理するなどということが理解できないのです。

ということで、ここまでで最低限のVPCの構築はできるようになったと思います。これにより、様々なサービスの連携について書籍やドキュメントを紐解くことができるようになったのではないかと思います。

AWSは巨大で複雑です。どこから手を付ければいいかわからなかったのですが、その道筋となってくれたAmazon Web Services パターン別構築・運用ガイドには本当に感謝しています。ありがとうございました。

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

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

blog.beaglesoft.net

blog.beaglesoft.net

blog.beaglesoft.net

blog.beaglesoft.net

blog.beaglesoft.net

blog.beaglesoft.net