この記事は公開されてから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で構築します。
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
コマンドを使用します。
asg01
はtarget1
に登録します。
$ 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
asg02
はtarget2
に登録します。
$ 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に向いています。
http://alb01-123456789.ap-northeast-1.elb.amazonaws.com/target/index.html
にアクセスしています。
target2に向いています。
さいごに
Managet ConsoleではAuto Scaling Groupの登録はできませんが、CLIであればALBでもAuto Scalin Groupを登録することができます。
しかし、先日紹介したelastic-load-balancing-toolsではAuto Scalin Groupを移行することができないので、本手順を使用して移行してください。