Application Load Balancer(ALB)でAuto Scaling Groupを登録する(CLIのみ)

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

ウィスキー、シガー、パイプをこよなく愛する大栗です。

先日ALBの発表エントリーを書いたのですが、調査している中でManagement Consoleを見ていてもALBにAuto Scaling Groupを登録する機能が無いように(Auto Scalingも登録で旧ELBしか選択できない)見受けられました。しかし公式ブログには以下のような記載がありAuto Scalingと連携していると書いていました。よく調べてみるとAWS CLIで設定が可能だったので試してみました。(2016年8月15日現在)

アプリケーションロードバランサーはAuto Scaling、Amazon ECS、AWS CloudFormation、AWS CodeDeploy、そしてAWS Certificate Manager (ACM)といった複数のAWSサービスと連携しています。

概要

基本はtarget1へ向いて、/target/*target2へ向く構成をAuto Scaling Groupで構築します。

alb-asg

Auto Scaling Groupを登録する

Launch Configurationを作成する

Launch Configurationを作成します。
まずはas-lc-01を作成します。UserData用のファイルを作成します。

$ cat << EOF > ./target1.txt
> #!/bin/bash
> yum install -y httpd
> echo target1 > /var/www/html/index.html
> curl -s http://169.254.169.254/latest/meta-data/instance-id >> /var/www/html/index.html
> service httpd start
> EOF

Launch Configurationを作成します。

aws autoscaling create-launch-configuration --launch-configuration-name as-lc-01 --image-id ami-374db956 --user-data file://target1.txt --instance-type t2.micro \
  --key-name <KeyName> --security-groups <SerurityGroupName> --iam-instance-profile <RoleName>

次にas-lc-02を作成します。UserData用のファイルを作成します。

$ cat << EOF > ./target2.txt
> #!/bin/bash
> yum install -y httpd
> curl -s http://169.254.169.254/latest/meta-data/instance-id >> /var/www/html/index.html
> echo /target/target2 > /var/www/html/target/index.html
> curl -s http://169.254.169.254/latest/meta-data/instance-id >> /var/www/html/target/index.html
> service httpd start
> EOF

Launch Configurationを作成します。

aws autoscaling create-launch-configuration --launch-configuration-name as-lc-02 --image-id ami-374db956 --user-data file://target2.txt --instance-type t2.micro \
  --key-name <KeyName> --security-groups <SerurityGroupName> --iam-instance-profile <RoleName>

Auto Scaling Groupを作成する

asg01を作成します。これはas-lc-01を使用して作成します。ここで--target-group-arnsオプションを使ってALBのターゲットグループを指定する事もできますが、今回は指定しません。なお、aws autoscaling update-auto-scaling-groupコマンドにはターゲットグループを指定する守オプションがないため一度作成するとAuto Scaling Group側からはALBを指定できません。

aws autoscaling create-auto-scaling-group --auto-scaling-group-name asg01 --launch-configuration-name as-lc-01 --min-size 0 --max-size 4 --desired-capacity 2 \
--vpc-zone-identifier <Sunbent1>,<<Sunbent2>

asg02を作成します。これはas-lc-02を使用して作成します。

aws autoscaling create-auto-scaling-group --auto-scaling-group-name asg02 --launch-configuration-name as-lc-02 --min-size 0 --max-size 4 --desired-capacity 2 \
--vpc-zone-identifier <Sunbent1>,<<Sunbent2>

Target Groupを作成する

ここではインスタンス等が無い空っぽのターゲットグループを作成します。
target1を作成します。

$ aws elbv2 create-target-group --name target1 --protocol HTTP --port 80 --vpc-id <VPC-ID> \
> --health-check-protocol HTTP --health-check-port traffic-port --health-check-path '/index.html'
{
    "TargetGroups": [
        {
            "HealthCheckPath": "/index.html",
            "HealthCheckIntervalSeconds": 30,
            "VpcId": "VPC-ID",
            "Protocol": "HTTP",
            "HealthCheckTimeoutSeconds": 5,
            "HealthCheckProtocol": "HTTP",
            "UnhealthyThresholdCount": 2,
            "HealthyThresholdCount": 5,
            "TargetGroupArn": "arn:aws:elasticloadbalancing:ap-northeast-1:123456789012:targetgroup/target1/12345678abcdefgh",
            "Matcher": {
                "HttpCode": "200"
            },
            "HealthCheckPort": "traffic-port",
            "Port": 80,
            "TargetGroupName": "target1"
        }
    ]
}

target2を作成します。

$ aws elbv2 create-target-group --name target2 --protocol HTTP --port 80 --vpc-id <VPC-ID> \
>  --health-check-protocol HTTP --health-check-port traffic-port --health-check-path '/index.html'
{
    "TargetGroups": [
        {
            "HealthCheckPath": "/index.html",
            "HealthCheckIntervalSeconds": 30,
            "VpcId": "VPC-ID",
            "Protocol": "HTTP",
            "HealthCheckTimeoutSeconds": 5,
            "HealthCheckProtocol": "HTTP",
            "UnhealthyThresholdCount": 2,
            "HealthyThresholdCount": 5,
            "TargetGroupArn": "arn:aws:elasticloadbalancing:ap-northeast-1:123456789012:targetgroup/target2/12345678abcdefgh",
            "Matcher": {
                "HttpCode": "200"
            },
            "HealthCheckPort": "traffic-port",
            "Port": 80,
            "TargetGroupName": "target2"
        }
    ]
}

ALBを作成する

ALBを作成します。

$ aws elbv2 create-load-balancer --name alb01 --scheme internet-facing \
>   --subnets <Subnet1> <Subnet2> --security-groups <SecurityGroup1> <SecurityGroup2>
{
    "LoadBalancers": [
        {
            "VpcId": "vpc-6639da03",
            "LoadBalancerArn": "arn:aws:elasticloadbalancing:ap-northeast-1:123456789012:loadbalancer/app/alb01/12345678abcdefgh",
            "State": {
                "Code": "provisioning"
            },
            "DNSName": "alb01-123456789.ap-northeast-1.elb.amazonaws.com",
            "SecurityGroups": [
                "sg-aaaaaaaa",
                "sg-bbbbbbbb"
            ],
            "LoadBalancerName": "alb01",
            "CreatedTime": "2016-08-14T13:18:59.050Z",
            "Scheme": "internet-facing",
            "Type": "application",
            "CanonicalHostedZoneId": "ABCD1234EFG56",
            "AvailabilityZones": [
                {
                    "SubnetId": "subnet-11111111",
                    "ZoneName": "ap-northeast-1c"
                },
                {
                    "SubnetId": "subnet-22222222",
                    "ZoneName": "ap-northeast-1a"
                }
            ]
        }
    ]
}

Lintenerを作成します。--load-balancer-arnオプションで今作成したALBのARNを指定します。--default-actionsオプションのターゲットグループはtarget1を指定してみます。

$ aws elbv2 create-listener --load-balancer-arn arn:aws:elasticloadbalancing:ap-northeast-1:123456789012:loadbalancer/app/alb01/12345678abcdefgh --protocol HTTP --port 80 \
> --default-actions Type=forward,TargetGroupArn=arn:aws:elasticloadbalancing:ap-northeast-1:123456789012:targetgroup/target1/12345678abcdefgh
{
    "Listeners": [
        {
            "Protocol": "HTTP",
            "DefaultActions": [
                {
                    "TargetGroupArn": "arn:aws:elasticloadbalancing:ap-northeast-1:123456789012:targetgroup/target1/12345678abcdefgh",
                    "Type": "forward"
                }
            ],
            "LoadBalancerArn": "arn:aws:elasticloadbalancing:ap-northeast-1:123456789012:loadbalancer/app/alb01/12345678abcdefgh",
            "Port": 80,
            "ListenerArn": "arn:aws:elasticloadbalancing:ap-northeast-1:123456789012:listener/app/alb01/abcdefgh12345678/12345678abcdefgh"
        }
    ]
}

Ruleを追加します。ここでは/target/*と時にtarget2へ向けます。

$ aws elbv2 create-rule --priority 1 --conditions Field=path-pattern,Values='/target/*' \
> --actions Type=forward,TargetGroupArn=arn:aws:elasticloadbalancing:ap-northeast-1:123456789012:targetgroup/target2/12345678abcdefgh
{
    "Rules": [
        {
            "Priority": "1",
            "Conditions": [
                {
                    "Field": "path-pattern",
                    "Values": [
                        "/target/*"
                    ]
                }
            ],
            "RuleArn": "arn:aws:elasticloadbalancing:ap-northeast-1:123456789012:listener-rule/app/alb01/12345678abcdefgh/abcdefgh12345678/1234abcd5678efgh",
            "IsDefault": false,
            "Actions": [
                {
                    "TargetGroupArn": "arn:aws:elasticloadbalancing:ap-northeast-1:123456789012:targetgroup/target2/12345678abcdefgh",
                    "Type": "forward"
                }
            ]
        }
    ]
}

Auto Scaling Groupを登録します。

ALBへ登録する時にはaws autoscaling attach-load-balancer-target-groupsコマンドを使用します。
asg01target1に登録します。

$ aws autoscaling attach-load-balancer-target-groups --auto-scaling-group-name asg01 \
> --target-group-arns arn:aws:elasticloadbalancing:ap-northeast-1:123456789012:targetgroup/target1/12345678abcdefgh

asg02target2に登録します。

$ aws autoscaling attach-load-balancer-target-groups --auto-scaling-group-name asg02 \
> --target-group-arns arn:aws:elasticloadbalancing:ap-northeast-1:123456789012:targetgroup/target2/12345678abcdefgh

アクセスして確認する

http://alb01-123456789.ap-northeast-1.elb.amazonaws.com/index.htmlにアクセスしています。
target1に向いています。

502_Bad_Gateway

http://alb01-123456789.ap-northeast-1.elb.amazonaws.com/target/index.htmlにアクセスしています。
target2に向いています。

502_Bad_Gateway

さいごに

Managet ConsoleではAuto Scaling Groupの登録はできませんが、CLIであればALBでもAuto Scalin Groupを登録することができます。
しかし、先日紹介したelastic-load-balancing-toolsではAuto Scalin Groupを移行することができないので、本手順を使用して移行してください。