この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
コンニチハ、千葉です。
AWS Elastic BeanstalkとAWS Application Load Balancerを使って、1インスタンスに複数サイトを構築してみました。 重要ではないサイト、例えば社内用のサイトは1インスタンスでコスト圧縮したいぜぃのようなことがあるかと思いますので試してみました。
構成
試したのは以下の構成となります。
EBに複数サイトを構成し、ALBのルールによってポートへの振り分けを行ってみました。
※今回は、ALBメインでお話するのでEBのアプリケーションの構成方法についてはふれません
やってみた
デプロイファイルの準備
今回は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」で設定した内容がターゲットグループに反映されています。
「aws:elbv2:listenerrule」で設定した内容が、ALBのリスナールールに設定されています。
EBのダッシュボード上はヘルスになってます。
試しに、site2のヘルスチェックをエラーにしてみました。
エラーになりました。メールも通知されました。
最後に
1インスタンスに複数サイトを設定できるようになるので、利用頻度が少ないサイトを1インスタンスに集約することでコスト削減もできるかなと思います。 参考になればと思います!