はじめに
- 前の記事で
VPCを利用して複数のAZをまたいだELB環境の構築をManagement Consoleを使って行った - 今回は同じ環境をコマンドラインツールの
awscliを使って構築してみる Management Consoleから設定するのとどっちが楽かって聞かれると返答に困る...すいません
参考
構築する環境
構築する環境は以下の通り。

インスタンスは前回利用したインスタンスを AMI 化したものを利用する。ちなみに、事前に jq をインストールしておくと幸せになれると思います!
やってみよー
awscli を利用するには以下のようなテキストファイルを用意する。
[default] aws_access_key_id=xxxxxxxxxxxxxxxxxx aws_secret_access_key=yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy region=ap-northeast-1
さらに以下のようにしてテキストファイルを環境変数の AWS_CONFIG_FILE に読み込ませる。
export AWS_CONFIG_FILE=${text_file_name}
AMI からインスタンスを起動してみる
インスタンスを起動するあたり以下の情報を手元に用意しておく。(もちろんこれらの情報も awscli で取得しておく)
- SSH キー の名前
- セキュリティグループの ID
VPCサブネットの IDAMIのImageID
SSH キー の名前を確認する
aws ec2 describe-key-pairs | jq '.KeyPairs[].KeyName'
以下のように出力される。
"key1" "key2" "key3"
セキュリティグループの ID と関連付いている VPC の ID を確認する
aws ec2 describe-security-groups | jq '.SecurityGroups[]|{GroupId,GroupName,VpcId}'
以下のように出力される。
{ "VpcId": "vpc-1234567a", "GroupName": "quick-start-8", "GroupId": "sg-1234567a" } { "VpcId": "vpc-1234567b", "GroupName": "test", "GroupId": "sg-1234567b" }
VPC サブネットの ID を取得する
一発で VPC サブネットの ID をすることが出来なかったので、まずは以下のようにして VPC の ID を取得する。
aws ec2 describe-vpcs | jq '.Vpcs[]|select(.State="available")|{VpcId,CidrBlock}'
以下のように出力されるので利用する VPC の ID を確認する。
{ "CidrBlock": "10.0.0.0/16", "VpcId": "vpc-1234567a" } { "CidrBlock": "10.0.0.0/16", "VpcId": "vpc-1234567b" }
今回は vpc-1234567a を利用するので、以下のようにして VPC の ID を指定して SubnetId と AvailabilityZone を確認する。
aws ec2 describe-subnets | jq '.Subnets[]|select(.VpcId=="vpc-1234567a")|{SubnetId,AvailabilityZone}'
以下のように出力されるので...
{ "AvailabilityZone": "ap-northeast-1a", "SubnetId": "subnet-1234567a" } { "AvailabilityZone": "ap-northeast-1a", "SubnetId": "subnet-1234567b" } { "AvailabilityZone": "ap-northeast-1c", "SubnetId": "subnet-1234567c" }
利用したい AvailabilityZone の SubnetId を控えておく。
AMI の ImageID を取得する
aws ec2 describe-images --owners self | jq '.Images[].ImageId'
以下のように AMI の ImageID が出力される。
ami-xxxxxxxx
必要なパラメータを指定するインスタンスを起動する
ということで、以下のような情報を利用してインスタンスを起動する。
| パラメータ | 値 |
|---|---|
| SSH キー の名前 | key1 |
AMI の ImageID |
ami-xxxxxxxx |
VPC の ID |
vpc-1234567a |
VPC サブネット(1)の ID |
subnet-1234567a |
VPC サブネット(1)の AZ |
ap-northeast-1a |
VPC サブネット(2)の ID |
subnet-1234567b |
VPC サブネット(2)の AZ |
ap-northeast-1b |
セキュリティグループの ID |
sg-1234567a |
| セキュリティグループの名前 | test |
インスタンスの起動には ec2 run-instances を利用するので以下のように実行する。
aws ec2 run-instances --image-id ami-xxxxxxxx --count 1 --instance-type t1.micro --key-name key1 --security-group-ids sg-1234567a --subnet-id subnet-1234567a --associate-public-ip-address
もう一つ起動する。
aws ec2 run-instances --image-id ami-xxxxxxxx --count 1 --instance-type t1.micro --key-name key1 --security-group-ids sg-1234567a --subnet-id subnet-1234567b --associate-public-ip-address
起動しているインスタンスを確認してみる。
aws ec2 describe-instances| jq '.Reservations[].Instances[]|select(.State.Name=="running")|{InstanceId}'
以下のようにインスタンスの ID が返ってくる。
{
"InstanceId": "i-123456a"
}
{
"InstanceId": "i-789012a"
}
ELB を作成してインスタンスを関連付ける
以下のような情報で ELB を作成する。
| パラメータ | 値 | 備考(パラメータ名) |
|---|---|---|
ELB の名前 |
hogehuga | |
| 所属するサブネット | subnet-1234567a と subnet-1234567b |
VPC 内のサブネットを指定 |
| 利用するインスタンス | i-123456a と i-789012a |
上記で指定したサブネットに所属するインスタンス |
| 扱うプロトコル | HTTP | Protocol 又は InstanceProtocol |
| 外部公開ポート | 80 | LoadBalancerPort |
| インスタンスでの待受ポート | 8080 | InstancePort |
ELB のセキュリティグループ |
sg-1234567a | --security-groups で指定 |
| ヘルスチェックの PATH | HTTP:8080/index.html |
Target |
| ヘルスチェックの間隔 | 30 sec |
Interval |
| タイムアウト | 5 sec |
Timeout |
| インスタンスが停止していると判断するしきい値 | 2 |
UnhealthyThreshold / 2 回のチェックでレスポンスが無い場合に停止と判断 |
| インスタンスが稼働していると判断するしきい値 | 10 |
healthyThreshold / 10 回のレスポンスチェックで稼働していると判断 |
ELB を作成する
ELB の作成は aws elb create-load-balancer を使って行う。
aws elb create-load-balancer --load-balancer-name hugahuga --listeners Protocol=HTTP,LoadBalancerPort=80,InstanceProtocol=HTTP,InstancePort=8080 --subnets "subnet-20a89c54" "subnet-7f9acd39" --security-groups sg-1234567a
以下のように DNSName がレスポンスとして返ってくる。
{
"DNSName": "hugahuga-xxxxxxxxx.ap-northeast-1.elb.amazonaws.com"
}
ELB の細かい設定を行う
更に作成した ELB のヘルスチェック等の細かい設定は configure-health-check を使う。
aws elb configure-health-check --load-balancer-name hugahuga --health-check Target="HTTP:8080/index.html",Interval=30,Timeout=5,UnhealthyThreshold=2,HealthyThreshold=10
以下のようにレスポンスが返ってくる。
{
"HealthCheck": {
"HealthyThreshold": 10,
"Interval": 30,
"Target": "HTTP:8080/index.html",
"Timeout": 5,
"UnhealthyThreshold": 2
}
}
おお。順調。
ELB にインスタンスを登録する
設定した ELB に対してインスタンスをアタッチ(登録)するには register-instances-with-load-balancer というちょっと長ったらしいサブコマンドを使う。
aws elb register-instances-with-load-balancer --load-balancer-name hugahuga --instances i-123456a i-789012a
以下のようなレスポンスが返ってくる。
{
"Instances": [
{
"InstanceId": "i-123456a"
},
{
"InstanceId": "i-789012a"
}
]
}
とりあえず確認
curl で DNSName にアクセスしてみる。
curl http://hugahuga-xxxxxxxxx.ap-northeast-1.elb.amazonaws.com/
最後に
- リファレンスを片手にチマチマやった感じだと俄然
Management Consoleの方が楽だった - しかし、複数の
ELB環境を構築したりする場合にはawscliは絶大な効力を発揮すると思う - 事前に必要なパラメータを準備、又は取得出来るようなインターフェースがあれば俄然
awscliの楽だと思う - あと、コマンドラインインターフェースを使えば動作の仕組みを理解しながら構築が出来るという点では良いと思う