AWS Elastic Beanstalk(EB)とAWS Application Load Balancer(ALB)を使って、1インスタンスに複数サイトを構築してみた

2017.03.16

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

コンニチハ、千葉です。

AWS Elastic BeanstalkとAWS Application Load Balancerを使って、1インスタンスに複数サイトを構築してみました。 重要ではないサイト、例えば社内用のサイトは1インスタンスでコスト圧縮したいぜぃのようなことがあるかと思いますので試してみました。

構成

試したのは以下の構成となります。

EBに複数サイトを構成し、ALBのルールによってポートへの振り分けを行ってみました。

※今回は、ALBメインでお話するのでEBのアプリケーションの構成方法についてはふれません

20170316_eb-alb-0

やってみた

デプロイファイルの準備

今回はALBについてのみふれます。まずは、任意のアプリケーションを用意してください。 デプロイ用のアプリケーションを用意し、その配下にALB用のファイルを用意します。

├── .ebextensions
│   ├── alb-access-logs.config
│   ├── alb-listener-rule.config
│   ├── application-load-balancer.config

application-load-balancer.config

ロードバランサーのタイプをALBに設定します

option_settings:
  aws:elasticbeanstalk:environment:
    LoadBalancerType: application

alb-listener-rule.config

リスナーの設定をします。 processというのが、ALBのターゲットにあたります。

processは3つ、defaultとsite2、site3と3つ用意しています。 ルールはそれぞれ、以下のように設定しました。

  • /site2/だったら8081へ流す
  • /site3/だったら8082へ流す

ヘルスチェックもprocessごとに設定しています。また、ヘルスチェックのパラメータは適宜追加ください。

option_settings:
  aws:elbv2:listener:80:
    DefaultProcess: default
    ListenerEnabled: 'true'
    Protocol: HTTP
    Rules: site2, site3
  aws:elasticbeanstalk:environment:process:default:
    DeregistrationDelay: '20'
    HealthCheckInterval: '15'
    HealthCheckPath: /
    HealthCheckTimeout: '5'
    HealthyThresholdCount: '3'
    UnhealthyThresholdCount: '5'
    MatcherHTTPCode: null
    Port: '80'
    Protocol: HTTP
    StickinessEnabled: 'true'
    StickinessLBCookieDuration: '43200'
  aws:elasticbeanstalk:environment:process:site2:
    HealthCheckPath: /site2/index.html
    Port: '8081'
    Protocol: HTTP
  aws:elbv2:listenerrule:site2:
    PathPatterns: /site2/*
    Priority: 1
    Process: site2
  aws:elasticbeanstalk:environment:process:site3:
    HealthCheckPath: /site3/index.html
    Port: '8082'
    Protocol: HTTP
  aws:elbv2:listenerrule:site3:
    PathPatterns: /site3/*
    Priority: 2
    Process: site3

alb-access-logs.config

ALBのログをS3へ保存する設定です。※S3側のバケットポリシーの設定は別途やっておきましょう。

option_settings:
  aws:elbv2:loadbalancer:
    AccessLogsS3Bucket: chiba-elb-logs
    AccessLogsS3Enabled: 'true'

EB環境の構築

EB CLIから実行します。

まずは、EB CLIを最新にします。

local$ pip install -U awsebcli
local$ eb --version
EB CLI 3.10.0 (Python 2.7.1)

ebの初期設定をします。カスタムプラットフォームを選択していますが、適宜環境に合わせて設定してください。 ※アクセスキーなどは事前に設定ください

local$ eb init

Select a default region
1) us-east-1 : US East (N. Virginia)
2) us-west-1 : US West (N. California)
3) us-west-2 : US West (Oregon)
4) eu-west-1 : EU (Ireland)
5) eu-central-1 : EU (Frankfurt)
6) ap-south-1 : Asia Pacific (Mumbai)
7) ap-southeast-1 : Asia Pacific (Singapore)
8) ap-southeast-2 : Asia Pacific (Sydney)
9) ap-northeast-1 : Asia Pacific (Tokyo)
10) ap-northeast-2 : Asia Pacific (Seoul)
11) sa-east-1 : South America (Sao Paulo)
12) cn-north-1 : China (Beijing)
13) us-east-2 : US East (Ohio)
14) ca-central-1 : Canada (Central)
15) eu-west-2 : EU (London)
(default is 3): 9

Select an application to use
1) NodeSampleApp2
2) NodeSampleApp
3) Custom Platform Builder
4) [ Create new Application ]
(default is 2): 1

It appears you are using Node.js. Is this correct?
(Y/n): n

Select a platform.
1) Node.js
2) PHP
3) Python
4) Ruby
5) Tomcat
6) IIS
7) Docker
8) Multi-container Docker
9) GlassFish
10) Go
11) Java
12) Packer
13) Custom Platform
(default is 1): 13

Select a platform.
1) packer-test2 (Owned by: 124065042373)
2) packer-test  (Owned by: 124065042373)
(default is 1): 1
Do you want to set up SSH for your instances?
(Y/n): Y

Select a keypair.
1) aws-eb
2) sss-keyxxxx
(default is 5): 2

eb環境を作成します。ロードバランサーのタイプでALBを指定します。

local$ eb create
Enter Environment Name
(default is NodeSampleApp2-dev):
Enter DNS CNAME prefix
(default is NodeSampleApp2-dev):

Select a load balancer type
1) classic
2) application
(default is 1): 2
...省略

環境の確認

無事作成できたので環境の確認をします。

ALBの設定。「aws:elasticbeanstalk:environment:process」で設定した内容がターゲットグループに反映されています。

20170316_eb-alb-1

「aws:elbv2:listenerrule」で設定した内容が、ALBのリスナールールに設定されています。

20170316_eb-alb-2

EBのダッシュボード上はヘルスになってます。

20170316_eb-alb-3

試しに、site2のヘルスチェックをエラーにしてみました。

20170316_eb-alb-4

エラーになりました。メールも通知されました。

20170316_eb-alb-5

最後に

1インスタンスに複数サイトを設定できるようになるので、利用頻度が少ないサイトを1インスタンスに集約することでコスト削減もできるかなと思います。 参考になればと思います!

参考

http://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/environments-cfg-applicationloadbalancer.html