はじめに
- 前の記事で
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
の楽だと思う - あと、コマンドラインインターフェースを使えば動作の仕組みを理解しながら構築が出来るという点では良いと思う